Firefox アドオンを開発しています。ユーザーのブラウザで設定されている言語を特定する必要があります。ブラウザの現在のロケールを含む の
ようなオブジェクトはありますか?window.navigator
2 に答える
ロケールにアクセスする方法
Use window.navigator
:
他にも何かあるかもしれませんが、そのまま使用できますwindow.navigator
。
navigator
オブジェクトは、window
コンテンツに関連付けられたオブジェクト (つまり、ブラウザの XUL ではないオブジェクト) でのみ使用できますwindow
。ただし、コンテンツ スクリプトからアクセスする必要がある場合でも、オブジェクトはすべての拡張タイプで使用できます。
- WebExtensions : コンテンツ スクリプトからアクセスする必要があります。
window.navigator
その他のすべてのタイプ:マルチプロセス Firefox でも、メイン/バックグラウンド スクリプトからアクセスできます。拡張機能ではいつものように、正しい<window>
オブジェクトを使用する必要があります。すべての<window>
オブジェクトにnavigator
プロパティがあるわけではありません。
Firefox の設定を取得する:
ただし、1 つは設定general.useragent.locale
またはおそらくintl.accept_languages
. 作成しているアドオンの種類によって、これにアクセスする方法、または現在利用できるかどうかが決まります。
- アドオン SDK拡張機能は、 を使用してそれらにアクセスできます
preferences/service
。 - Bootstrapまたはレガシーアドオンは を使用できます。これにより、 nsIPrefBranch、nsIPrefBranch2、およびnsIPrefService
Services.prefs
にアクセスできます。 - 現時点では、WebExtensionsは設定にアクセスできないようです。環境設定が Firefox にとっていかに重要であるかを考えると、それらはおそらく将来利用可能になるでしょう。
ChromeWindow での使用getLocale()
: stkvtflw で述べられているように、メインの ChromeWindow
でも使用できます。PanelUIgetLocale()
( sdk/panelと混同しないでください) には function が含まれています。ただし、この関数の公式ドキュメントはないようです。そのコードは次のとおりです。getLocale()
function getLocale() {
try {
let chromeRegistry = Cc["@mozilla.org/chrome/chrome-registry;1"]
.getService(Ci.nsIXULChromeRegistry);
return chromeRegistry.getSelectedLocale("browser");
} catch (ex) {
return "en-US";
}
}
明らかに、これはnsIXULChromeRegistry
、必要に応じてサービスを直接使用できることを示しています。このサービスの公式ドキュメントもないようです。
WebExtensions 固有の方法:
WebExtensions にはInternationalization APIがあり、バックグラウンド スクリプトから利用できます。ローカルは を使用して利用できますi18n.getUILanguage()
。その方法i18n.getAcceptLanguages()
も興味深いかもしれません。
WebExtensions アドオンの完全なコード
main.js
let locale = chrome.i18n.getUILanguage();
console.log('The locale is: ' + locale);
マニフェスト.json
{
"description": "Log the locale to the console",
"manifest_version": 2,
"name": "log_locale",
"version": "0.1",
"applications": {
"gecko": {
"id": "extention@stick.man",
"strict_min_version": "45.0"
}
},
"background": {
"scripts": ["main.js"]
}
}
アドオン SDK 拡張機能の完全なコード
index.js :
//Get the window.navigator from current window/tab
//Get the currently active Browser Window
let activeWindow = require('sdk/window/utils').getMostRecentBrowserWindow();
//activeWindow.document.defaultView is the <window> you want to use
let defaultViewNavigator = activeWindow.document.defaultView.navigator;
//log the language from window.navigator
console.log('navigator language='+defaultViewNavigator.language);
//Get the locale from preferences:
let prefs = require("sdk/preferences/service");
let langFromPref = prefs.get(`general.useragent.locale`);
console.log('language from prefs='+langFromPref);
//Get the locale using getLocale():
let localeGet = require("sdk/window/utils").getMostRecentBrowserWindow().getLocale()
console.log('getLocale language='+localeGet);
パッケージ.json :
{
"title": "Find locale",
"name": "find_local",
"version": "0.0.1",
"description": "Find the locale",
"main": "index.js",
"author": "Makyen",
"engines": {
"firefox": ">=38.0a1",
"fennec": ">=38.0a1"
},
"license": "MIT",
"keywords": [
"jetpack"
]
}
ブートストラップ/レガシー アドオンのコード
//Import Services
Components.utils.import("resource://gre/modules/Services.jsm");
//Get the currently active Browser Window
let activeWindow=Services.wm.getMostRecentWindow("navigator:browser");
//Get the window.navigator from current window/tab
//activeWindow.document.defaultView is the <window> you want to use
let defaultViewNavigator = activeWindow.document.defaultView.navigator;
console.log('navigator language='+defaultViewNavigator.language);
//Get the locale from preferences:
let langFromPref = Services.prefs.getCharPref(`general.useragent.locale`);
console.log('language from prefs='+langFromPref);
//Get the locale using getLocale():
let localeGet = activeWindow.getLocale()
console.log('getLocale language='+localeGet);
@Maykenの答えは素晴らしいです。追加したいだけですが、navigator
なしwindow
で取得することも、WebWorker
s またはChromeWorker
s で取得することもできます。
ナビゲーター情報を取得するためだけにワーカーを起動することはお勧めしません。おそらく使いやすいでしょうがServices.appshell.hiddenDOMWindow
、すでにワーカーを使用している場合は、はい、それは良い解決策です。