1

Firefox アドオンを開発しています。ユーザーのブラウザで設定されている言語を特定する必要があります。ブラウザの現在のロケールを含む の
ようなオブジェクトはありますか?window.navigator

4

2 に答える 2

4

ロケールにアクセスする方法

Use window.navigator:
他にも何かあるかもしれませんが、そのまま使用できますwindow.navigator

navigatorオブジェクトは、windowコンテンツに関連付けられたオブジェクト (つまり、ブラウザの XUL ではないオブジェクト) でのみ使用できますwindow。ただし、コンテンツ スクリプトからアクセスする必要がある場合でも、オブジェクトはすべての拡張タイプで使用できます。

  • WebExtensions : コンテンツ スクリプトからアクセスする必要があります。
  • window.navigatorその他のすべてのタイプ:マルチプロセス Firefox でも、メイン/バックグラウンド スクリプトからアクセスできます。拡張機能ではいつものように、正しい<window>オブジェクトを使用する必要があります。すべての<window>オブジェクトにnavigatorプロパティがあるわけではありません。

Firefox の設定を取得する:
ただし、1 つは設定general.useragent.localeまたはおそらくintl.accept_languages. 作成しているアドオンの種類によって、これにアクセスする方法、または現在利用できるかどうかが決まります。

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);
于 2016-08-06T14:49:22.897 に答える
2

@Maykenの答えは素晴らしいです。追加したいだけですが、navigatorなしwindowで取得することも、WebWorkers またはChromeWorkers で取得することもできます。

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Functions_and_classes_available_to_workers#workerscope

ナビゲーター情報を取得するためだけにワーカーを起動することはお勧めしません。おそらく使いやすいでしょうがServices.appshell.hiddenDOMWindow、すでにワーカーを使用している場合は、はい、それは良い解決策です。

于 2016-08-08T09:41:13.730 に答える