From d8042552d843b1962f48f7e9aeac3d1e2955be69 Mon Sep 17 00:00:00 2001 From: HF Date: Wed, 13 Dec 2023 02:04:55 +0100 Subject: [PATCH] move langage-code-to-country-code mapping into ssr filename --- i18n/README.md | 2 ++ i18n/{ssr-be.po => ssr-be-by.po} | 0 i18n/{ssr-ca.po => ssr-ca-ct.po} | 0 i18n/{ssr-da.po => ssr-da-dk.po} | 0 i18n/{ssr-fa.po => ssr-fa-ir.po} | 0 i18n/{ssr-hy.po => ssr-hy-am.po} | 0 i18n/{ssr-kk.po => ssr-kk-kz.po} | 0 i18n/{ssr-sr.po => ssr-sr-rs.po} | 0 i18n/template-ssr.pot | 8 ++--- src/core/ttag.js | 42 +++++++++++++++++++++++++-- src/ssr/Main.jsx | 9 +----- src/ssr/PopUp.jsx | 9 +----- src/utils/location.js | 50 -------------------------------- 13 files changed, 48 insertions(+), 72 deletions(-) rename i18n/{ssr-be.po => ssr-be-by.po} (100%) rename i18n/{ssr-ca.po => ssr-ca-ct.po} (100%) rename i18n/{ssr-da.po => ssr-da-dk.po} (100%) rename i18n/{ssr-fa.po => ssr-fa-ir.po} (100%) rename i18n/{ssr-hy.po => ssr-hy-am.po} (100%) rename i18n/{ssr-kk.po => ssr-kk-kz.po} (100%) rename i18n/{ssr-sr.po => ssr-sr-rs.po} (100%) delete mode 100644 src/utils/location.js diff --git a/i18n/README.md b/i18n/README.md index 34ed27f..687366f 100644 --- a/i18n/README.md +++ b/i18n/README.md @@ -6,6 +6,8 @@ Translation files can be created out of the templates [template.pot](https://git All translated languages get an own chat channel that just people who use this language can access. +If a language code differs from the country code of a wanted flag, it can be defined in the ssr filename, like `ssr-en-gb.po` would be the english language, with the flag of Great Britain. + ## With poedit ### Create new translation diff --git a/i18n/ssr-be.po b/i18n/ssr-be-by.po similarity index 100% rename from i18n/ssr-be.po rename to i18n/ssr-be-by.po diff --git a/i18n/ssr-ca.po b/i18n/ssr-ca-ct.po similarity index 100% rename from i18n/ssr-ca.po rename to i18n/ssr-ca-ct.po diff --git a/i18n/ssr-da.po b/i18n/ssr-da-dk.po similarity index 100% rename from i18n/ssr-da.po rename to i18n/ssr-da-dk.po diff --git a/i18n/ssr-fa.po b/i18n/ssr-fa-ir.po similarity index 100% rename from i18n/ssr-fa.po rename to i18n/ssr-fa-ir.po diff --git a/i18n/ssr-hy.po b/i18n/ssr-hy-am.po similarity index 100% rename from i18n/ssr-hy.po rename to i18n/ssr-hy-am.po diff --git a/i18n/ssr-kk.po b/i18n/ssr-kk-kz.po similarity index 100% rename from i18n/ssr-kk.po rename to i18n/ssr-kk-kz.po diff --git a/i18n/ssr-sr.po b/i18n/ssr-sr-rs.po similarity index 100% rename from i18n/ssr-sr.po rename to i18n/ssr-sr-rs.po diff --git a/i18n/template-ssr.pot b/i18n/template-ssr.pot index bc12dc4..59ec29a 100644 --- a/i18n/template-ssr.pot +++ b/i18n/template-ssr.pot @@ -98,19 +98,19 @@ msgstr "" msgid "Loading..." msgstr "" -#: src/ssr/PopUp.jsx:62 +#: src/ssr/PopUp.jsx:55 msgid "ppfun" msgstr "" -#: src/ssr/PopUp.jsx:63 +#: src/ssr/PopUp.jsx:56 msgid "PixelPlanet.Fun PopUp" msgstr "" -#: src/ssr/Main.jsx:71 +#: src/ssr/Main.jsx:64 msgid "PixelPlanet.Fun" msgstr "" -#: src/ssr/Main.jsx:72 +#: src/ssr/Main.jsx:65 msgid "Place color pixels on an map styled canvas with other players online" msgstr "" diff --git a/src/core/ttag.js b/src/core/ttag.js index 34fa858..fb6e209 100644 --- a/src/core/ttag.js +++ b/src/core/ttag.js @@ -4,7 +4,6 @@ import { TTag } from 'ttag'; import cookie from 'cookie'; -import { languageFromLocalisation } from '../utils/location'; import { getLangsOfJsAsset } from './assets'; // eslint-disable-next-line max-len @@ -12,23 +11,37 @@ const localeImports = require.context('../../i18n', false, /^\.[/\\]ssr-.+\.po$/ const ttags = {}; +export const availableLangs = []; + (() => { const langs = localeImports.keys(); const jsLangs = getLangsOfJsAsset('client'); if (jsLangs.includes('en')) { ttags.en = new TTag(); + availableLangs.push(['en', 'gb']); } for (let i = 0; i < langs.length; i += 1) { const file = langs[i]; // ./ssr-de.po - const lang = file.replace('./ssr-', '').replace('.po', '').toLowerCase(); + let lang = file.replace('./ssr-', '').replace('.po', '').toLowerCase(); + let flag = lang; + /* + * in cases where the language code and country code differ, + * the country code can be given seperately in the file name + * i.e.: ./ssr-en-gb.po + */ + const seperator = lang.indexOf('-'); + if (seperator !== -1) { + [lang, flag] = lang.split('-'); + } if (jsLangs.includes(lang)) { const ttag = new TTag(); ttag.addLocale(lang, localeImports(file).default); ttag.useLocale(lang); ttags[lang] = ttag; + availableLangs.push([lang, flag]); } } })(); @@ -37,6 +50,31 @@ export function getTTag(lang) { return ttags[lang] || ttags.en || Object.values(ttags)[0]; } +/* + * gets preferred language out of localisation string + * @param location string (like from accept-language header) + * @return language code + */ +function languageFromLocalisation(localisation) { + if (!localisation) { + return 'en'; + } + let lang = localisation; + let i = lang.indexOf('-'); + if (i !== -1) { + lang = lang.slice(0, i); + } + i = lang.indexOf(','); + if (i !== -1) { + lang = lang.slice(0, i); + } + i = lang.indexOf(';'); + if (i !== -1) { + lang = lang.slice(0, i); + } + return lang.toLowerCase(); +} + /* * express middleware for getting language * It checks the lang cookie, and if not present, diff --git a/src/ssr/Main.jsx b/src/ssr/Main.jsx index 141e8b6..3b5abbe 100644 --- a/src/ssr/Main.jsx +++ b/src/ssr/Main.jsx @@ -6,19 +6,12 @@ import { createHash } from 'crypto'; import etag from 'etag'; -import { langCodeToCC } from '../utils/location'; -import ttags, { getTTag } from '../core/ttag'; +import { getTTag, availableLangs as langs } from '../core/ttag'; import { getJsAssets, getCssAssets } from '../core/assets'; import socketEvents from '../socket/socketEvents'; import { BACKUP_URL } from '../core/config'; import { getHostFromRequest } from '../utils/ip'; -/* - * generate language list - */ -const langs = Object.keys(ttags) - .map((l) => [l, langCodeToCC(l)]); - /* * values that we pass to client scripts */ diff --git a/src/ssr/PopUp.jsx b/src/ssr/PopUp.jsx index b27bf55..dbe6ea2 100644 --- a/src/ssr/PopUp.jsx +++ b/src/ssr/PopUp.jsx @@ -6,19 +6,12 @@ /* eslint-disable max-len */ import etag from 'etag'; -import { langCodeToCC } from '../utils/location'; -import ttags, { getTTag } from '../core/ttag'; +import { getTTag, availableLangs as langs } from '../core/ttag'; import socketEvents from '../socket/socketEvents'; import { getJsAssets, getCssAssets } from '../core/assets'; import { BACKUP_URL } from '../core/config'; import { getHostFromRequest } from '../utils/ip'; -/* - * generate language list - */ -const langs = Object.keys(ttags) - .map((l) => [l, langCodeToCC(l)]); - /* * values that we pass to client scripts */ diff --git a/src/utils/location.js b/src/utils/location.js deleted file mode 100644 index ad02c1f..0000000 --- a/src/utils/location.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * provide location and lang specific features - */ - -/* - * gets preferred language out of localisation string - * @param location string (like from accept-language header) - * @return language code - */ -export function languageFromLocalisation(localisation) { - if (!localisation) { - return 'en'; - } - let lang = localisation; - let i = lang.indexOf('-'); - if (i !== -1) { - lang = lang.slice(0, i); - } - i = lang.indexOf(','); - if (i !== -1) { - lang = lang.slice(0, i); - } - i = lang.indexOf(';'); - if (i !== -1) { - lang = lang.slice(0, i); - } - return lang.toLowerCase(); -} - -/* - * get country code to language code for displaying flags - * to languages - * @param lang 2-char lang code - * @return 2-char country code - */ -const lang2CC = { - en: 'gb', - dz: 'bt', - hy: 'am', - uk: 'ua', - ca: 'ct', - sr: 'rs', - be: 'by', - kk: 'kz', - da: 'dk', - fa: 'ir', -}; -export function langCodeToCC(lang) { - return lang2CC[lang] || lang; -}