summaryrefslogtreecommitdiffstats
path: root/toolkit/jetpack/sdk/l10n/properties/core.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/jetpack/sdk/l10n/properties/core.js')
-rw-r--r--toolkit/jetpack/sdk/l10n/properties/core.js87
1 files changed, 87 insertions, 0 deletions
diff --git a/toolkit/jetpack/sdk/l10n/properties/core.js b/toolkit/jetpack/sdk/l10n/properties/core.js
new file mode 100644
index 000000000..7a9081d0b
--- /dev/null
+++ b/toolkit/jetpack/sdk/l10n/properties/core.js
@@ -0,0 +1,87 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const { Cu } = require("chrome");
+const { newURI } = require('../../url/utils')
+const { getRulesForLocale } = require("../plural-rules");
+const { getPreferedLocales } = require('../locale');
+const { rootURI } = require("@loader/options");
+const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
+
+const baseURI = rootURI + "locale/";
+const preferedLocales = getPreferedLocales(true);
+
+// Make sure we don't get stale data after an update
+// (See Bug 1300735 for rationale).
+Services.strings.flushBundles();
+
+function getLocaleURL(locale) {
+ // if the locale is a valid chrome URI, return it
+ try {
+ let uri = newURI(locale);
+ if (uri.scheme == 'chrome')
+ return uri.spec;
+ }
+ catch(_) {}
+ // otherwise try to construct the url
+ return baseURI + locale + ".properties";
+}
+
+function getKey(locale, key) {
+ let bundle = Services.strings.createBundle(getLocaleURL(locale));
+ try {
+ return bundle.GetStringFromName(key) + "";
+ }
+ catch (_) {}
+ return undefined;
+}
+
+function get(key, n, locales) {
+ // try this locale
+ let locale = locales.shift();
+ let localized;
+
+ if (typeof n == 'number') {
+ if (n == 0) {
+ localized = getKey(locale, key + '[zero]');
+ }
+ else if (n == 1) {
+ localized = getKey(locale, key + '[one]');
+ }
+ else if (n == 2) {
+ localized = getKey(locale, key + '[two]');
+ }
+
+ if (!localized) {
+ // Retrieve the plural mapping function
+ let pluralForm = (getRulesForLocale(locale.split("-")[0].toLowerCase()) ||
+ getRulesForLocale("en"))(n);
+ localized = getKey(locale, key + '[' + pluralForm + ']');
+ }
+
+ if (!localized) {
+ localized = getKey(locale, key + '[other]');
+ }
+ }
+
+ if (!localized) {
+ localized = getKey(locale, key);
+ }
+
+ if (!localized) {
+ localized = getKey(locale, key + '[other]');
+ }
+
+ if (localized) {
+ return localized;
+ }
+
+ // try next locale
+ if (locales.length)
+ return get(key, n, locales);
+
+ return undefined;
+}
+exports.get = (k, n) => get(k, n, Array.slice(preferedLocales));