From 5168a7f16b87296eacaea85e663b7744fcb508ca Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Tue, 24 May 2016 16:34:06 +0100 Subject: [PATCH 01/12] Add build-locales script --- bin/build-locales | 71 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 72 insertions(+) create mode 100755 bin/build-locales diff --git a/bin/build-locales b/bin/build-locales new file mode 100755 index 00000000000..46cf5911bc4 --- /dev/null +++ b/bin/build-locales @@ -0,0 +1,71 @@ +#!/usr/bin/env node +/* eslint-disable no-var, no-console */ +// We can't use strict mode because po2json causes +// referenceErrors. + + +const fs = require('fs'); +const os = require('os'); +const path = require('path'); +const config = require('config'); +const po2json = require('po2json'); +const glob = require('glob'); +const shelljs = require('shelljs'); +const chalk = require('chalk'); + +const appName = config.get('appName'); + +if (!appName) { + console.log( + chalk.red('Please specify the appName with NODE_APP_INSTANCE')); + process.exit(1); +} + +function createLockFile(lockFilePath) { + const fd = fs.openSync(lockFilePath, 'w'); + fs.closeSync(fd); +} + +function removeLockFile(lockFilePath) { + fs.unlinkSync(lockFilePath); +} + +function lockFileExists(lockFilePath) { + var fileExists = false; + try { + fs.statSync(lockFilePath); + fileExists = true; + } catch (e) { + if (e.code !== 'ENOENT') { + throw e; + } + } + return fileExists; +} + +const lockFileName = `${appName}-build-locales.lock`; +const lockFilePath = path.join(os.tmpdir(), lockFileName); +const localeDir = path.join(__dirname, '../locale'); +const poFiles = glob.sync(`${localeDir}/**/${appName}.po`); +const dest = path.join(__dirname, '../src/locale/'); + +if (lockFileExists(lockFilePath)) { + throw new Error(`Lock file exists at: ${lockFilePath} Aborting!`); +} + +createLockFile(lockFilePath); + +try { + poFiles.forEach((pofile) => { + const dir = path.dirname(pofile); + const subdir = path.dirname(dir); + const locale = path.basename(subdir); + const stem = path.basename(pofile, '.po'); + const jsonfile = path.join(dest, locale, `${stem}.json`); + shelljs.mkdir('-p', path.join(dest, locale)); + const json = po2json.parseFileSync(pofile, { stringify: true, pretty: true, format: 'jed1.x' }); + fs.writeFileSync(jsonfile, json); + }); +} finally { + removeLockFile(lockFilePath); +} diff --git a/package.json b/package.json index e06a0e9ba36..fd77746faa6 100644 --- a/package.json +++ b/package.json @@ -186,6 +186,7 @@ "karma-webpack": "1.7.0", "mocha": "2.4.5", "node-sass": "3.7.0", + "po2json": "0.4.2", "react-addons-test-utils": "15.0.2", "react-dom": "15.0.2", "react-hot-loader": "1.3.0", From 8f32be8b98b60bbbf2dfb73acf7502d8bfff1f9e Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Wed, 25 May 2016 13:40:32 +0100 Subject: [PATCH 02/12] Actually build locales as json --- config/default.js | 23 +++- locale/{dbg => dbl}/LC_MESSAGES/disco.po | 0 locale/dbl/LC_MESSAGES/search.po | 129 +++++++++++++++++++ locale/{dbg_rtl => dbr}/LC_MESSAGES/disco.po | 0 locale/dbr/LC_MESSAGES/search.po | 129 +++++++++++++++++++ src/locale/af/disco.json | 36 ++++++ src/locale/af/search.json | 94 ++++++++++++++ src/locale/ar/disco.json | 36 ++++++ src/locale/ar/search.json | 94 ++++++++++++++ src/locale/bg/disco.json | 36 ++++++ src/locale/bg/search.json | 94 ++++++++++++++ src/locale/bn_BD/disco.json | 36 ++++++ src/locale/bn_BD/search.json | 94 ++++++++++++++ src/locale/ca/disco.json | 36 ++++++ src/locale/ca/search.json | 94 ++++++++++++++ src/locale/cs/disco.json | 36 ++++++ src/locale/cs/search.json | 95 ++++++++++++++ src/locale/da/disco.json | 36 ++++++ src/locale/da/search.json | 94 ++++++++++++++ src/locale/dbl/disco.json | 35 +++++ src/locale/dbl/search.json | 93 +++++++++++++ src/locale/dbr/disco.json | 35 +++++ src/locale/dbr/search.json | 93 +++++++++++++ src/locale/de/disco.json | 36 ++++++ src/locale/de/search.json | 94 ++++++++++++++ src/locale/el/disco.json | 36 ++++++ src/locale/el/search.json | 94 ++++++++++++++ src/locale/en_GB/disco.json | 36 ++++++ src/locale/en_GB/search.json | 94 ++++++++++++++ src/locale/en_US/disco.json | 36 ++++++ src/locale/en_US/search.json | 94 ++++++++++++++ src/locale/es/disco.json | 36 ++++++ src/locale/es/search.json | 94 ++++++++++++++ src/locale/eu/disco.json | 36 ++++++ src/locale/eu/search.json | 94 ++++++++++++++ src/locale/fa/disco.json | 36 ++++++ src/locale/fa/search.json | 94 ++++++++++++++ src/locale/fi/disco.json | 36 ++++++ src/locale/fi/search.json | 94 ++++++++++++++ src/locale/fr/disco.json | 36 ++++++ src/locale/fr/search.json | 94 ++++++++++++++ src/locale/ga_IE/disco.json | 36 ++++++ src/locale/ga_IE/search.json | 95 ++++++++++++++ src/locale/he/disco.json | 36 ++++++ src/locale/he/search.json | 94 ++++++++++++++ src/locale/hu/disco.json | 36 ++++++ src/locale/hu/search.json | 94 ++++++++++++++ src/locale/id/disco.json | 36 ++++++ src/locale/id/search.json | 94 ++++++++++++++ src/locale/it/disco.json | 36 ++++++ src/locale/it/search.json | 94 ++++++++++++++ src/locale/ja/disco.json | 36 ++++++ src/locale/ja/search.json | 93 +++++++++++++ src/locale/ko/disco.json | 36 ++++++ src/locale/ko/search.json | 93 +++++++++++++ src/locale/mk/disco.json | 36 ++++++ src/locale/mk/search.json | 94 ++++++++++++++ src/locale/mn/disco.json | 36 ++++++ src/locale/mn/search.json | 94 ++++++++++++++ src/locale/nl/disco.json | 36 ++++++ src/locale/nl/search.json | 94 ++++++++++++++ src/locale/pl/disco.json | 36 ++++++ src/locale/pl/search.json | 95 ++++++++++++++ src/locale/pt_BR/disco.json | 36 ++++++ src/locale/pt_BR/search.json | 94 ++++++++++++++ src/locale/pt_PT/disco.json | 36 ++++++ src/locale/pt_PT/search.json | 94 ++++++++++++++ src/locale/ro/disco.json | 36 ++++++ src/locale/ro/search.json | 95 ++++++++++++++ src/locale/ru/disco.json | 36 ++++++ src/locale/ru/search.json | 95 ++++++++++++++ src/locale/sk/disco.json | 36 ++++++ src/locale/sk/search.json | 95 ++++++++++++++ src/locale/sl/disco.json | 36 ++++++ src/locale/sl/search.json | 96 ++++++++++++++ src/locale/sq/disco.json | 36 ++++++ src/locale/sq/search.json | 94 ++++++++++++++ src/locale/sv_SE/disco.json | 36 ++++++ src/locale/sv_SE/search.json | 94 ++++++++++++++ src/locale/uk/disco.json | 36 ++++++ src/locale/uk/search.json | 95 ++++++++++++++ src/locale/vi/disco.json | 36 ++++++ src/locale/vi/search.json | 93 +++++++++++++ src/locale/zh_CN/disco.json | 36 ++++++ src/locale/zh_CN/search.json | 94 ++++++++++++++ src/locale/zh_TW/disco.json | 36 ++++++ src/locale/zh_TW/search.json | 94 ++++++++++++++ 87 files changed, 5611 insertions(+), 2 deletions(-) rename locale/{dbg => dbl}/LC_MESSAGES/disco.po (100%) create mode 100644 locale/dbl/LC_MESSAGES/search.po rename locale/{dbg_rtl => dbr}/LC_MESSAGES/disco.po (100%) create mode 100644 locale/dbr/LC_MESSAGES/search.po create mode 100644 src/locale/af/disco.json create mode 100644 src/locale/af/search.json create mode 100644 src/locale/ar/disco.json create mode 100644 src/locale/ar/search.json create mode 100644 src/locale/bg/disco.json create mode 100644 src/locale/bg/search.json create mode 100644 src/locale/bn_BD/disco.json create mode 100644 src/locale/bn_BD/search.json create mode 100644 src/locale/ca/disco.json create mode 100644 src/locale/ca/search.json create mode 100644 src/locale/cs/disco.json create mode 100644 src/locale/cs/search.json create mode 100644 src/locale/da/disco.json create mode 100644 src/locale/da/search.json create mode 100644 src/locale/dbl/disco.json create mode 100644 src/locale/dbl/search.json create mode 100644 src/locale/dbr/disco.json create mode 100644 src/locale/dbr/search.json create mode 100644 src/locale/de/disco.json create mode 100644 src/locale/de/search.json create mode 100644 src/locale/el/disco.json create mode 100644 src/locale/el/search.json create mode 100644 src/locale/en_GB/disco.json create mode 100644 src/locale/en_GB/search.json create mode 100644 src/locale/en_US/disco.json create mode 100644 src/locale/en_US/search.json create mode 100644 src/locale/es/disco.json create mode 100644 src/locale/es/search.json create mode 100644 src/locale/eu/disco.json create mode 100644 src/locale/eu/search.json create mode 100644 src/locale/fa/disco.json create mode 100644 src/locale/fa/search.json create mode 100644 src/locale/fi/disco.json create mode 100644 src/locale/fi/search.json create mode 100644 src/locale/fr/disco.json create mode 100644 src/locale/fr/search.json create mode 100644 src/locale/ga_IE/disco.json create mode 100644 src/locale/ga_IE/search.json create mode 100644 src/locale/he/disco.json create mode 100644 src/locale/he/search.json create mode 100644 src/locale/hu/disco.json create mode 100644 src/locale/hu/search.json create mode 100644 src/locale/id/disco.json create mode 100644 src/locale/id/search.json create mode 100644 src/locale/it/disco.json create mode 100644 src/locale/it/search.json create mode 100644 src/locale/ja/disco.json create mode 100644 src/locale/ja/search.json create mode 100644 src/locale/ko/disco.json create mode 100644 src/locale/ko/search.json create mode 100644 src/locale/mk/disco.json create mode 100644 src/locale/mk/search.json create mode 100644 src/locale/mn/disco.json create mode 100644 src/locale/mn/search.json create mode 100644 src/locale/nl/disco.json create mode 100644 src/locale/nl/search.json create mode 100644 src/locale/pl/disco.json create mode 100644 src/locale/pl/search.json create mode 100644 src/locale/pt_BR/disco.json create mode 100644 src/locale/pt_BR/search.json create mode 100644 src/locale/pt_PT/disco.json create mode 100644 src/locale/pt_PT/search.json create mode 100644 src/locale/ro/disco.json create mode 100644 src/locale/ro/search.json create mode 100644 src/locale/ru/disco.json create mode 100644 src/locale/ru/search.json create mode 100644 src/locale/sk/disco.json create mode 100644 src/locale/sk/search.json create mode 100644 src/locale/sl/disco.json create mode 100644 src/locale/sl/search.json create mode 100644 src/locale/sq/disco.json create mode 100644 src/locale/sq/search.json create mode 100644 src/locale/sv_SE/disco.json create mode 100644 src/locale/sv_SE/search.json create mode 100644 src/locale/uk/disco.json create mode 100644 src/locale/uk/search.json create mode 100644 src/locale/vi/disco.json create mode 100644 src/locale/vi/search.json create mode 100644 src/locale/zh_CN/disco.json create mode 100644 src/locale/zh_CN/search.json create mode 100644 src/locale/zh_TW/disco.json create mode 100644 src/locale/zh_TW/search.json diff --git a/config/default.js b/config/default.js index 326c54b482b..693f43e373b 100644 --- a/config/default.js +++ b/config/default.js @@ -27,6 +27,9 @@ module.exports = { client: false, server: true, + // Disables the server side render, handy for debugging. + disableSSR: false, + // 2592000 is 30 days in seconds. cookieMaxAge: 2592000, cookieName: 'jwt_api_auth_token', @@ -58,8 +61,12 @@ module.exports = { 'cookieName', 'cookieMaxAge', 'cookieSecure', + 'defaultLang', 'isDeployed', 'isDevelopment', + 'langs', + 'langMap', + 'rtlLangs', ], // Content Security Policy. @@ -112,10 +119,22 @@ module.exports = { action: 'deny', }, - supportedLocales: [ - 'af', 'ar', 'bg', 'bn-BD', 'ca', 'cs', 'da', 'de', 'dbg', 'dbg-rtl', 'el', + // Supported languages. + langs: [ + 'af', 'ar', 'bg', 'bn-BD', 'ca', 'cs', 'da', 'de', 'dbl', 'dbr', 'el', 'en-GB', 'en-US', 'es', 'eu', 'fa', 'fi', 'fr', 'ga-IE', 'he', 'hu', 'id', 'it', 'ja', 'ko', 'mk', 'mn', 'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sk', 'sl', 'sq', 'sv-SE', 'uk', 'vi', 'zh-CN', 'zh-TW', ], + // Map of short langs to longer ones. + langMap: { + en: 'en-US', + ga: 'ga-IE', + pt: 'pt-PT', + sv: 'sv-SE', + zh: 'zh-CN', + }, + rtlLangs: ['ar', 'dbr', 'fa', 'he'], + defaultLang: 'en-US', + localeDir: path.resolve(path.join(__dirname, '../locale')), }; diff --git a/locale/dbg/LC_MESSAGES/disco.po b/locale/dbl/LC_MESSAGES/disco.po similarity index 100% rename from locale/dbg/LC_MESSAGES/disco.po rename to locale/dbl/LC_MESSAGES/disco.po diff --git a/locale/dbl/LC_MESSAGES/search.po b/locale/dbl/LC_MESSAGES/search.po new file mode 100644 index 00000000000..dc2e26bf7bb --- /dev/null +++ b/locale/dbl/LC_MESSAGES/search.po @@ -0,0 +1,129 @@ +msgid "" +msgstr "" +"Project-Id-Version: search\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2016-05-20 14:41+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"Content-Type: text/plain; charset=utf-8\n" + +#: src/core/components/LoginPage/index.js:13 +msgid "Login Required" +msgstr "Ŀǿɠīƞ Řḗɋŭīřḗḓ" + +#: src/core/components/LoginPage/index.js:20 +msgid "You must be logged in to access this page." +msgstr "Ẏǿŭ ḿŭşŧ ƀḗ ŀǿɠɠḗḓ īƞ ŧǿ ȧƈƈḗşş ŧħīş ƥȧɠḗ." + +#: src/core/components/LoginPage/index.js:24 +msgid "Login" +msgstr "Ŀǿɠīƞ" + +#: src/core/components/NotFound.js:8 +msgid "We're sorry, but we can't find what you're looking for." +msgstr "Ẇḗ'řḗ şǿřřẏ, ƀŭŧ ẇḗ ƈȧƞ'ŧ ƒīƞḓ ẇħȧŧ ẏǿŭ'řḗ ŀǿǿķīƞɠ ƒǿř." + +#: src/core/components/NotFound.js:9 +msgid "" +"The page or file you requested wasn't found on our site. It's possible that " +"you\n" +"clicked a link that's out of date, or typed in the address incorrectly." +msgstr "" +"Ŧħḗ ƥȧɠḗ ǿř ƒīŀḗ ẏǿŭ řḗɋŭḗşŧḗḓ ẇȧşƞ'ŧ ƒǿŭƞḓ ǿƞ ǿŭř şīŧḗ. Īŧ'ş ƥǿşşīƀŀḗ ŧħȧŧ " +"ẏǿŭ\n" +"ƈŀīƈķḗḓ ȧ ŀīƞķ ŧħȧŧ'ş ǿŭŧ ǿƒ ḓȧŧḗ, ǿř ŧẏƥḗḓ īƞ ŧħḗ ȧḓḓřḗşş īƞƈǿřřḗƈŧŀẏ." + +#: src/core/containers/HandleLogin/index.js:41 +msgid "Logging you in..." +msgstr "Ŀǿɠɠīƞɠ ẏǿŭ īƞ..." + +#: src/core/containers/HandleLogin/index.js:45 +msgid "There was an error logging you in, please try again." +msgstr "Ŧħḗřḗ ẇȧş ȧƞ ḗřřǿř ŀǿɠɠīƞɠ ẏǿŭ īƞ, ƥŀḗȧşḗ ŧřẏ ȧɠȧīƞ." + +#: src/search/components/SearchForm.js:30 +msgid "Search" +msgstr "Şḗȧřƈħ" + +#: src/search/components/SearchPage.js:29 +msgid "Add-on Search" +msgstr "Ȧḓḓ-ǿƞ Şḗȧřƈħ" + +#: src/search/components/SearchResult/index.js:18 +msgid "%(count)s file" +msgid_plural "%(count)s files" +msgstr[0] "%(count)s ƒīŀḗ" +msgstr[1] "%(count)s ƒīŀḗş" + +#: src/search/components/SearchResults.js:32 +msgid "Your search for \"%(query)s\" returned %(count)s results." +msgstr "Ẏǿŭř şḗȧřƈħ ƒǿř \"%(query)s\" řḗŧŭřƞḗḓ %(count)s řḗşŭŀŧş." + +#: src/search/components/SearchResults.js:39 +msgid "Searching..." +msgstr "Şḗȧřƈħīƞɠ..." + +#: src/search/components/SearchResults.js:41 +msgid "No results were found for \"%(query)s\"." +msgstr "Ƞǿ řḗşŭŀŧş ẇḗřḗ ƒǿŭƞḓ ƒǿř \"%(query)s\"." + +#: src/search/components/SearchResults.js:43 +msgid "Please supply a valid search" +msgstr "Ƥŀḗȧşḗ şŭƥƥŀẏ ȧ ṽȧŀīḓ şḗȧřƈħ" + +#: src/search/containers/AddonPage/index.js:108 +msgid "Attributes" +msgstr "Ȧŧŧřīƀŭŧḗş" + +#: src/search/containers/AddonPage/index.js:110 +msgid "Tags" +msgstr "Ŧȧɠş" + +#: src/search/containers/AddonPage/index.js:31 +msgid "View on editors" +msgstr "Ṽīḗẇ ǿƞ ḗḓīŧǿřş" + +#: src/search/containers/AddonPage/index.js:35 +msgid "View homepage" +msgstr "Ṽīḗẇ ħǿḿḗƥȧɠḗ" + +#: src/search/containers/AddonPage/index.js:41 +msgid "Email support" +msgstr "Ḗḿȧīŀ şŭƥƥǿřŧ" + +#: src/search/containers/AddonPage/index.js:47 +msgid "View support site" +msgstr "Ṽīḗẇ şŭƥƥǿřŧ şīŧḗ" + +#: src/search/containers/AddonPage/index.js:70 +msgid "Current version" +msgstr "Ƈŭřřḗƞŧ ṽḗřşīǿƞ" + +#: src/search/containers/AddonPage/index.js:73 +msgid "View on site" +msgstr "Ṽīḗẇ ǿƞ şīŧḗ" + +#: src/search/containers/AddonPage/index.js:74 +msgid "Edit on site" +msgstr "Ḗḓīŧ ǿƞ şīŧḗ" + +#: src/search/containers/AddonPage/index.js:76 +msgid "Files" +msgstr "Ƒīŀḗş" + +#: src/search/containers/AddonPage/index.js:85 +msgid "Download" +msgstr "Ḓǿẇƞŀǿȧḓ" + +#: src/search/containers/AddonPage/index.js:95 +msgid "No current version" +msgstr "Ƞǿ ƈŭřřḗƞŧ ṽḗřşīǿƞ" + +#: src/search/containers/App.js:18 +msgid "Add-ons Search" +msgstr "Ȧḓḓ-ǿƞş Şḗȧřƈħ" diff --git a/locale/dbg_rtl/LC_MESSAGES/disco.po b/locale/dbr/LC_MESSAGES/disco.po similarity index 100% rename from locale/dbg_rtl/LC_MESSAGES/disco.po rename to locale/dbr/LC_MESSAGES/disco.po diff --git a/locale/dbr/LC_MESSAGES/search.po b/locale/dbr/LC_MESSAGES/search.po new file mode 100644 index 00000000000..94a9127d78a --- /dev/null +++ b/locale/dbr/LC_MESSAGES/search.po @@ -0,0 +1,129 @@ +msgid "" +msgstr "" +"Project-Id-Version: search\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2016-05-20 14:41+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"Content-Type: text/plain; charset=utf-8\n" + +#: src/core/components/LoginPage/index.js:13 +msgid "Login Required" +msgstr "‮⅂oƃıu ᴚǝbnıɹǝp" + +#: src/core/components/LoginPage/index.js:20 +msgid "You must be logged in to access this page." +msgstr "‮⅄on ɯnsʇ qǝ ʅoƃƃǝp ıu ʇo ɐɔɔǝss ʇɥıs dɐƃǝ˙" + +#: src/core/components/LoginPage/index.js:24 +msgid "Login" +msgstr "‮⅂oƃıu" + +#: src/core/components/NotFound.js:8 +msgid "We're sorry, but we can't find what you're looking for." +msgstr "‮Mǝ,ɹǝ soɹɹʎ´ qnʇ ʍǝ ɔɐu,ʇ ɟıup ʍɥɐʇ ʎon,ɹǝ ʅooʞıuƃ ɟoɹ˙" + +#: src/core/components/NotFound.js:9 +msgid "" +"The page or file you requested wasn't found on our site. It's possible that " +"you\n" +"clicked a link that's out of date, or typed in the address incorrectly." +msgstr "" +"‮⊥ɥǝ dɐƃǝ oɹ ɟıʅǝ ʎon ɹǝbnǝsʇǝp ʍɐsu,ʇ ɟonup ou onɹ sıʇǝ˙ Iʇ,s dossıqʅǝ ʇɥɐʇ " +"ʎon\n" +"‮ɔʅıɔʞǝp ɐ ʅıuʞ ʇɥɐʇ,s onʇ oɟ pɐʇǝ´ oɹ ʇʎdǝp ıu ʇɥǝ ɐppɹǝss ıuɔoɹɹǝɔʇʅʎ˙" + +#: src/core/containers/HandleLogin/index.js:41 +msgid "Logging you in..." +msgstr "‮⅂oƃƃıuƃ ʎon ıu˙˙˙" + +#: src/core/containers/HandleLogin/index.js:45 +msgid "There was an error logging you in, please try again." +msgstr "‮⊥ɥǝɹǝ ʍɐs ɐu ǝɹɹoɹ ʅoƃƃıuƃ ʎon ıu´ dʅǝɐsǝ ʇɹʎ ɐƃɐıu˙" + +#: src/search/components/SearchForm.js:30 +msgid "Search" +msgstr "‮Sǝɐɹɔɥ" + +#: src/search/components/SearchPage.js:29 +msgid "Add-on Search" +msgstr "‮∀pp-ou Sǝɐɹɔɥ" + +#: src/search/components/SearchResult/index.js:18 +msgid "%(count)s file" +msgid_plural "%(count)s files" +msgstr[0] "%(count)s‮ ɟıʅǝ" +msgstr[1] "%(count)s‮ ɟıʅǝs" + +#: src/search/components/SearchResults.js:32 +msgid "Your search for \"%(query)s\" returned %(count)s results." +msgstr "‮⅄onɹ sǝɐɹɔɥ ɟoɹ „%(query)s‮„ ɹǝʇnɹuǝp %(count)s‮ ɹǝsnʅʇs˙" + +#: src/search/components/SearchResults.js:39 +msgid "Searching..." +msgstr "‮Sǝɐɹɔɥıuƃ˙˙˙" + +#: src/search/components/SearchResults.js:41 +msgid "No results were found for \"%(query)s\"." +msgstr "‮No ɹǝsnʅʇs ʍǝɹǝ ɟonup ɟoɹ „%(query)s‮„˙" + +#: src/search/components/SearchResults.js:43 +msgid "Please supply a valid search" +msgstr "‮Ԁʅǝɐsǝ snddʅʎ ɐ ʌɐʅıp sǝɐɹɔɥ" + +#: src/search/containers/AddonPage/index.js:108 +msgid "Attributes" +msgstr "‮∀ʇʇɹıqnʇǝs" + +#: src/search/containers/AddonPage/index.js:110 +msgid "Tags" +msgstr "‮⊥ɐƃs" + +#: src/search/containers/AddonPage/index.js:31 +msgid "View on editors" +msgstr "‮Ʌıǝʍ ou ǝpıʇoɹs" + +#: src/search/containers/AddonPage/index.js:35 +msgid "View homepage" +msgstr "‮Ʌıǝʍ ɥoɯǝdɐƃǝ" + +#: src/search/containers/AddonPage/index.js:41 +msgid "Email support" +msgstr "‮Ǝɯɐıʅ snddoɹʇ" + +#: src/search/containers/AddonPage/index.js:47 +msgid "View support site" +msgstr "‮Ʌıǝʍ snddoɹʇ sıʇǝ" + +#: src/search/containers/AddonPage/index.js:70 +msgid "Current version" +msgstr "‮Ↄnɹɹǝuʇ ʌǝɹsıou" + +#: src/search/containers/AddonPage/index.js:73 +msgid "View on site" +msgstr "‮Ʌıǝʍ ou sıʇǝ" + +#: src/search/containers/AddonPage/index.js:74 +msgid "Edit on site" +msgstr "‮Ǝpıʇ ou sıʇǝ" + +#: src/search/containers/AddonPage/index.js:76 +msgid "Files" +msgstr "‮Ⅎıʅǝs" + +#: src/search/containers/AddonPage/index.js:85 +msgid "Download" +msgstr "‮ᗡoʍuʅoɐp" + +#: src/search/containers/AddonPage/index.js:95 +msgid "No current version" +msgstr "‮No ɔnɹɹǝuʇ ʌǝɹsıou" + +#: src/search/containers/App.js:18 +msgid "Add-ons Search" +msgstr "‮∀pp-ous Sǝɐɹɔɥ" diff --git a/src/locale/af/disco.json b/src/locale/af/disco.json new file mode 100644 index 00000000000..ac0cb9ca79e --- /dev/null +++ b/src/locale/af/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "af" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/af/search.json b/src/locale/af/search.json new file mode 100644 index 00000000000..bc35b7a67e6 --- /dev/null +++ b/src/locale/af/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "af" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ar/disco.json b/src/locale/ar/disco.json new file mode 100644 index 00000000000..530ad69786e --- /dev/null +++ b/src/locale/ar/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "ar" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ar/search.json b/src/locale/ar/search.json new file mode 100644 index 00000000000..58c39e3c362 --- /dev/null +++ b/src/locale/ar/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "ar" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/bg/disco.json b/src/locale/bg/disco.json new file mode 100644 index 00000000000..aa42ba254f8 --- /dev/null +++ b/src/locale/bg/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "bg" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/bg/search.json b/src/locale/bg/search.json new file mode 100644 index 00000000000..f8bbd6dbcb1 --- /dev/null +++ b/src/locale/bg/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "bg" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/bn_BD/disco.json b/src/locale/bn_BD/disco.json new file mode 100644 index 00000000000..60145d824a9 --- /dev/null +++ b/src/locale/bn_BD/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "bn_BD" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/bn_BD/search.json b/src/locale/bn_BD/search.json new file mode 100644 index 00000000000..b0653c28dfc --- /dev/null +++ b/src/locale/bn_BD/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "bn_BD" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ca/disco.json b/src/locale/ca/disco.json new file mode 100644 index 00000000000..6f66ed3eb2e --- /dev/null +++ b/src/locale/ca/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "ca" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ca/search.json b/src/locale/ca/search.json new file mode 100644 index 00000000000..6935bf867b1 --- /dev/null +++ b/src/locale/ca/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "ca" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/cs/disco.json b/src/locale/cs/disco.json new file mode 100644 index 00000000000..36f77ae4271 --- /dev/null +++ b/src/locale/cs/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;", + "lang": "cs" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/cs/search.json b/src/locale/cs/search.json new file mode 100644 index 00000000000..b6e69b892cb --- /dev/null +++ b/src/locale/cs/search.json @@ -0,0 +1,95 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;", + "lang": "cs" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/da/disco.json b/src/locale/da/disco.json new file mode 100644 index 00000000000..15227fb8708 --- /dev/null +++ b/src/locale/da/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "da" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/da/search.json b/src/locale/da/search.json new file mode 100644 index 00000000000..f42bff7ed96 --- /dev/null +++ b/src/locale/da/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "da" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/dbl/disco.json b/src/locale/dbl/disco.json new file mode 100644 index 00000000000..c326c75fb44 --- /dev/null +++ b/src/locale/dbl/disco.json @@ -0,0 +1,35 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);" + }, + "An unexpected error occurred": [ + "Ȧƞ ŭƞḗẋƥḗƈŧḗḓ ḗřřǿř ǿƈƈŭřřḗḓ" + ], + "Preview %(name)s": [ + "Ƥřḗṽīḗẇ %(name)s" + ], + "Discover Add-ons": [ + "Ḓīşƈǿṽḗř Ȧḓḓ-ǿƞş" + ], + "Personalize Your Firefox": [ + "Ƥḗřşǿƞȧŀīzḗ Ẏǿŭř Ƒīřḗƒǿẋ" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "Ŧħḗřḗ ȧřḗ ŧħǿŭşȧƞḓş ǿƒ ȧḓḓ-ǿƞş ŧħȧŧ ŀḗŧ ẏǿŭ ḿȧķḗ Ƒīřḗƒǿẋ ȧŀŀ ẏǿŭř\nǿẇƞ—ḗṽḗřẏŧħīƞɠ ƒřǿḿ ƒŭƞ ṽīşŭȧŀ ŧħḗḿḗş ŧǿ ƥǿẇḗřƒŭŀ ŧǿǿŀş ȧƞḓ ƒḗȧŧŭřḗş.\nĦḗřḗ ȧřḗ ȧ ƒḗẇ ɠřḗȧŧ ǿƞḗş ŧǿ ƈħḗƈķ ǿŭŧ." + ], + "Click to play": [ + "Ƈŀīƈķ ŧǿ ƥŀȧẏ" + ], + "to find out more about add-ons": [ + "ŧǿ ƒīƞḓ ǿŭŧ ḿǿřḗ ȧƀǿŭŧ ȧḓḓ-ǿƞş" + ], + "Install": [ + "Īƞşŧȧŀŀ" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/dbl/search.json b/src/locale/dbl/search.json new file mode 100644 index 00000000000..2adf46a3196 --- /dev/null +++ b/src/locale/dbl/search.json @@ -0,0 +1,93 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);" + }, + "Login Required": [ + "Ŀǿɠīƞ Řḗɋŭīřḗḓ" + ], + "You must be logged in to access this page.": [ + "Ẏǿŭ ḿŭşŧ ƀḗ ŀǿɠɠḗḓ īƞ ŧǿ ȧƈƈḗşş ŧħīş ƥȧɠḗ." + ], + "Login": [ + "Ŀǿɠīƞ" + ], + "We're sorry, but we can't find what you're looking for.": [ + "Ẇḗ'řḗ şǿřřẏ, ƀŭŧ ẇḗ ƈȧƞ'ŧ ƒīƞḓ ẇħȧŧ ẏǿŭ'řḗ ŀǿǿķīƞɠ ƒǿř." + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "Ŧħḗ ƥȧɠḗ ǿř ƒīŀḗ ẏǿŭ řḗɋŭḗşŧḗḓ ẇȧşƞ'ŧ ƒǿŭƞḓ ǿƞ ǿŭř şīŧḗ. Īŧ'ş ƥǿşşīƀŀḗ ŧħȧŧ ẏǿŭ\nƈŀīƈķḗḓ ȧ ŀīƞķ ŧħȧŧ'ş ǿŭŧ ǿƒ ḓȧŧḗ, ǿř ŧẏƥḗḓ īƞ ŧħḗ ȧḓḓřḗşş īƞƈǿřřḗƈŧŀẏ." + ], + "Logging you in...": [ + "Ŀǿɠɠīƞɠ ẏǿŭ īƞ..." + ], + "There was an error logging you in, please try again.": [ + "Ŧħḗřḗ ẇȧş ȧƞ ḗřřǿř ŀǿɠɠīƞɠ ẏǿŭ īƞ, ƥŀḗȧşḗ ŧřẏ ȧɠȧīƞ." + ], + "Search": [ + "Şḗȧřƈħ" + ], + "Add-on Search": [ + "Ȧḓḓ-ǿƞ Şḗȧřƈħ" + ], + "%(count)s file": [ + "%(count)s ƒīŀḗ", + "%(count)s ƒīŀḗş" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "Ẏǿŭř şḗȧřƈħ ƒǿř \"%(query)s\" řḗŧŭřƞḗḓ %(count)s řḗşŭŀŧş." + ], + "Searching...": [ + "Şḗȧřƈħīƞɠ..." + ], + "No results were found for \"%(query)s\".": [ + "Ƞǿ řḗşŭŀŧş ẇḗřḗ ƒǿŭƞḓ ƒǿř \"%(query)s\"." + ], + "Please supply a valid search": [ + "Ƥŀḗȧşḗ şŭƥƥŀẏ ȧ ṽȧŀīḓ şḗȧřƈħ" + ], + "Attributes": [ + "Ȧŧŧřīƀŭŧḗş" + ], + "Tags": [ + "Ŧȧɠş" + ], + "View on editors": [ + "Ṽīḗẇ ǿƞ ḗḓīŧǿřş" + ], + "View homepage": [ + "Ṽīḗẇ ħǿḿḗƥȧɠḗ" + ], + "Email support": [ + "Ḗḿȧīŀ şŭƥƥǿřŧ" + ], + "View support site": [ + "Ṽīḗẇ şŭƥƥǿřŧ şīŧḗ" + ], + "Current version": [ + "Ƈŭřřḗƞŧ ṽḗřşīǿƞ" + ], + "View on site": [ + "Ṽīḗẇ ǿƞ şīŧḗ" + ], + "Edit on site": [ + "Ḗḓīŧ ǿƞ şīŧḗ" + ], + "Files": [ + "Ƒīŀḗş" + ], + "Download": [ + "Ḓǿẇƞŀǿȧḓ" + ], + "No current version": [ + "Ƞǿ ƈŭřřḗƞŧ ṽḗřşīǿƞ" + ], + "Add-ons Search": [ + "Ȧḓḓ-ǿƞş Şḗȧřƈħ" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/dbr/disco.json b/src/locale/dbr/disco.json new file mode 100644 index 00000000000..240065932d4 --- /dev/null +++ b/src/locale/dbr/disco.json @@ -0,0 +1,35 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);" + }, + "An unexpected error occurred": [ + "‮∀u nuǝxdǝɔʇǝp ǝɹɹoɹ oɔɔnɹɹǝp" + ], + "Preview %(name)s": [ + "‮Ԁɹǝʌıǝʍ %(name)s" + ], + "Discover Add-ons": [ + "‮ᗡısɔoʌǝɹ ∀pp-ous" + ], + "Personalize Your Firefox": [ + "‮Ԁǝɹsouɐʅızǝ ⅄onɹ Ⅎıɹǝɟox" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "‮⊥ɥǝɹǝ ɐɹǝ ʇɥonsɐups oɟ ɐpp-ous ʇɥɐʇ ʅǝʇ ʎon ɯɐʞǝ Ⅎıɹǝɟox ɐʅʅ ʎonɹ\n‮oʍu—‮ǝʌǝɹʎʇɥıuƃ ɟɹoɯ ɟnu ʌısnɐʅ ʇɥǝɯǝs ʇo doʍǝɹɟnʅ ʇooʅs ɐup ɟǝɐʇnɹǝs˙\n‮Hǝɹǝ ɐɹǝ ɐ ɟǝʍ ƃɹǝɐʇ ouǝs ʇo ɔɥǝɔʞ onʇ˙" + ], + "Click to play": [ + "‮Ↄʅıɔʞ ʇo dʅɐʎ" + ], + "to find out more about add-ons": [ + "‮ʇo ɟıup onʇ ɯoɹǝ ɐqonʇ ɐpp-ous" + ], + "Install": [ + "‮Iusʇɐʅʅ" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/dbr/search.json b/src/locale/dbr/search.json new file mode 100644 index 00000000000..73d1add9be9 --- /dev/null +++ b/src/locale/dbr/search.json @@ -0,0 +1,93 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);" + }, + "Login Required": [ + "‮⅂oƃıu ᴚǝbnıɹǝp" + ], + "You must be logged in to access this page.": [ + "‮⅄on ɯnsʇ qǝ ʅoƃƃǝp ıu ʇo ɐɔɔǝss ʇɥıs dɐƃǝ˙" + ], + "Login": [ + "‮⅂oƃıu" + ], + "We're sorry, but we can't find what you're looking for.": [ + "‮Mǝ,ɹǝ soɹɹʎ´ qnʇ ʍǝ ɔɐu,ʇ ɟıup ʍɥɐʇ ʎon,ɹǝ ʅooʞıuƃ ɟoɹ˙" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "‮⊥ɥǝ dɐƃǝ oɹ ɟıʅǝ ʎon ɹǝbnǝsʇǝp ʍɐsu,ʇ ɟonup ou onɹ sıʇǝ˙ Iʇ,s dossıqʅǝ ʇɥɐʇ ʎon\n‮ɔʅıɔʞǝp ɐ ʅıuʞ ʇɥɐʇ,s onʇ oɟ pɐʇǝ´ oɹ ʇʎdǝp ıu ʇɥǝ ɐppɹǝss ıuɔoɹɹǝɔʇʅʎ˙" + ], + "Logging you in...": [ + "‮⅂oƃƃıuƃ ʎon ıu˙˙˙" + ], + "There was an error logging you in, please try again.": [ + "‮⊥ɥǝɹǝ ʍɐs ɐu ǝɹɹoɹ ʅoƃƃıuƃ ʎon ıu´ dʅǝɐsǝ ʇɹʎ ɐƃɐıu˙" + ], + "Search": [ + "‮Sǝɐɹɔɥ" + ], + "Add-on Search": [ + "‮∀pp-ou Sǝɐɹɔɥ" + ], + "%(count)s file": [ + "%(count)s‮ ɟıʅǝ", + "%(count)s‮ ɟıʅǝs" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "‮⅄onɹ sǝɐɹɔɥ ɟoɹ „%(query)s‮„ ɹǝʇnɹuǝp %(count)s‮ ɹǝsnʅʇs˙" + ], + "Searching...": [ + "‮Sǝɐɹɔɥıuƃ˙˙˙" + ], + "No results were found for \"%(query)s\".": [ + "‮No ɹǝsnʅʇs ʍǝɹǝ ɟonup ɟoɹ „%(query)s‮„˙" + ], + "Please supply a valid search": [ + "‮Ԁʅǝɐsǝ snddʅʎ ɐ ʌɐʅıp sǝɐɹɔɥ" + ], + "Attributes": [ + "‮∀ʇʇɹıqnʇǝs" + ], + "Tags": [ + "‮⊥ɐƃs" + ], + "View on editors": [ + "‮Ʌıǝʍ ou ǝpıʇoɹs" + ], + "View homepage": [ + "‮Ʌıǝʍ ɥoɯǝdɐƃǝ" + ], + "Email support": [ + "‮Ǝɯɐıʅ snddoɹʇ" + ], + "View support site": [ + "‮Ʌıǝʍ snddoɹʇ sıʇǝ" + ], + "Current version": [ + "‮Ↄnɹɹǝuʇ ʌǝɹsıou" + ], + "View on site": [ + "‮Ʌıǝʍ ou sıʇǝ" + ], + "Edit on site": [ + "‮Ǝpıʇ ou sıʇǝ" + ], + "Files": [ + "‮Ⅎıʅǝs" + ], + "Download": [ + "‮ᗡoʍuʅoɐp" + ], + "No current version": [ + "‮No ɔnɹɹǝuʇ ʌǝɹsıou" + ], + "Add-ons Search": [ + "‮∀pp-ous Sǝɐɹɔɥ" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/de/disco.json b/src/locale/de/disco.json new file mode 100644 index 00000000000..985df6213c2 --- /dev/null +++ b/src/locale/de/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "de" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/de/search.json b/src/locale/de/search.json new file mode 100644 index 00000000000..d91f7f0ebb8 --- /dev/null +++ b/src/locale/de/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "de" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/el/disco.json b/src/locale/el/disco.json new file mode 100644 index 00000000000..147a508fa37 --- /dev/null +++ b/src/locale/el/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "el" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/el/search.json b/src/locale/el/search.json new file mode 100644 index 00000000000..1fd5c6ebee9 --- /dev/null +++ b/src/locale/el/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "el" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/en_GB/disco.json b/src/locale/en_GB/disco.json new file mode 100644 index 00000000000..71d55711adc --- /dev/null +++ b/src/locale/en_GB/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "en_GB" + }, + "An unexpected error occurred": [ + "An unexpected error occurred" + ], + "Preview %(name)s": [ + "Preview %(name)s" + ], + "Discover Add-ons": [ + "Discover Add-ons" + ], + "Personalize Your Firefox": [ + "Personalize Your Firefox" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out." + ], + "Click to play": [ + "Click to play" + ], + "to find out more about add-ons": [ + "to find out more about add-ons" + ], + "Install": [ + "Install" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/en_GB/search.json b/src/locale/en_GB/search.json new file mode 100644 index 00000000000..314dd4a086c --- /dev/null +++ b/src/locale/en_GB/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "en_GB" + }, + "Login Required": [ + "Login Required" + ], + "You must be logged in to access this page.": [ + "You must be logged in to access this page." + ], + "Login": [ + "Login" + ], + "We're sorry, but we can't find what you're looking for.": [ + "We're sorry, but we can't find what you're looking for." + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly." + ], + "Logging you in...": [ + "Logging you in..." + ], + "There was an error logging you in, please try again.": [ + "There was an error logging you in, please try again." + ], + "Search": [ + "Search" + ], + "Add-on Search": [ + "Add-on Search" + ], + "%(count)s file": [ + "%(count)s file", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "Your search for \"%(query)s\" returned %(count)s results." + ], + "Searching...": [ + "Searching..." + ], + "No results were found for \"%(query)s\".": [ + "No results were found for \"%(query)s\"." + ], + "Please supply a valid search": [ + "Please supply a valid search" + ], + "Attributes": [ + "Attributes" + ], + "Tags": [ + "Tags" + ], + "View on editors": [ + "View on editors" + ], + "View homepage": [ + "View homepage" + ], + "Email support": [ + "Email support" + ], + "View support site": [ + "View support site" + ], + "Current version": [ + "Current version" + ], + "View on site": [ + "View on site" + ], + "Edit on site": [ + "Edit on site" + ], + "Files": [ + "Files" + ], + "Download": [ + "Download" + ], + "No current version": [ + "No current version" + ], + "Add-ons Search": [ + "Add-ons Search" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/en_US/disco.json b/src/locale/en_US/disco.json new file mode 100644 index 00000000000..37e1d0da937 --- /dev/null +++ b/src/locale/en_US/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "en_US" + }, + "An unexpected error occurred": [ + "An unexpected error occurred" + ], + "Preview %(name)s": [ + "Preview %(name)s" + ], + "Discover Add-ons": [ + "Discover Add-ons" + ], + "Personalize Your Firefox": [ + "Personalize Your Firefox" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out." + ], + "Click to play": [ + "Click to play" + ], + "to find out more about add-ons": [ + "to find out more about add-ons" + ], + "Install": [ + "Install" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/en_US/search.json b/src/locale/en_US/search.json new file mode 100644 index 00000000000..1c36faa9522 --- /dev/null +++ b/src/locale/en_US/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "en_US" + }, + "Login Required": [ + "Login Required" + ], + "You must be logged in to access this page.": [ + "You must be logged in to access this page." + ], + "Login": [ + "Login" + ], + "We're sorry, but we can't find what you're looking for.": [ + "We're sorry, but we can't find what you're looking for." + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly." + ], + "Logging you in...": [ + "Logging you in..." + ], + "There was an error logging you in, please try again.": [ + "There was an error logging you in, please try again." + ], + "Search": [ + "Search" + ], + "Add-on Search": [ + "Add-on Search" + ], + "%(count)s file": [ + "%(count)s file", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "Your search for \"%(query)s\" returned %(count)s results." + ], + "Searching...": [ + "Searching..." + ], + "No results were found for \"%(query)s\".": [ + "No results were found for \"%(query)s\"." + ], + "Please supply a valid search": [ + "Please supply a valid search" + ], + "Attributes": [ + "Attributes" + ], + "Tags": [ + "Tags" + ], + "View on editors": [ + "View on editors" + ], + "View homepage": [ + "View homepage" + ], + "Email support": [ + "Email support" + ], + "View support site": [ + "View support site" + ], + "Current version": [ + "Current version" + ], + "View on site": [ + "View on site" + ], + "Edit on site": [ + "Edit on site" + ], + "Files": [ + "Files" + ], + "Download": [ + "Download" + ], + "No current version": [ + "No current version" + ], + "Add-ons Search": [ + "Add-ons Search" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/es/disco.json b/src/locale/es/disco.json new file mode 100644 index 00000000000..b84adeb9bf2 --- /dev/null +++ b/src/locale/es/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "es" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/es/search.json b/src/locale/es/search.json new file mode 100644 index 00000000000..5b88176d8f0 --- /dev/null +++ b/src/locale/es/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "es" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/eu/disco.json b/src/locale/eu/disco.json new file mode 100644 index 00000000000..b7189a4392a --- /dev/null +++ b/src/locale/eu/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "eu" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/eu/search.json b/src/locale/eu/search.json new file mode 100644 index 00000000000..81b3196d6f2 --- /dev/null +++ b/src/locale/eu/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "eu" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/fa/disco.json b/src/locale/fa/disco.json new file mode 100644 index 00000000000..2533e915878 --- /dev/null +++ b/src/locale/fa/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "fa" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/fa/search.json b/src/locale/fa/search.json new file mode 100644 index 00000000000..4015c47e9d2 --- /dev/null +++ b/src/locale/fa/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "fa" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/fi/disco.json b/src/locale/fi/disco.json new file mode 100644 index 00000000000..78778b30982 --- /dev/null +++ b/src/locale/fi/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "fi" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/fi/search.json b/src/locale/fi/search.json new file mode 100644 index 00000000000..25dcd96c0c3 --- /dev/null +++ b/src/locale/fi/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "fi" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/fr/disco.json b/src/locale/fr/disco.json new file mode 100644 index 00000000000..dd0f88d6c38 --- /dev/null +++ b/src/locale/fr/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n > 1);", + "lang": "fr" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/fr/search.json b/src/locale/fr/search.json new file mode 100644 index 00000000000..a5813fe0c0e --- /dev/null +++ b/src/locale/fr/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n > 1);", + "lang": "fr" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ga_IE/disco.json b/src/locale/ga_IE/disco.json new file mode 100644 index 00000000000..f872c04662e --- /dev/null +++ b/src/locale/ga_IE/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;", + "lang": "ga" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ga_IE/search.json b/src/locale/ga_IE/search.json new file mode 100644 index 00000000000..2b696e31da6 --- /dev/null +++ b/src/locale/ga_IE/search.json @@ -0,0 +1,95 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;", + "lang": "ga" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/he/disco.json b/src/locale/he/disco.json new file mode 100644 index 00000000000..70555a85dac --- /dev/null +++ b/src/locale/he/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "he" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/he/search.json b/src/locale/he/search.json new file mode 100644 index 00000000000..2935fd21657 --- /dev/null +++ b/src/locale/he/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "he" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/hu/disco.json b/src/locale/hu/disco.json new file mode 100644 index 00000000000..9a30127f074 --- /dev/null +++ b/src/locale/hu/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "hu" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/hu/search.json b/src/locale/hu/search.json new file mode 100644 index 00000000000..28b4a858851 --- /dev/null +++ b/src/locale/hu/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "hu" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/id/disco.json b/src/locale/id/disco.json new file mode 100644 index 00000000000..e401c78011c --- /dev/null +++ b/src/locale/id/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "id" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/id/search.json b/src/locale/id/search.json new file mode 100644 index 00000000000..7a24c7e21a8 --- /dev/null +++ b/src/locale/id/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "id" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/it/disco.json b/src/locale/it/disco.json new file mode 100644 index 00000000000..bc658692f9e --- /dev/null +++ b/src/locale/it/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "it" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/it/search.json b/src/locale/it/search.json new file mode 100644 index 00000000000..b30952f8bb8 --- /dev/null +++ b/src/locale/it/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "it" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ja/disco.json b/src/locale/ja/disco.json new file mode 100644 index 00000000000..7a14d57285a --- /dev/null +++ b/src/locale/ja/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=1; plural=0;", + "lang": "ja" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ja/search.json b/src/locale/ja/search.json new file mode 100644 index 00000000000..67b417282ba --- /dev/null +++ b/src/locale/ja/search.json @@ -0,0 +1,93 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=1; plural=0;", + "lang": "ja" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ko/disco.json b/src/locale/ko/disco.json new file mode 100644 index 00000000000..857f72f02fb --- /dev/null +++ b/src/locale/ko/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=1; plural=0;", + "lang": "ko" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ko/search.json b/src/locale/ko/search.json new file mode 100644 index 00000000000..e27e0f66573 --- /dev/null +++ b/src/locale/ko/search.json @@ -0,0 +1,93 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=1; plural=0;", + "lang": "ko" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/mk/disco.json b/src/locale/mk/disco.json new file mode 100644 index 00000000000..59b00ba58c4 --- /dev/null +++ b/src/locale/mk/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "mk" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/mk/search.json b/src/locale/mk/search.json new file mode 100644 index 00000000000..525fc84ce1e --- /dev/null +++ b/src/locale/mk/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "mk" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/mn/disco.json b/src/locale/mn/disco.json new file mode 100644 index 00000000000..9ff72fbd0fd --- /dev/null +++ b/src/locale/mn/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "mn" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/mn/search.json b/src/locale/mn/search.json new file mode 100644 index 00000000000..cc703dbde90 --- /dev/null +++ b/src/locale/mn/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "mn" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/nl/disco.json b/src/locale/nl/disco.json new file mode 100644 index 00000000000..1df147b7d7a --- /dev/null +++ b/src/locale/nl/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "nl" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/nl/search.json b/src/locale/nl/search.json new file mode 100644 index 00000000000..b1650ed6d4a --- /dev/null +++ b/src/locale/nl/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "nl" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/pl/disco.json b/src/locale/pl/disco.json new file mode 100644 index 00000000000..921a10f39a5 --- /dev/null +++ b/src/locale/pl/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);", + "lang": "pl" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/pl/search.json b/src/locale/pl/search.json new file mode 100644 index 00000000000..8dc9b91f098 --- /dev/null +++ b/src/locale/pl/search.json @@ -0,0 +1,95 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);", + "lang": "pl" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/pt_BR/disco.json b/src/locale/pt_BR/disco.json new file mode 100644 index 00000000000..ed4d93e8e55 --- /dev/null +++ b/src/locale/pt_BR/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n > 1);", + "lang": "pt_BR" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/pt_BR/search.json b/src/locale/pt_BR/search.json new file mode 100644 index 00000000000..7968430a9ff --- /dev/null +++ b/src/locale/pt_BR/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n > 1);", + "lang": "pt_BR" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/pt_PT/disco.json b/src/locale/pt_PT/disco.json new file mode 100644 index 00000000000..0c9cb572f49 --- /dev/null +++ b/src/locale/pt_PT/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "pt" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/pt_PT/search.json b/src/locale/pt_PT/search.json new file mode 100644 index 00000000000..e37ced7fca3 --- /dev/null +++ b/src/locale/pt_PT/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "pt" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ro/disco.json b/src/locale/ro/disco.json new file mode 100644 index 00000000000..ca51078fb78 --- /dev/null +++ b/src/locale/ro/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;", + "lang": "ro" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ro/search.json b/src/locale/ro/search.json new file mode 100644 index 00000000000..37f37132949 --- /dev/null +++ b/src/locale/ro/search.json @@ -0,0 +1,95 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;", + "lang": "ro" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ru/disco.json b/src/locale/ru/disco.json new file mode 100644 index 00000000000..e7274763949 --- /dev/null +++ b/src/locale/ru/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);", + "lang": "ru" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/ru/search.json b/src/locale/ru/search.json new file mode 100644 index 00000000000..4e1ca7527ad --- /dev/null +++ b/src/locale/ru/search.json @@ -0,0 +1,95 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);", + "lang": "ru" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/sk/disco.json b/src/locale/sk/disco.json new file mode 100644 index 00000000000..b7aa2bf58f2 --- /dev/null +++ b/src/locale/sk/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;", + "lang": "sk" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/sk/search.json b/src/locale/sk/search.json new file mode 100644 index 00000000000..4c0d87430d4 --- /dev/null +++ b/src/locale/sk/search.json @@ -0,0 +1,95 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;", + "lang": "sk" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/sl/disco.json b/src/locale/sl/disco.json new file mode 100644 index 00000000000..3ac3f309ebc --- /dev/null +++ b/src/locale/sl/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);", + "lang": "sl" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/sl/search.json b/src/locale/sl/search.json new file mode 100644 index 00000000000..ac8e8091207 --- /dev/null +++ b/src/locale/sl/search.json @@ -0,0 +1,96 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);", + "lang": "sl" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files", + "%(count)s files", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/sq/disco.json b/src/locale/sq/disco.json new file mode 100644 index 00000000000..6437398ef16 --- /dev/null +++ b/src/locale/sq/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "sq" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/sq/search.json b/src/locale/sq/search.json new file mode 100644 index 00000000000..70693e29536 --- /dev/null +++ b/src/locale/sq/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "sq" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/sv_SE/disco.json b/src/locale/sv_SE/disco.json new file mode 100644 index 00000000000..bac3e363f5e --- /dev/null +++ b/src/locale/sv_SE/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "sv" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/sv_SE/search.json b/src/locale/sv_SE/search.json new file mode 100644 index 00000000000..402fd27089b --- /dev/null +++ b/src/locale/sv_SE/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n != 1);", + "lang": "sv" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/uk/disco.json b/src/locale/uk/disco.json new file mode 100644 index 00000000000..6b24eef7976 --- /dev/null +++ b/src/locale/uk/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);", + "lang": "uk" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/uk/search.json b/src/locale/uk/search.json new file mode 100644 index 00000000000..cc6fcc96acc --- /dev/null +++ b/src/locale/uk/search.json @@ -0,0 +1,95 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);", + "lang": "uk" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/vi/disco.json b/src/locale/vi/disco.json new file mode 100644 index 00000000000..3fc059b896c --- /dev/null +++ b/src/locale/vi/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=1; plural=0;", + "lang": "vi" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/vi/search.json b/src/locale/vi/search.json new file mode 100644 index 00000000000..7dd5cb8295d --- /dev/null +++ b/src/locale/vi/search.json @@ -0,0 +1,93 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=1; plural=0;", + "lang": "vi" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/zh_CN/disco.json b/src/locale/zh_CN/disco.json new file mode 100644 index 00000000000..d22b8128034 --- /dev/null +++ b/src/locale/zh_CN/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "zh_CN" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/zh_CN/search.json b/src/locale/zh_CN/search.json new file mode 100644 index 00000000000..a1775ed0910 --- /dev/null +++ b/src/locale/zh_CN/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "zh_CN" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/zh_TW/disco.json b/src/locale/zh_TW/disco.json new file mode 100644 index 00000000000..4b4b84b6094 --- /dev/null +++ b/src/locale/zh_TW/disco.json @@ -0,0 +1,36 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "zh_TW" + }, + "An unexpected error occurred": [ + "" + ], + "Preview %(name)s": [ + "" + ], + "Discover Add-ons": [ + "" + ], + "Personalize Your Firefox": [ + "" + ], + "There are thousands of add-ons that let you make Firefox all your\nown—everything from fun visual themes to powerful tools and features.\nHere are a few great ones to check out.": [ + "" + ], + "Click to play": [ + "" + ], + "to find out more about add-ons": [ + "" + ], + "Install": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/src/locale/zh_TW/search.json b/src/locale/zh_TW/search.json new file mode 100644 index 00000000000..a041681134a --- /dev/null +++ b/src/locale/zh_TW/search.json @@ -0,0 +1,94 @@ +{ + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "plural_forms": "nplurals=2; plural=(n!=1);", + "lang": "zh_TW" + }, + "Login Required": [ + "" + ], + "You must be logged in to access this page.": [ + "" + ], + "Login": [ + "" + ], + "We're sorry, but we can't find what you're looking for.": [ + "" + ], + "The page or file you requested wasn't found on our site. It's possible that you\nclicked a link that's out of date, or typed in the address incorrectly.": [ + "" + ], + "Logging you in...": [ + "" + ], + "There was an error logging you in, please try again.": [ + "" + ], + "Search": [ + "" + ], + "Add-on Search": [ + "" + ], + "%(count)s file": [ + "", + "%(count)s files" + ], + "Your search for \"%(query)s\" returned %(count)s results.": [ + "" + ], + "Searching...": [ + "" + ], + "No results were found for \"%(query)s\".": [ + "" + ], + "Please supply a valid search": [ + "" + ], + "Attributes": [ + "" + ], + "Tags": [ + "" + ], + "View on editors": [ + "" + ], + "View homepage": [ + "" + ], + "Email support": [ + "" + ], + "View support site": [ + "" + ], + "Current version": [ + "" + ], + "View on site": [ + "" + ], + "Edit on site": [ + "" + ], + "Files": [ + "" + ], + "Download": [ + "" + ], + "No current version": [ + "" + ], + "Add-ons Search": [ + "" + ] + } + } +} \ No newline at end of file From cb7df8c7b4c6f650b102c2db5b44fa99a16a8a9b Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Wed, 25 May 2016 13:40:49 +0100 Subject: [PATCH 03/12] Update scripts --- bin/create-locales | 7 ++++--- bin/debug-locales | 3 +-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/create-locales b/bin/create-locales index d09e7ec8834..63d358f8a10 100755 --- a/bin/create-locales +++ b/bin/create-locales @@ -11,18 +11,19 @@ const glob = require('glob'); const path = require('path'); const shell = require('shelljs'); -const supportedLocales = config.get('supportedLocales'); +const supportedLangs = config.get('langs'); const localeDir = path.join(__dirname, '../locale'); const templateDir = path.join(localeDir, 'templates/LC_MESSAGES'); const potFiles = glob.sync(`${templateDir}/*.pot`); +let lang; let locale; let potFile; let fileName; let outputFile; -for (locale of supportedLocales) { - locale = locale.replace('-', '_'); +for (lang of supportedLangs) { + locale = lang.replace('-', '_'); shell.exec(`mkdir -p ${localeDir}/${locale}/LC_MESSAGES/`); for (potFile of potFiles) { fileName = path.basename(potFile, '.pot'); diff --git a/bin/debug-locales b/bin/debug-locales index d695f029268..2a0d31feafe 100755 --- a/bin/debug-locales +++ b/bin/debug-locales @@ -17,7 +17,7 @@ const glob = require('glob'); const path = require('path'); const shell = require('shelljs'); -const debugLocales = ['dbg', 'dbg-rtl']; +const debugLocales = ['dbg', 'dbg_rtl']; const localeDir = path.join(__dirname, '../locale'); const templateDir = path.join(localeDir, 'templates/LC_MESSAGES'); const potFiles = glob.sync(`${templateDir}/*.pot`); @@ -30,7 +30,6 @@ let fileName; for (locale of debugLocales) { for (potFile of potFiles) { - locale = locale.replace('-', '_'); fileName = path.basename(potFile, '.pot'); poFile = path.join(localeDir, locale, 'LC_MESSAGES', `${fileName}.po`); rewrite = locale === 'dbg' ? 'unicode' : 'flipped'; From 0551035a7ded773aea7aa87833be10c9bcfa3c84 Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Wed, 25 May 2016 14:27:53 +0100 Subject: [PATCH 04/12] Add Provider and translation wrapper --- bin/create-locales | 5 +- bin/debug-locales | 2 +- src/core/client/base.js | 21 ++- src/core/client/config.js | 2 +- src/core/containers/ServerHtml.js | 12 +- src/core/i18n/Provider.js | 37 +++++ src/core/i18n/middleware.js | 19 +++ src/core/i18n/translate.js | 66 ++++++++ src/core/i18n/utils.js | 81 ++++++++++ src/core/server/base.js | 83 ++++++---- src/disco/components/Addon.js | 15 +- src/disco/containers/App.js | 11 +- src/disco/containers/DiscoPane.js | 20 ++- src/disco/containers/InstallButton.js | 10 +- .../client/core/client/test_client_config.js | 2 +- .../client/core/containers/TestServerHtml.js | 17 +- tests/client/core/i18n/TestJedProvider.js | 0 tests/client/core/i18n/test_middleware.js | 0 tests/client/core/i18n/test_translate.js | 0 tests/client/core/i18n/test_utils.js | 145 ++++++++++++++++++ tests/client/disco/components/TestAddon.js | 17 +- tests/client/disco/containers/TestApp.js | 18 --- .../client/disco/containers/TestDiscoPane.js | 12 +- .../disco/containers/TestInstallButton.js | 18 ++- tests/client/helpers.js | 16 ++ webpack-isomorphic-tools-config.js | 6 + webpack.l10n.config.babel.js | 16 +- 27 files changed, 536 insertions(+), 115 deletions(-) create mode 100644 src/core/i18n/Provider.js create mode 100644 src/core/i18n/middleware.js create mode 100644 src/core/i18n/translate.js create mode 100644 src/core/i18n/utils.js create mode 100644 tests/client/core/i18n/TestJedProvider.js create mode 100644 tests/client/core/i18n/test_middleware.js create mode 100644 tests/client/core/i18n/test_translate.js create mode 100644 tests/client/core/i18n/test_utils.js delete mode 100644 tests/client/disco/containers/TestApp.js diff --git a/bin/create-locales b/bin/create-locales index 63d358f8a10..37fa0aea99f 100755 --- a/bin/create-locales +++ b/bin/create-locales @@ -16,6 +16,9 @@ const localeDir = path.join(__dirname, '../locale'); const templateDir = path.join(localeDir, 'templates/LC_MESSAGES'); const potFiles = glob.sync(`${templateDir}/*.pot`); +require('babel-register'); +const localeFromLang = require('src/core/i18n/utils').localeFromLang; + let lang; let locale; let potFile; @@ -23,7 +26,7 @@ let fileName; let outputFile; for (lang of supportedLangs) { - locale = lang.replace('-', '_'); + locale = localeFromLang(lang); shell.exec(`mkdir -p ${localeDir}/${locale}/LC_MESSAGES/`); for (potFile of potFiles) { fileName = path.basename(potFile, '.pot'); diff --git a/bin/debug-locales b/bin/debug-locales index 2a0d31feafe..7de05f4a9a9 100755 --- a/bin/debug-locales +++ b/bin/debug-locales @@ -17,7 +17,7 @@ const glob = require('glob'); const path = require('path'); const shell = require('shelljs'); -const debugLocales = ['dbg', 'dbg_rtl']; +const debugLocales = ['dbl', 'dbr']; const localeDir = path.join(__dirname, '../locale'); const templateDir = path.join(localeDir, 'templates/LC_MESSAGES'); const potFiles = glob.sync(`${templateDir}/*.pot`); diff --git a/src/core/client/base.js b/src/core/client/base.js index 217d069455d..ad125b373c0 100644 --- a/src/core/client/base.js +++ b/src/core/client/base.js @@ -1,9 +1,14 @@ import 'babel-polyfill'; import React from 'react'; + +import config from 'config'; import { render } from 'react-dom'; import { Provider } from 'react-redux'; import { Router, browserHistory } from 'react-router'; import { ReduxAsyncConnect } from 'redux-async-connect'; +import { langToLocale, getLanguage } from 'core/i18n/utils'; +import I18nProvider from 'core/i18n/Provider'; +import Jed from 'jed'; import log from 'core/logger'; @@ -12,6 +17,14 @@ export default function makeClient(routes, createStore) { const initialStateContainer = document.getElementById('redux-store-state'); let initialState; + const html = document.querySelector('html'); + const lang = getLanguage(html.getAttribute('lang')); + const locale = langToLocale(lang); + const appName = config.get('appName'); + // eslint-disable-next-line global-require + const jedData = require(`json!../../locale/${locale}/${appName}.json`); + const i18n = new Jed(jedData); + if (initialStateContainer) { try { initialState = JSON.parse(initialStateContainer.textContent); @@ -26,9 +39,11 @@ export default function makeClient(routes, createStore) { } render( - - - , + + + + + , document.getElementById('react-view') ); } diff --git a/src/core/client/config.js b/src/core/client/config.js index f450a9bdf54..e1b326bb8a5 100644 --- a/src/core/client/config.js +++ b/src/core/client/config.js @@ -15,7 +15,7 @@ export class ClientConfig { if (this.has(key)) { return objData[key]; } - throw new Error(dedent`Key was not found in clientConfig. Check the + throw new Error(dedent`Key "${key}" was not found in clientConfig. Check the key has been added to clientConfigKeys`); }, }); diff --git a/src/core/containers/ServerHtml.js b/src/core/containers/ServerHtml.js index 99647866c94..3f5b3b3acf5 100644 --- a/src/core/containers/ServerHtml.js +++ b/src/core/containers/ServerHtml.js @@ -10,11 +10,18 @@ export default class ServerHtml extends Component { appName: PropTypes.string.isRequired, assets: PropTypes.object.isRequired, component: PropTypes.object.isRequired, + htmlDir: PropTypes.object, + htmlLang: PropTypes.object, includeSri: PropTypes.bool, sriData: PropTypes.object, store: PropTypes.object.isRequired, }; + static defaultProps = { + htmlDir: 'ltr', + htmlLang: 'en-US', + } + getStatic({filePath, type, index}) { const { includeSri, sriData, appName } = this.props; const leafName = filePath.split('/').pop(); @@ -58,15 +65,14 @@ export default class ServerHtml extends Component { } render() { - const { component, store } = this.props; + const { component, htmlLang, htmlDir, store } = this.props; // This must happen before Helmet.rewind() see // https://github.com/nfl/react-helmet#server-usage for more info. const content = component ? ReactDOM.renderToString(component) : ''; const head = Helmet.rewind(); - const htmlAttrs = head.htmlAttributes.toComponent(); return ( - + diff --git a/src/core/i18n/Provider.js b/src/core/i18n/Provider.js new file mode 100644 index 00000000000..22279e44e1b --- /dev/null +++ b/src/core/i18n/Provider.js @@ -0,0 +1,37 @@ +import { Children, Component, PropTypes } from 'react'; + +/* + * This Provider expects to be passed an initialized + * Jed i18n object, + */ + +export default class I18nProvider extends Component { + static propTypes = { + i18n: PropTypes.object.isRequired, + children: PropTypes.element.isRequired, + } + + static childContextTypes = { + i18n: PropTypes.object.isRequired, + } + + constructor(props, context) { + super(props, context); + this.i18n = props.i18n; + } + + getChildContext() { + return { i18n: this.i18n }; + } + + componentWillReceiveProps(nextProps) { + if (this.props.i18n !== nextProps.i18n) { + throw new Error('Mutating the i18n object is not allowed'); + } + } + + render() { + const { children } = this.props; + return Children.only(children); + } +} diff --git a/src/core/i18n/middleware.js b/src/core/i18n/middleware.js new file mode 100644 index 00000000000..72b91314107 --- /dev/null +++ b/src/core/i18n/middleware.js @@ -0,0 +1,19 @@ +import config from 'config'; +import { getLanguage } from 'core/i18n/utils'; + +const defaultLang = config.get('defaultLang'); + + +const setLanguage = (req, res, next) => { + let lang = defaultLang; + // Locale can be changed by passing ?lang= in the querystring + const langQS = req.query ? req.query.lang : null; + if (langQS) { + lang = getLanguage(langQS); + } + // eslint-disable-next-line no-param-reassign + res.locals.lang = lang; + next(); +}; + +export default setLanguage; diff --git a/src/core/i18n/translate.js b/src/core/i18n/translate.js new file mode 100644 index 00000000000..20a119825e7 --- /dev/null +++ b/src/core/i18n/translate.js @@ -0,0 +1,66 @@ +import React, { Component, PropTypes } from 'react'; + + +function getDisplayName(component) { + return component.displayName || component.name || 'Component'; +} + + +export default function translate(options = {}) { + const { withRef = false } = options; + + return function Wrapper(WrappedComponent) { + class Translate extends Component { + constructor(props, context) { + super(props, context); + this.i18n = context.i18n; + this.state = { + i18nLoadedAt: null, + }; + } + + getChildContext() { + return { i18n: this.i18n }; + } + + componentWillUnmount() { + this.mounted = false; + } + + getWrappedInstance() { + if (!withRef) { + throw new Error(dedent`To access the wrapped instance, you need to specify + { withRef: true } as the second argument of the translate() call.`); + } + return this.refs.wrappedInstance; + } + + render() { + const extraProps = { i18n: this.i18n }; + + if (withRef) { + extraProps.ref = 'wrappedInstance'; + } + + return React.createElement( + WrappedComponent, + { ...this.props, ...extraProps } + ); + } + } + + Translate.WrappedComponent = WrappedComponent; + + Translate.contextTypes = { + i18n: PropTypes.object.isRequired, + }; + + Translate.childContextTypes = { + i18n: PropTypes.object.isRequired, + }; + + Translate.displayName = `Translate[${getDisplayName(WrappedComponent)}]`; + + return Translate; + }; +} diff --git a/src/core/i18n/utils.js b/src/core/i18n/utils.js new file mode 100644 index 00000000000..b474dc65c75 --- /dev/null +++ b/src/core/i18n/utils.js @@ -0,0 +1,81 @@ +import config from 'config'; +import log from 'core/logger'; + +const defaultLang = config.get('defaultLang'); +const langs = config.get('langs'); +const langMap = config.get('langMap'); +const validLangs = langs.concat(Object.keys(langMap)); +const rtlLangs = config.get('rtlLangs'); + + +export function localeToLang(locale, log_ = log) { + let lang = ''; + if (locale && locale.split) { + const parts = locale.split('_'); + if (parts.length === 1) { + lang = parts[0].toLowerCase(); + } else if (parts.length === 2) { + let pt2 = parts[1]; + pt2 = (pt2.length > 2) ? pt2[0].toUpperCase() + + pt2.slice(1).toLowerCase() : pt2.toUpperCase(); + lang = `${parts[0].toLowerCase()}-${pt2}`; + } else if (parts.length === 3) { + // sr_RS should be sr-RS + lang = `${parts[0].toLowerCase()}-${parts[2].toUpperCase()}`; + } else { + log_.error(`Unable to map a language from locale code [${locale}]`); + } + } + return lang; +} + +export function langToLocale(language, log_ = log) { + let locale = ''; + if (language && language.split) { + const parts = language.split('-'); + if (parts.length === 1) { + locale = parts[0].toLowerCase(); + } else if (parts.length === 2) { + let pt2 = parts[1]; + pt2 = (pt2.length > 2) ? + pt2[0].toUpperCase() + pt2.slice(1).toLowerCase() : pt2.toUpperCase(); + locale = `${parts[0].toLowerCase()}_${pt2}`; + } else if (parts.length === 3) { + // sr-Cyrl-RS should be sr_RS + locale = `${parts[0].toLowerCase()}_${parts[2].toUpperCase()}`; + } else { + log_.error(`Unable to map a locale from language code [${language}]`); + } + } + return locale; +} + +export function normalizeLang(lang) { + return localeToLang(langToLocale(lang)); +} + +export function normalizeLocale(locale) { + return langToLocale(localeToLang(locale)); +} + +export function isValidLang(lang) { + return validLangs.indexOf(lang) > -1; +} + +export function getLanguage(langOrLocale) { + let language = normalizeLang(langOrLocale); + // Only look in the un-mapped lang list. + if (langs.indexOf(language) === -1) { + language = langMap.hasOwnProperty(language) ? langMap[language] : defaultLang; + } + return language; +} + +export function isRtlLang(lang) { + const language = getLanguage(lang); + return rtlLangs.indexOf(language) > -1; +} + +export function getDirection(lang) { + return isRtlLang(lang) ? 'rtl' : 'ltr'; +} diff --git a/src/core/server/base.js b/src/core/server/base.js index 7e76e339803..4ae7b2a7063 100644 --- a/src/core/server/base.js +++ b/src/core/server/base.js @@ -7,7 +7,6 @@ import path from 'path'; import cookie from 'react-cookie'; import React from 'react'; import ReactDOM from 'react-dom/server'; -import ReactHelmet from 'react-helmet'; import { Provider } from 'react-redux'; import { match } from 'react-router'; @@ -20,6 +19,10 @@ import ServerHtml from 'core/containers/ServerHtml'; import config from 'config'; import { setJWT } from 'core/actions'; import log from 'core/logger'; +import setLanguage from 'core/i18n/middleware'; +import { getDirection, langToLocale } from 'core/i18n/utils'; +import I18nProvider from 'core/i18n/Provider'; +import Jed from 'jed'; const env = config.util.getEnv('NODE_ENV'); @@ -29,7 +32,6 @@ const isDevelopment = config.get('isDevelopment'); const errorString = 'Internal Server Error'; const appName = config.get('appName'); - function logRequests(req, res, next) { const start = new Date(); next(); @@ -42,6 +44,8 @@ function baseServer(routes, createStore, { appInstanceName = appName } = {}) { const app = new Express(); app.disable('x-powered-by'); + app.use(setLanguage); + app.use(logRequests); // Sets X-Frame-Options @@ -56,12 +60,6 @@ function baseServer(routes, createStore, { appInstanceName = appName } = {}) { // CSP configuration. app.use(helmet.contentSecurityPolicy(config.get('CSP'))); - if (isDevelopment) { - log.info('Running in Development Mode'); - - // clear require() cache if in development mode - webpackIsomorphicTools.refresh(); - } app.use(Express.static(path.join(config.get('basePath'), 'dist'))); @@ -74,6 +72,13 @@ function baseServer(routes, createStore, { appInstanceName = appName } = {}) { } app.use((req, res) => { + if (isDevelopment) { + log.info('Running in Development Mode'); + + // clear require() cache if in development mode + webpackIsomorphicTools.refresh(); + } + match({ routes, location: req.url }, (err, redirectLocation, renderProps) => { cookie.plugToRequest(req, res); @@ -87,37 +92,57 @@ function baseServer(routes, createStore, { appInstanceName = appName } = {}) { } const store = createStore(); - const token = cookie.load(config.get('cookieName')); if (token) { store.dispatch(setJWT(token)); } + // Get SRI for deployed services only. + const sriData = (isDeployed) ? JSON.parse( + fs.readFileSync(path.join(config.get('basePath'), 'dist/sri.json')) + ) : {}; + + const lang = res.locals.lang; + const dir = getDirection(lang); + const locale = langToLocale(lang); + + function hydrateOnClient(props = {}) { + const pageProps = { + appName: appInstanceName, + assets: webpackIsomorphicTools.assets(), + htmlLang: lang, + htmlDir: dir, + includeSri: isDeployed, + sriData, + store, + ...props, + }; + + const HTML = ReactDOM.renderToString( + ); + res.send(`\n${HTML}`); + } + + // Set disableSSR to true to debug + // client-side-only render. + if (config.get('disableSSR') === true) { + return Promise.resolve(hydrateOnClient()); + } return loadOnServer({...renderProps, store}) .then(() => { + // eslint-disable-next-line global-require + const jedData = require(`json!../../locale/${locale}/${appInstanceName}.json`); + const i18n = new Jed(jedData); + const InitialComponent = ( - - - + + + + + ); - // Get SRI for deployed services only. - const sriData = (isDeployed) ? JSON.parse( - fs.readFileSync(path.join(config.get('basePath'), 'dist/sri.json')) - ) : {}; - - const pageProps = { - appName: appInstanceName, - assets: webpackIsomorphicTools.assets(), - component: InitialComponent, - head: ReactHelmet.rewind(), - sriData, - includeSri: isDeployed, - store, - }; - - const HTML = ReactDOM.renderToString(); - res.send(`${HTML}`); + return hydrateOnClient({component: InitialComponent}); }) .catch((error) => { log.error({err: error}); diff --git a/src/disco/components/Addon.js b/src/disco/components/Addon.js index 9a112ba8faf..7e8ba356c46 100644 --- a/src/disco/components/Addon.js +++ b/src/disco/components/Addon.js @@ -1,9 +1,9 @@ import classNames from 'classnames'; import React, { PropTypes } from 'react'; import { sprintf } from 'sprintf-js'; +import translate from 'core/i18n/translate'; import themeAction from 'disco/themePreview'; -import { gettext as _ } from 'core/utils'; import InstallButton from 'disco/containers/InstallButton'; import { @@ -19,7 +19,7 @@ import { import 'disco/css/Addon.scss'; -export default class Addon extends React.Component { +export class Addon extends React.Component { static propTypes = { accentcolor: PropTypes.string, closeErrorAction: PropTypes.func, @@ -29,6 +29,7 @@ export default class Addon extends React.Component { headerURL: PropTypes.string, heading: PropTypes.string.isRequired, id: PropTypes.string.isRequired, + i18n: PropTypes.string.isRequired, imageURL: PropTypes.string, name: PropTypes.string.isRequired, slug: PropTypes.string.isRequired, @@ -51,8 +52,8 @@ export default class Addon extends React.Component { } getError() { - const { status } = this.props; - const errorMessage = this.props.errorMessage || _('An unexpected error occurred'); + const { status, i18n } = this.props; + const errorMessage = this.props.errorMessage || i18n.gettext('An unexpected error occurred'); return status === ERROR ? (

