move langage-code-to-country-code mapping into ssr filename

This commit is contained in:
HF 2023-12-13 02:04:55 +01:00
parent 3895bf292a
commit d8042552d8
13 changed files with 48 additions and 72 deletions

View File

@ -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. 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 ## With poedit
### Create new translation ### Create new translation

View File

@ -98,19 +98,19 @@ msgstr ""
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr ""
#: src/ssr/PopUp.jsx:62 #: src/ssr/PopUp.jsx:55
msgid "ppfun" msgid "ppfun"
msgstr "" msgstr ""
#: src/ssr/PopUp.jsx:63 #: src/ssr/PopUp.jsx:56
msgid "PixelPlanet.Fun PopUp" msgid "PixelPlanet.Fun PopUp"
msgstr "" msgstr ""
#: src/ssr/Main.jsx:71 #: src/ssr/Main.jsx:64
msgid "PixelPlanet.Fun" msgid "PixelPlanet.Fun"
msgstr "" msgstr ""
#: src/ssr/Main.jsx:72 #: src/ssr/Main.jsx:65
msgid "Place color pixels on an map styled canvas with other players online" msgid "Place color pixels on an map styled canvas with other players online"
msgstr "" msgstr ""

View File

@ -4,7 +4,6 @@
import { TTag } from 'ttag'; import { TTag } from 'ttag';
import cookie from 'cookie'; import cookie from 'cookie';
import { languageFromLocalisation } from '../utils/location';
import { getLangsOfJsAsset } from './assets'; import { getLangsOfJsAsset } from './assets';
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
@ -12,23 +11,37 @@ const localeImports = require.context('../../i18n', false, /^\.[/\\]ssr-.+\.po$/
const ttags = {}; const ttags = {};
export const availableLangs = [];
(() => { (() => {
const langs = localeImports.keys(); const langs = localeImports.keys();
const jsLangs = getLangsOfJsAsset('client'); const jsLangs = getLangsOfJsAsset('client');
if (jsLangs.includes('en')) { if (jsLangs.includes('en')) {
ttags.en = new TTag(); ttags.en = new TTag();
availableLangs.push(['en', 'gb']);
} }
for (let i = 0; i < langs.length; i += 1) { for (let i = 0; i < langs.length; i += 1) {
const file = langs[i]; const file = langs[i];
// ./ssr-de.po // ./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)) { if (jsLangs.includes(lang)) {
const ttag = new TTag(); const ttag = new TTag();
ttag.addLocale(lang, localeImports(file).default); ttag.addLocale(lang, localeImports(file).default);
ttag.useLocale(lang); ttag.useLocale(lang);
ttags[lang] = ttag; ttags[lang] = ttag;
availableLangs.push([lang, flag]);
} }
} }
})(); })();
@ -37,6 +50,31 @@ export function getTTag(lang) {
return ttags[lang] || ttags.en || Object.values(ttags)[0]; 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 * express middleware for getting language
* It checks the lang cookie, and if not present, * It checks the lang cookie, and if not present,

View File

@ -6,19 +6,12 @@
import { createHash } from 'crypto'; import { createHash } from 'crypto';
import etag from 'etag'; import etag from 'etag';
import { langCodeToCC } from '../utils/location'; import { getTTag, availableLangs as langs } from '../core/ttag';
import ttags, { getTTag } from '../core/ttag';
import { getJsAssets, getCssAssets } from '../core/assets'; import { getJsAssets, getCssAssets } from '../core/assets';
import socketEvents from '../socket/socketEvents'; import socketEvents from '../socket/socketEvents';
import { BACKUP_URL } from '../core/config'; import { BACKUP_URL } from '../core/config';
import { getHostFromRequest } from '../utils/ip'; 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 * values that we pass to client scripts
*/ */

View File

@ -6,19 +6,12 @@
/* eslint-disable max-len */ /* eslint-disable max-len */
import etag from 'etag'; import etag from 'etag';
import { langCodeToCC } from '../utils/location'; import { getTTag, availableLangs as langs } from '../core/ttag';
import ttags, { getTTag } from '../core/ttag';
import socketEvents from '../socket/socketEvents'; import socketEvents from '../socket/socketEvents';
import { getJsAssets, getCssAssets } from '../core/assets'; import { getJsAssets, getCssAssets } from '../core/assets';
import { BACKUP_URL } from '../core/config'; import { BACKUP_URL } from '../core/config';
import { getHostFromRequest } from '../utils/ip'; 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 * values that we pass to client scripts
*/ */

View File

@ -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;
}