Add script translations to labels

This commit is contained in:
Quincy Morgan
2019-08-02 11:17:39 -04:00
parent ab68303a1f
commit 8cc9ca6aa6
4 changed files with 146 additions and 98 deletions
+85 -85
View File
File diff suppressed because one or more lines are too long
+30 -4
View File
@@ -29,6 +29,8 @@ const sourceCommunity = YAML.load(fs.readFileSync('./node_modules/osm-community-
const cldrMainDir = './node_modules/cldr-localenames-full/main/'; const cldrMainDir = './node_modules/cldr-localenames-full/main/';
var referencedScripts = [];
const languageInfo = { const languageInfo = {
dataLanguages: getLangNamesInNativeLang() dataLanguages: getLangNamesInNativeLang()
}; };
@@ -50,7 +52,7 @@ asyncMap(resources, getResource, function(err, results) {
// write files and fetch language info for each locale // write files and fetch language info for each locale
var dataLocales = { var dataLocales = {
en: { rtl: false, languageNames: foreignLanguageNamesInLanguageOf('en') } en: { rtl: false, languageNames: languageNamesInLanguageOf('en'), scriptNames: scriptNamesInLanguageOf('en') }
}; };
asyncMap(Object.keys(allStrings), asyncMap(Object.keys(allStrings),
function(code, done) { function(code, done) {
@@ -69,8 +71,11 @@ asyncMap(resources, getResource, function(err, results) {
} else if (code === 'ku') { } else if (code === 'ku') {
rtl = false; rtl = false;
} }
var langTranslations = foreignLanguageNamesInLanguageOf(code); dataLocales[code] = {
dataLocales[code] = { rtl: rtl, languageNames: langTranslations || {} }; rtl: rtl,
languageNames: languageNamesInLanguageOf(code) || {},
scriptNames: scriptNamesInLanguageOf(code) || {}
};
done(); done();
}); });
} }
@@ -230,6 +235,8 @@ function getLangNamesInNativeLang() {
var script = identity.script; var script = identity.script;
if (script) { if (script) {
referencedScripts.push(script);
info.base = identity.language; info.base = identity.language;
info.script = script; info.script = script;
} }
@@ -250,7 +257,7 @@ function getLangNamesInNativeLang() {
var rematchCodes = { 'ar-AA': 'ar', 'zh-CN': 'zh', 'zh-HK': 'zh-Hant-HK', 'zh-TW': 'zh', 'pt-BR': 'pt', 'pt': 'pt-PT' }; var rematchCodes = { 'ar-AA': 'ar', 'zh-CN': 'zh', 'zh-HK': 'zh-Hant-HK', 'zh-TW': 'zh', 'pt-BR': 'pt', 'pt': 'pt-PT' };
function foreignLanguageNamesInLanguageOf(code) { function languageNamesInLanguageOf(code) {
if (rematchCodes[code]) code = rematchCodes[code]; if (rematchCodes[code]) code = rematchCodes[code];
@@ -284,3 +291,22 @@ function foreignLanguageNamesInLanguageOf(code) {
return translatedLangsByCode; return translatedLangsByCode;
} }
function scriptNamesInLanguageOf(code) {
if (rematchCodes[code]) code = rematchCodes[code];
var languageFilePath = cldrMainDir + code + '/scripts.json';
if (!fs.existsSync(languageFilePath)) {
return null;
}
var allTranslatedScriptsByCode = JSON.parse(fs.readFileSync(languageFilePath, 'utf8')).main[code].localeDisplayNames.scripts;
var translatedScripts = {};
referencedScripts.forEach(function(script) {
if (!allTranslatedScriptsByCode[script] || script === allTranslatedScriptsByCode[script]) return;
translatedScripts[script] = allTranslatedScriptsByCode[script];
});
return translatedScripts;
}
+2 -1
View File
@@ -1,4 +1,4 @@
import { currentLocale, setTextDirection, setLanguageNames } from './locale'; import { currentLocale, setTextDirection, setLanguageNames, setScriptNames } from './locale';
import { dataLocales } from '../../data/index'; import { dataLocales } from '../../data/index';
import { utilStringQs } from './util'; import { utilStringQs } from './util';
@@ -105,6 +105,7 @@ export function utilDetect(force) {
} }
setTextDirection(detected.textDirection); setTextDirection(detected.textDirection);
setLanguageNames((lang && lang.languageNames) || {}); setLanguageNames((lang && lang.languageNames) || {});
setScriptNames((lang && lang.scriptNames) || {});
// detect host // detect host
var loc = window.top.location; var loc = window.top.location;
+29 -8
View File
@@ -5,6 +5,7 @@ var translations = Object.create(null);
export var currentLocale = 'en'; export var currentLocale = 'en';
export var textDirection = 'ltr'; export var textDirection = 'ltr';
export var languageNames = {}; export var languageNames = {};
export var scriptNames = {};
export function setLocale(val) { export function setLocale(val) {
if (translations[val] !== undefined) { if (translations[val] !== undefined) {
@@ -81,21 +82,41 @@ export function setLanguageNames(obj) {
languageNames = obj; languageNames = obj;
} }
export function setScriptNames(obj) {
scriptNames = obj;
}
export function languageName(code, options) { export function languageName(code, options) {
if (languageNames[code]) { // name in locale langauge if (languageNames[code]) { // name in locale langauge
// e.g. German
return languageNames[code]; return languageNames[code];
} }
// sometimes we only want the local name // sometimes we only want the local name
if (options && options.localOnly) return null; if (options && options.localOnly) return null;
if (dataLanguages[code]) { // language info var langInfo = dataLanguages[code];
if (dataLanguages[code].nativeName) { // name in native language
return t('translate.language_and_code', { language: dataLanguages[code].nativeName, code: code }); if (langInfo) {
} else if (dataLanguages[code].base && dataLanguages[code].script) { if (langInfo.nativeName) { // name in native language
var base = dataLanguages[code].base;
if (languageNames[base]) { // base name in locale langauge // e.g. Deutsch (de)
return t('translate.language_and_code', { language: languageNames[base], code: code }); return t('translate.language_and_code', { language: langInfo.nativeName, code: code });
} else if (dataLanguages[code] && dataLanguages[code].nativeName) {
} else if (langInfo.base && langInfo.script) {
var base = langInfo.base; // the code of the langauge this is based on
if (languageNames[base]) { // base language name in locale langauge
var scriptCode = langInfo.script;
var script = scriptNames[scriptCode] || scriptCode;
// e.g. Serbian (Cyrillic)
return t('translate.language_and_code', { language: languageNames[base], code: script });
} else if (dataLanguages[base] && dataLanguages[base].nativeName) {
// e.g. српски (sr-Cyrl)
return t('translate.language_and_code', { language: dataLanguages[base].nativeName, code: code }); return t('translate.language_and_code', { language: dataLanguages[base].nativeName, code: code });
} }
} }