{errorMessage}

Close @@ -68,7 +69,7 @@ export default class Addon extends React.Component { } getThemeImage() { - const { name, themeURL } = this.props; + const { i18n, name, themeURL } = this.props; if (this.props.type === THEME_TYPE) { return ( - {sprintf(_('Preview); + {sprintf(i18n.gettext('Preview); } return null; } @@ -130,3 +131,5 @@ export default class Addon extends React.Component { ); } } + +export default translate({withRef: true})(Addon); diff --git a/src/disco/containers/App.js b/src/disco/containers/App.js index cbe1a95b00e..c021eae5243 100644 --- a/src/disco/containers/App.js +++ b/src/disco/containers/App.js @@ -2,23 +2,26 @@ import React, { PropTypes } from 'react'; import Helmet from 'react-helmet'; import 'disco/css/App.scss'; -import { gettext as _ } from 'core/utils'; +import translate from 'core/i18n/translate'; -export default class App extends React.Component { +export class App extends React.Component { static propTypes = { children: PropTypes.node, + i18n: PropTypes.object.isRequired, } render() { - const { children } = this.props; + const { children, i18n } = this.props; return (
{children}
); } } + +export default translate()(App); diff --git a/src/disco/containers/DiscoPane.js b/src/disco/containers/DiscoPane.js index 4857dcbb0b9..23f28f5bd41 100644 --- a/src/disco/containers/DiscoPane.js +++ b/src/disco/containers/DiscoPane.js @@ -1,9 +1,12 @@ +/* eslint-disable max-len */ + import React, { PropTypes } from 'react'; import { connect } from 'react-redux'; import { asyncConnect } from 'redux-async-connect'; -import { gettext as _, camelCaseProps } from 'core/utils'; +import { camelCaseProps } from 'core/utils'; import Addon from 'disco/components/Addon'; +import translate from 'core/i18n/translate'; import videoPoster from 'disco/img/AddOnsPoster.jpg'; import videoMp4 from 'disco/video/AddOns.mp4'; @@ -12,6 +15,7 @@ import videoWebm from 'disco/video/AddOns.webm'; class DiscoPane extends React.Component { static propTypes = { + i18n: PropTypes.object.isRequired, results: PropTypes.arrayOf(PropTypes.object), } @@ -33,7 +37,7 @@ class DiscoPane extends React.Component { } render() { - const { results } = this.props; + const { results, i18n } = this.props; const { showVideo } = this.state; return ( @@ -41,15 +45,15 @@ class DiscoPane extends React.Component {
-

{_('Personalize Your Firefox')}

-

{_(dedent`There are thousands of add-ons that let you make Firefox all your +

{i18n.gettext('Personalize Your Firefox')}

+

{i18n.gettext(dedent`There are thousands of add-ons that let you make Firefox all your own—everything from fun visual themes to powerful tools and features. Here are a few great ones to check out.`)}

@@ -83,4 +87,4 @@ function mapStateToProps(state) { export default asyncConnect([{ deferred: true, promise: loadDataIfNeeded, -}])(connect(mapStateToProps)(DiscoPane)); +}])(connect(mapStateToProps)(translate()(DiscoPane))); diff --git a/src/disco/containers/InstallButton.js b/src/disco/containers/InstallButton.js index cff2069abd3..0c11e5a6774 100644 --- a/src/disco/containers/InstallButton.js +++ b/src/disco/containers/InstallButton.js @@ -1,7 +1,6 @@ import React, { PropTypes } from 'react'; import { connect } from 'react-redux'; - -import { gettext as _ } from 'core/utils'; +import translate from 'core/i18n/translate'; import 'disco/css/InstallButton.scss'; import { AddonManager } from 'disco/addonManager'; @@ -19,6 +18,7 @@ export class InstallButton extends React.Component { handleChange: PropTypes.func, guid: PropTypes.string, install: PropTypes.func.isRequired, + i18n: PropTypes.object.isRequired, installURL: PropTypes.string, uninstall: PropTypes.func.isRequired, url: PropTypes.string, @@ -48,7 +48,7 @@ export class InstallButton extends React.Component { } render() { - const { downloadProgress, slug, status } = this.props; + const { downloadProgress, i18n, slug, status } = this.props; if (!validStates.includes(status)) { throw new Error('Invalid add-on status'); @@ -72,7 +72,7 @@ export class InstallButton extends React.Component { type="checkbox" />
); @@ -128,4 +128,4 @@ export function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(InstallButton); +export default connect(mapStateToProps, mapDispatchToProps)(translate()(InstallButton)); diff --git a/tests/client/core/client/test_client_config.js b/tests/client/core/client/test_client_config.js index 7f3bd9c7b69..f0a5cc4251c 100644 --- a/tests/client/core/client/test_client_config.js +++ b/tests/client/core/client/test_client_config.js @@ -26,7 +26,7 @@ describe('client-config module', () => { it('throws if key is missing', () => { assert.throws(() => { config.get('missing-key'); - }, Error, /Key was not found in clientConfig/); + }, Error, /Key "missing-key" was not found in clientConfig/); }); }); diff --git a/tests/client/core/containers/TestServerHtml.js b/tests/client/core/containers/TestServerHtml.js index 1811caea89b..d94b7bddc6f 100644 --- a/tests/client/core/containers/TestServerHtml.js +++ b/tests/client/core/containers/TestServerHtml.js @@ -43,7 +43,6 @@ describe('', () => { {children} @@ -51,22 +50,24 @@ describe('', () => { } } - function render({ appName = 'disco', includeSri = true, - sriData = fakeSRIData } = {}) { + function render(opts = {}) { const pageProps = { - appName, + appName: 'disco', component: , assets: fakeAssets, - includeSri, + includeSri: true, store: fakeStore, - sriData, + sriData: fakeSRIData, + ...opts, }; return renderIntoDocument(); } it('renders html attrs provided', () => { - const html = findRenderedDOMComponentWithTag(render(), 'html'); - assert.equal(html.getAttribute('lang'), 'wat'); + const html = findRenderedDOMComponentWithTag( + render({htmlLang: 'ar', htmlDir: 'rtl'}), 'html'); + assert.equal(html.getAttribute('lang'), 'ar'); + assert.equal(html.getAttribute('dir'), 'rtl'); }); it('renders css provided', () => { diff --git a/tests/client/core/i18n/TestJedProvider.js b/tests/client/core/i18n/TestJedProvider.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/client/core/i18n/test_middleware.js b/tests/client/core/i18n/test_middleware.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/client/core/i18n/test_translate.js b/tests/client/core/i18n/test_translate.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/client/core/i18n/test_utils.js b/tests/client/core/i18n/test_utils.js new file mode 100644 index 00000000000..5af640ab96a --- /dev/null +++ b/tests/client/core/i18n/test_utils.js @@ -0,0 +1,145 @@ +import * as utils from 'core/i18n/utils'; + + +describe('i18n utils', () => { + describe('normalizeLang()', () => { + it('should normalize standard languages', () => { + assert.equal(utils.normalizeLang('en-us'), 'en-US'); + assert.equal(utils.normalizeLang('AR'), 'ar'); + }); + + it('should cope with a locale input too', () => { + assert.equal(utils.normalizeLang('en_US'), 'en-US'); + }); + + it('should handle a 3 char language', () => { + assert.equal(utils.normalizeLang('HaW'), 'haw'); + }); + + it('should handle a 3 char language with 2 parts', () => { + assert.equal(utils.normalizeLang('SoN-Ml'), 'son-ML'); + }); + + it('should handle a language with 3 parts', () => { + assert.equal(utils.normalizeLang('ja-JP-mac'), 'ja-Mac'); + }); + }); + + describe('normalizeLocale()', () => { + it('should normalize a locale', () => { + assert.equal(utils.normalizeLocale('en_us'), 'en_US'); + assert.equal(utils.normalizeLocale('AR'), 'ar'); + }); + + it('should cope with a language input too', () => { + assert.equal(utils.normalizeLocale('en-us'), 'en_US'); + assert.equal(utils.normalizeLocale('EN-US'), 'en_US'); + }); + }); + + describe('langToLocale()', () => { + it('should convert en-US to en_US', () => { + assert.equal(utils.langToLocale('en-US'), 'en_US'); + }); + + it('should convert sr-Latn to sr_Latn', () => { + assert.equal(utils.langToLocale('sr-Latn'), 'sr_Latn'); + }); + + it('should convert sr-Cyrl-RS to sr_RS', () => { + assert.equal(utils.langToLocale('sr-Cyrl-RS'), 'sr_RS'); + }); + + it('logs if no match found', () => { + const fakeLog = { + error: sinon.stub(), + }; + utils.langToLocale('whatevs-this-is-really-odd', fakeLog); + assert.ok(fakeLog.error.called); + }); + }); + + describe('localeToLang()', () => { + it('should convert en_US to en-US', () => { + assert.equal(utils.localeToLang('en_US'), 'en-US'); + }); + + it('should convert sr_Latn to sr-Latn', () => { + assert.equal(utils.localeToLang('sr_Latn'), 'sr-Latn'); + }); + + it('should convert sr_Cyrl_RS to sr-RS', () => { + assert.equal(utils.localeToLang('sr_Cyrl_RS'), 'sr-RS'); + }); + + it('logs if too many parts found', () => { + const fakeLog = { + error: sinon.stub(), + }; + utils.localeToLang('what_the_heck_is_this', fakeLog); + assert.ok(fakeLog.error.called); + }); + }); + + describe('getLanguage()', () => { + it('should get a standard language ', () => { + assert.equal(utils.getLanguage('ar'), 'ar'); + }); + + it('should convert short form lang to longer', () => { + assert.equal(utils.getLanguage('en'), 'en-US'); + }); + + it('should return the default if lookup not present', () => { + assert.equal(utils.getLanguage('awooga'), 'en-US'); + }); + + it('should return the default if bad type', () => { + assert.equal(utils.getLanguage(1), 'en-US'); + }); + + it('should return a lang if handed a locale', () => { + assert.equal(utils.getLanguage('en_US'), 'en-US'); + }); + }); + + describe('getDirection()', () => { + it('should see ar as rtl', () => { + assert.equal(utils.getDirection('ar'), 'rtl'); + }); + + it('should see en-US as ltr', () => { + assert.equal(utils.getDirection('en-US'), 'ltr'); + }); + + it('should see en as ltr', () => { + assert.equal(utils.getDirection('en'), 'ltr'); + }); + + it('should default to ltr on bad input', () => { + assert.equal(utils.getDirection('whatevs'), 'ltr'); + }); + + it('should default to ltr on bad type', () => { + assert.equal(utils.getDirection(1), 'ltr'); + }); + }); + + describe('isValidLang()', () => { + it('should see en-US as a valid lang', () => { + assert.equal(utils.isValidLang('en-US'), true); + }); + + it('should see incorrect type as invalid lang', () => { + assert.equal(utils.isValidLang(1), false); + }); + + it('should see bogus value as invalid lang', () => { + assert.equal(utils.isValidLang('awooga'), false); + }); + + it('should see pt as a valid lang', () => { + assert.equal(utils.isValidLang('pt'), true); + }); + }); +}); diff --git a/tests/client/disco/components/TestAddon.js b/tests/client/disco/components/TestAddon.js index 84de7ceca78..925f29649f4 100644 --- a/tests/client/disco/components/TestAddon.js +++ b/tests/client/disco/components/TestAddon.js @@ -9,7 +9,8 @@ import { Provider } from 'react-redux'; import { createStore } from 'redux'; import Addon from 'disco/components/Addon'; import { ERROR, THEME_PREVIEW, THEME_RESET_PREVIEW } from 'disco/constants'; -import { stubAddonManager } from 'tests/client/helpers'; +import { stubAddonManager, getFakeI18nInst } from 'tests/client/helpers'; +import I18nProvider from 'core/i18n/Provider'; const result = { id: 'test-id', @@ -24,10 +25,12 @@ const store = createStore((s) => s, {installations: {}, addons: {}}); function renderAddon(data) { return findRenderedComponentWithType(renderIntoDocument( - - - - ), Addon); + + + + + + ), Addon).getWrappedInstance(); } describe('', () => { @@ -61,10 +64,6 @@ describe('', () => { assert.include(root.refs.heading.textContent, 'test-heading'); }); - it('renders the heading', () => { - assert.include(root.refs.heading.textContent, 'test-heading'); - }); - it('renders the editorial description', () => { assert.equal(root.refs['editorial-description'].textContent, 'test-editorial-description'); }); diff --git a/tests/client/disco/containers/TestApp.js b/tests/client/disco/containers/TestApp.js deleted file mode 100644 index 8c054a502c0..00000000000 --- a/tests/client/disco/containers/TestApp.js +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; - -import App from 'disco/containers/App'; -import { shallowRender } from 'tests/client/helpers'; - -describe('App', () => { - it('renders its children', () => { - class MyComponent extends React.Component { - render() { - return

The component

; - } - } - const root = shallowRender(); - assert.equal(root.type, 'div'); - // First child is . - assert.equal(root.props.children[1].type, MyComponent); - }); -}); diff --git a/tests/client/disco/containers/TestDiscoPane.js b/tests/client/disco/containers/TestDiscoPane.js index 5d4686c2a8d..407d8017699 100644 --- a/tests/client/disco/containers/TestDiscoPane.js +++ b/tests/client/disco/containers/TestDiscoPane.js @@ -4,7 +4,9 @@ import { findDOMNode } from 'react-dom'; import { Provider } from 'react-redux'; import createStore from 'disco/store'; import DiscoPane from 'disco/containers/DiscoPane'; -import { stubAddonManager } from 'tests/client/helpers'; +import { stubAddonManager, getFakeI18nInst } from 'tests/client/helpers'; +import I18nProvider from 'core/i18n/Provider'; + describe('AddonPage', () => { beforeEach(() => { @@ -13,9 +15,11 @@ describe('AddonPage', () => { function render() { return findDOMNode(renderIntoDocument( - - - + + + + + )); } diff --git a/tests/client/disco/containers/TestInstallButton.js b/tests/client/disco/containers/TestInstallButton.js index bec83d4aebf..9b701c8451d 100644 --- a/tests/client/disco/containers/TestInstallButton.js +++ b/tests/client/disco/containers/TestInstallButton.js @@ -17,17 +17,23 @@ import { UNINSTALLING, UNKNOWN, } from 'disco/constants'; -import { stubAddonManager } from 'tests/client/helpers'; +import { stubAddonManager, getFakeI18nInst } from 'tests/client/helpers'; import config from 'config'; describe('', () => { - function renderButton({ - dispatch = sinon.spy(), setInitialStatus = sinon.spy(), install = sinon.spy(), - uninstall = sinon.spy(), ...props, - }) { + function renderButton(props = {}) { + const renderProps = { + dispatch: sinon.spy(), + setInitialStatus: sinon.spy(), + install: sinon.spy(), + uninstall: sinon.spy(), + i18n: getFakeI18nInst(), + ...props, + }; + return renderIntoDocument( - ); + ); } it('should be disabled if isDisabled status is UNKNOWN', () => { diff --git a/tests/client/helpers.js b/tests/client/helpers.js index e615d34d236..e9b7dced8ba 100644 --- a/tests/client/helpers.js +++ b/tests/client/helpers.js @@ -32,3 +32,19 @@ export function stubAddonManager({ getAddon = Promise.resolve() } = {}) { export function unexpectedSuccess() { return assert.fail(null, null, 'Unexpected success'); } + +/* + * Creates a stand-in for a jed instance, + */ +export function getFakeI18nInst() { + return { + gettext: sinon.stub(), + dgettext: sinon.stub(), + ngettext: sinon.stub(), + dngettext: sinon.stub(), + pgettext: sinon.stub(), + dpgettext: sinon.stub(), + npgettext: sinon.stub(), + dnpgettext: sinon.stub(), + }; +} diff --git a/webpack-isomorphic-tools-config.js b/webpack-isomorphic-tools-config.js index e3953ed37d0..bd06d184522 100644 --- a/webpack-isomorphic-tools-config.js +++ b/webpack-isomorphic-tools-config.js @@ -5,6 +5,12 @@ const WebpackIsomorphicToolsPlugin = require('webpack-isomorphic-tools/plugin'); module.exports = { debug: false, assets: { + translations: { + extensions: [ + 'po', + ], + parser: WebpackIsomorphicToolsPlugin.url_loader_parser, + }, images: { extensions: [ 'jpeg', diff --git a/webpack.l10n.config.babel.js b/webpack.l10n.config.babel.js index d0a1c39fb22..4e38cf318a4 100644 --- a/webpack.l10n.config.babel.js +++ b/webpack.l10n.config.babel.js @@ -43,14 +43,14 @@ const babelL10nPlugins = [ 'plural-forms': 'nplurals=2; plural=(n!=1);', }, functionNames: { - _: ['msgid'], - dgettext: ['domain', 'msgid'], - ngettext: ['msgid', 'msgid_plural', 'count'], - dngettext: ['domain', 'msgid', 'msgid_plural', 'count'], - pgettext: ['msgctxt', 'msgid'], - dpgettext: ['domain', 'msgctxt', 'msgid'], - npgettext: ['msgctxt', 'msgid', 'msgid_plural', 'count'], - dnpgettext: ['domain', 'msgctxt', 'msgid', 'msgid_plural', 'count'], + 'i18n.gettext': ['msgid'], + 'i18n.dgettext': ['domain', 'msgid'], + 'i18n.ngettext': ['msgid', 'msgid_plural', 'count'], + 'i18n.dngettext': ['domain', 'msgid', 'msgid_plural', 'count'], + 'i18n.pgettext': ['msgctxt', 'msgid'], + 'i18n.dpgettext': ['domain', 'msgctxt', 'msgid'], + 'i18n.npgettext': ['msgctxt', 'msgid', 'msgid_plural', 'count'], + 'i18n.dnpgettext': ['domain', 'msgctxt', 'msgid', 'msgid_plural', 'count'], }, fileName: `locale/templates/LC_MESSAGES/${appName}.pot`, baseDirectory: process.cwd(), From c575950ae9d1d66502fa29074eaf0364c9af5165 Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Wed, 25 May 2016 14:33:28 +0100 Subject: [PATCH 05/12] Fix i18n function names so extraction still works --- webpack.l10n.config.babel.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/webpack.l10n.config.babel.js b/webpack.l10n.config.babel.js index 4e38cf318a4..8bc3f00981a 100644 --- a/webpack.l10n.config.babel.js +++ b/webpack.l10n.config.babel.js @@ -43,14 +43,14 @@ const babelL10nPlugins = [ 'plural-forms': 'nplurals=2; plural=(n!=1);', }, functionNames: { - 'i18n.gettext': ['msgid'], - 'i18n.dgettext': ['domain', 'msgid'], - 'i18n.ngettext': ['msgid', 'msgid_plural', 'count'], - 'i18n.dngettext': ['domain', 'msgid', 'msgid_plural', 'count'], - 'i18n.pgettext': ['msgctxt', 'msgid'], - 'i18n.dpgettext': ['domain', 'msgctxt', 'msgid'], - 'i18n.npgettext': ['msgctxt', 'msgid', 'msgid_plural', 'count'], - 'i18n.dnpgettext': ['domain', 'msgctxt', 'msgid', 'msgid_plural', 'count'], + gettext: ['msgid'], + dgettext: ['domain', 'msgid'], + ngettext: ['msgid', 'msgid_plural', 'count'], + dngettext: ['domain', 'msgid', 'msgid_plural', 'count'], + pgettext: ['msgctxt', 'msgid'], + dpgettext: ['domain', 'msgctxt', 'msgid'], + npgettext: ['msgctxt', 'msgid', 'msgid_plural', 'count'], + dnpgettext: ['domain', 'msgctxt', 'msgid', 'msgid_plural', 'count'], }, fileName: `locale/templates/LC_MESSAGES/${appName}.pot`, baseDirectory: process.cwd(), From 80a04931e63bcaa64fe9fccb7541e1cd3178c4f3 Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Wed, 25 May 2016 14:46:22 +0100 Subject: [PATCH 06/12] Fix locale-create script --- bin/create-locales | 4 ++-- src/core/i18n/utils.js | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/bin/create-locales b/bin/create-locales index 37fa0aea99f..eff6351e05e 100755 --- a/bin/create-locales +++ b/bin/create-locales @@ -17,7 +17,7 @@ const templateDir = path.join(localeDir, 'templates/LC_MESSAGES'); const potFiles = glob.sync(`${templateDir}/*.pot`); require('babel-register'); -const localeFromLang = require('src/core/i18n/utils').localeFromLang; +const langToLocale = require('../src/core/i18n/utils').langToLocale; let lang; let locale; @@ -26,7 +26,7 @@ let fileName; let outputFile; for (lang of supportedLangs) { - locale = localeFromLang(lang); + locale = langToLocale(lang); shell.exec(`mkdir -p ${localeDir}/${locale}/LC_MESSAGES/`); for (potFile of potFiles) { fileName = path.basename(potFile, '.pot'); diff --git a/src/core/i18n/utils.js b/src/core/i18n/utils.js index b474dc65c75..b4baeeae16f 100644 --- a/src/core/i18n/utils.js +++ b/src/core/i18n/utils.js @@ -1,5 +1,6 @@ +/* eslint-disable no-console */ + import config from 'config'; -import log from 'core/logger'; const defaultLang = config.get('defaultLang'); const langs = config.get('langs'); @@ -8,7 +9,7 @@ const validLangs = langs.concat(Object.keys(langMap)); const rtlLangs = config.get('rtlLangs'); -export function localeToLang(locale, log_ = log) { +export function localeToLang(locale, log_ = console) { let lang = ''; if (locale && locale.split) { const parts = locale.split('_'); @@ -29,7 +30,7 @@ export function localeToLang(locale, log_ = log) { return lang; } -export function langToLocale(language, log_ = log) { +export function langToLocale(language, log_ = console) { let locale = ''; if (language && language.split) { const parts = language.split('-'); From f0ccdcb6c3da8e5e3983c0c6f04f1167ecd2a1e9 Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Wed, 25 May 2016 17:09:31 +0100 Subject: [PATCH 07/12] Add test coverage for the provider and translate wrapper --- src/core/i18n/Provider.js | 6 -- src/core/i18n/translate.js | 4 -- tests/client/core/i18n/TestI18nProvider.js | 69 ++++++++++++++++++++++ tests/client/core/i18n/TestJedProvider.js | 0 tests/client/core/i18n/test_middleware.js | 58 ++++++++++++++++++ tests/client/core/i18n/test_translate.js | 0 6 files changed, 127 insertions(+), 10 deletions(-) create mode 100644 tests/client/core/i18n/TestI18nProvider.js delete mode 100644 tests/client/core/i18n/TestJedProvider.js delete mode 100644 tests/client/core/i18n/test_translate.js diff --git a/src/core/i18n/Provider.js b/src/core/i18n/Provider.js index 22279e44e1b..7e0a2da9dd5 100644 --- a/src/core/i18n/Provider.js +++ b/src/core/i18n/Provider.js @@ -24,12 +24,6 @@ export default class I18nProvider extends Component { return { i18n: this.i18n }; } - componentWillReceiveProps(nextProps) { - if (this.props.i18n !== nextProps.i18n) { - throw new Error('Mutating the i18n object is not allowed'); - } - } - render() { const { children } = this.props; return Children.only(children); diff --git a/src/core/i18n/translate.js b/src/core/i18n/translate.js index 20a119825e7..ea14d2d5237 100644 --- a/src/core/i18n/translate.js +++ b/src/core/i18n/translate.js @@ -23,10 +23,6 @@ export default function translate(options = {}) { return { i18n: this.i18n }; } - componentWillUnmount() { - this.mounted = false; - } - getWrappedInstance() { if (!withRef) { throw new Error(dedent`To access the wrapped instance, you need to specify diff --git a/tests/client/core/i18n/TestI18nProvider.js b/tests/client/core/i18n/TestI18nProvider.js new file mode 100644 index 00000000000..c3af54ca224 --- /dev/null +++ b/tests/client/core/i18n/TestI18nProvider.js @@ -0,0 +1,69 @@ +/* eslint-disable react/no-multi-comp */ +import React, { Component, PropTypes } from 'react'; + +import I18nProvider from 'core/i18n/Provider'; +import translate from 'core/i18n/translate'; +import { getFakeI18nInst } from 'tests/client/helpers'; +import { + renderIntoDocument, + findRenderedComponentWithType, +} from 'react-addons-test-utils'; + + +class OuterComponent extends Component { + static propTypes = { + children: PropTypes.element.isRequired, + } + render() { + const { children } = this.props; + return
{children}
; + } +} + +class InnerComponent extends Component { + static propTypes = { + i18n: PropTypes.object.isRequired, + } + render() { + const { i18n } = this.props; + return
{i18n.gettext('hai')}
; + } +} + + +describe('I18nProvider', () => { + let i18nInst; + let MyComponent; + + function render(props) { + const defaultProps = { + i18n: getFakeI18nInst(), + MyComponent: translate()(InnerComponent), + ...props, + }; + + MyComponent = defaultProps.MyComponent; + i18nInst = defaultProps.i18n; + + return renderIntoDocument( + + + + + + ); + } + + it('should call i18n.gettext in the component view', () => { + render(); + assert.ok(i18nInst.gettext.called); + }); + + it('should see an exception calling getWrappedInstance without withRef', () => { + const root = render(); + const wrappedComponent = findRenderedComponentWithType(root, MyComponent); + assert.throws(() => { + wrappedComponent.getWrappedInstance(); + }, Error, 'To access the wrapped instance'); + }); +}); diff --git a/tests/client/core/i18n/TestJedProvider.js b/tests/client/core/i18n/TestJedProvider.js deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/client/core/i18n/test_middleware.js b/tests/client/core/i18n/test_middleware.js index e69de29bb2d..71375902c81 100644 --- a/tests/client/core/i18n/test_middleware.js +++ b/tests/client/core/i18n/test_middleware.js @@ -0,0 +1,58 @@ +import setLanguage from 'core/i18n/middleware'; + +describe('i18n middlware', () => { + let res; + + beforeEach(() => { + res = { + locals: {}, + }; + }); + + it('should call next()', () => { + const fakeNext = sinon.stub(); + const req = {}; + setLanguage(req, res, fakeNext); + assert.ok(fakeNext.called); + }); + + it('should default to en-US', () => { + const fakeNext = sinon.stub(); + const req = {}; + setLanguage(req, res, fakeNext); + assert.equal(res.locals.lang, 'en-US'); + }); + + it('should set lang based on query-string', () => { + const fakeNext = sinon.stub(); + const req = { + query: { + lang: 'pt-PT', + }, + }; + setLanguage(req, res, fakeNext); + assert.equal(res.locals.lang, 'pt-PT'); + }); + + it('should provide default if bogus value', () => { + const fakeNext = sinon.stub(); + const req = { + query: { + lang: 'whatevs', + }, + }; + setLanguage(req, res, fakeNext); + assert.equal(res.locals.lang, 'en-US'); + }); + + it('should provide default if bogus type', () => { + const fakeNext = sinon.stub(); + const req = { + query: { + lang: 1, + }, + }; + setLanguage(req, res, fakeNext); + assert.equal(res.locals.lang, 'en-US'); + }); +}); diff --git a/tests/client/core/i18n/test_translate.js b/tests/client/core/i18n/test_translate.js deleted file mode 100644 index e69de29bb2d..00000000000 From b33765eec45feeb4fa7dc841f9651834e758e427 Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Wed, 25 May 2016 18:56:23 +0100 Subject: [PATCH 08/12] Re-instate disco App test --- src/disco/containers/App.js | 2 +- tests/client/disco/containers/TestApp.js | 32 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 tests/client/disco/containers/TestApp.js diff --git a/src/disco/containers/App.js b/src/disco/containers/App.js index c021eae5243..e520d897450 100644 --- a/src/disco/containers/App.js +++ b/src/disco/containers/App.js @@ -24,4 +24,4 @@ export class App extends React.Component { } } -export default translate()(App); +export default translate({withRef: true})(App); diff --git a/tests/client/disco/containers/TestApp.js b/tests/client/disco/containers/TestApp.js new file mode 100644 index 00000000000..f1ba31beb56 --- /dev/null +++ b/tests/client/disco/containers/TestApp.js @@ -0,0 +1,32 @@ +import React from 'react'; +import { findDOMNode } from 'react-dom'; +import { + findRenderedComponentWithType, + renderIntoDocument, +} from 'react-addons-test-utils'; + +import App from 'disco/containers/App'; +import I18nProvider from 'core/i18n/Provider'; + +import { getFakeI18nInst } from 'tests/client/helpers'; + + +describe('App', () => { + it('renders its children', () => { + class MyComponent extends React.Component { + render() { + return

The component

; + } + } + const root = findRenderedComponentWithType(renderIntoDocument( + + + + + ), App).getWrappedInstance(); + + const rootNode = findDOMNode(root); + assert.equal(rootNode.tagName.toLowerCase(), 'div'); + assert.equal(rootNode.querySelector('p').textContent, 'The component'); + }); +}); From 223205ff81be9ceed2ad3d3ffcc5db244eab6906 Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Wed, 25 May 2016 19:02:36 +0100 Subject: [PATCH 09/12] remove the lockfile --- bin/build-locales | 55 +++++++++-------------------------------------- 1 file changed, 10 insertions(+), 45 deletions(-) diff --git a/bin/build-locales b/bin/build-locales index 46cf5911bc4..fb6ee43c5ec 100755 --- a/bin/build-locales +++ b/bin/build-locales @@ -5,7 +5,6 @@ const fs = require('fs'); -const os = require('os'); const path = require('path'); const config = require('config'); const po2json = require('po2json'); @@ -21,51 +20,17 @@ if (!appName) { process.exit(1); } -function createLockFile(lockFilePath) { - const fd = fs.openSync(lockFilePath, 'w'); - fs.closeSync(fd); -} - -function removeLockFile(lockFilePath) { - fs.unlinkSync(lockFilePath); -} - -function lockFileExists(lockFilePath) { - var fileExists = false; - try { - fs.statSync(lockFilePath); - fileExists = true; - } catch (e) { - if (e.code !== 'ENOENT') { - throw e; - } - } - return fileExists; -} - -const lockFileName = `${appName}-build-locales.lock`; -const lockFilePath = path.join(os.tmpdir(), lockFileName); const localeDir = path.join(__dirname, '../locale'); const poFiles = glob.sync(`${localeDir}/**/${appName}.po`); const dest = path.join(__dirname, '../src/locale/'); -if (lockFileExists(lockFilePath)) { - throw new Error(`Lock file exists at: ${lockFilePath} Aborting!`); -} - -createLockFile(lockFilePath); - -try { - poFiles.forEach((pofile) => { - const dir = path.dirname(pofile); - const subdir = path.dirname(dir); - const locale = path.basename(subdir); - const stem = path.basename(pofile, '.po'); - const jsonfile = path.join(dest, locale, `${stem}.json`); - shelljs.mkdir('-p', path.join(dest, locale)); - const json = po2json.parseFileSync(pofile, { stringify: true, pretty: true, format: 'jed1.x' }); - fs.writeFileSync(jsonfile, json); - }); -} finally { - removeLockFile(lockFilePath); -} +poFiles.forEach((pofile) => { + const dir = path.dirname(pofile); + const subdir = path.dirname(dir); + const locale = path.basename(subdir); + const stem = path.basename(pofile, '.po'); + const jsonfile = path.join(dest, locale, `${stem}.json`); + shelljs.mkdir('-p', path.join(dest, locale)); + const json = po2json.parseFileSync(pofile, { stringify: true, pretty: true, format: 'jed1.x' }); + fs.writeFileSync(jsonfile, json); +}); From ede4efc357050bf5c24e94a75ca87fc994286274 Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Wed, 25 May 2016 21:31:24 +0100 Subject: [PATCH 10/12] Add jed dep --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index fd77746faa6..628b8c1a139 100644 --- a/package.json +++ b/package.json @@ -127,6 +127,7 @@ "extract-text-webpack-plugin": "1.0.1", "helmet": "2.1.0", "isomorphic-fetch": "2.2.1", + "jed": "1.1.0", "normalize.css": "4.1.1", "normalizr": "2.1.0", "piping": "0.3.2", From 8fb2e6631eb84c46ddd62a7c7ce8c92d9f143ffa Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Thu, 26 May 2016 11:44:55 +0100 Subject: [PATCH 11/12] Clean up translate --- src/core/i18n/translate.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/core/i18n/translate.js b/src/core/i18n/translate.js index ea14d2d5237..a541bf395ac 100644 --- a/src/core/i18n/translate.js +++ b/src/core/i18n/translate.js @@ -19,10 +19,6 @@ export default function translate(options = {}) { }; } - getChildContext() { - return { i18n: this.i18n }; - } - getWrappedInstance() { if (!withRef) { throw new Error(dedent`To access the wrapped instance, you need to specify @@ -38,10 +34,7 @@ export default function translate(options = {}) { extraProps.ref = 'wrappedInstance'; } - return React.createElement( - WrappedComponent, - { ...this.props, ...extraProps } - ); + return ; } } From 4102d7332e25867e4dd07175d1f176e39121a227 Mon Sep 17 00:00:00 2001 From: Stuart Colville Date: Thu, 26 May 2016 12:38:10 +0100 Subject: [PATCH 12/12] Remove unecessary config --- webpack-isomorphic-tools-config.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/webpack-isomorphic-tools-config.js b/webpack-isomorphic-tools-config.js index bd06d184522..e3953ed37d0 100644 --- a/webpack-isomorphic-tools-config.js +++ b/webpack-isomorphic-tools-config.js @@ -5,12 +5,6 @@ const WebpackIsomorphicToolsPlugin = require('webpack-isomorphic-tools/plugin'); module.exports = { debug: false, assets: { - translations: { - extensions: [ - 'po', - ], - parser: WebpackIsomorphicToolsPlugin.url_loader_parser, - }, images: { extensions: [ 'jpeg',