2022-11-08 15:30:46 +00:00
|
|
|
export enum Languages {
|
|
|
|
English = 'english',
|
|
|
|
Espanol = 'espanol',
|
|
|
|
Chinese = 'chinese',
|
|
|
|
ChineseTrandational = 'chinese-traditional',
|
|
|
|
Italian = 'italian',
|
|
|
|
Portuguese = 'portuguese',
|
|
|
|
Ukrainian = 'ukrainian',
|
|
|
|
Japanese = 'japanese',
|
|
|
|
German = 'german',
|
|
|
|
Arabic = 'arabic'
|
|
|
|
}
|
|
|
|
|
2021-06-15 17:37:52 +00:00
|
|
|
/*
|
|
|
|
* List of languages with localizations enabled for builds.
|
|
|
|
*
|
|
|
|
* Client is the UI, and Curriculum is the Challenge Content.
|
|
|
|
*
|
|
|
|
* An error will be thrown if the CLIENT_LOCALE and CURRICULUM_LOCALE variables
|
2020-12-16 08:02:52 +00:00
|
|
|
* from the .env file aren't found in their respective arrays below
|
|
|
|
*/
|
2021-11-19 14:19:40 +00:00
|
|
|
export const availableLangs = {
|
2021-07-19 05:27:23 +00:00
|
|
|
client: [
|
2022-11-08 15:30:46 +00:00
|
|
|
Languages.English,
|
|
|
|
Languages.Espanol,
|
|
|
|
Languages.Chinese,
|
|
|
|
Languages.ChineseTrandational,
|
|
|
|
Languages.Italian,
|
|
|
|
Languages.Portuguese,
|
|
|
|
Languages.Ukrainian,
|
|
|
|
Languages.Japanese,
|
|
|
|
Languages.German,
|
|
|
|
Languages.Arabic
|
2021-07-19 05:27:23 +00:00
|
|
|
],
|
2021-06-15 07:49:18 +00:00
|
|
|
curriculum: [
|
2022-11-08 15:30:46 +00:00
|
|
|
Languages.English,
|
|
|
|
Languages.Espanol,
|
|
|
|
Languages.Chinese,
|
|
|
|
Languages.ChineseTrandational,
|
|
|
|
Languages.Italian,
|
|
|
|
Languages.Portuguese,
|
|
|
|
Languages.Ukrainian,
|
|
|
|
Languages.Japanese,
|
|
|
|
Languages.German,
|
|
|
|
Languages.Arabic
|
2021-06-15 07:49:18 +00:00
|
|
|
]
|
2020-12-16 08:02:52 +00:00
|
|
|
};
|
|
|
|
|
2021-06-15 17:37:52 +00:00
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
2020-12-16 08:02:52 +00:00
|
|
|
// Each client language needs an entry in the rest of the variables below
|
|
|
|
|
2020-12-29 08:36:39 +00:00
|
|
|
/* These strings set the i18next language. It needs to be the two character
|
2020-12-16 08:02:52 +00:00
|
|
|
* string for the language to take advantage of available functionality.
|
|
|
|
* Use a 639-1 code here https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
|
|
|
|
*/
|
2021-11-19 14:19:40 +00:00
|
|
|
export const i18nextCodes = {
|
2022-11-08 15:30:46 +00:00
|
|
|
[Languages.English]: 'en',
|
|
|
|
[Languages.Espanol]: 'es',
|
|
|
|
[Languages.Chinese]: 'zh',
|
|
|
|
[Languages.ChineseTrandational]: 'zh-Hant',
|
|
|
|
[Languages.Italian]: 'it',
|
|
|
|
[Languages.Portuguese]: 'pt-BR',
|
|
|
|
[Languages.Ukrainian]: 'uk',
|
|
|
|
[Languages.Japanese]: 'ja',
|
|
|
|
[Languages.German]: 'de',
|
|
|
|
[Languages.Arabic]: 'ar'
|
2020-12-16 08:02:52 +00:00
|
|
|
};
|
|
|
|
|
2022-10-28 06:13:09 +00:00
|
|
|
// These are for the language selector dropdown menu in the footer
|
2022-11-08 15:30:46 +00:00
|
|
|
export const LangNames = {
|
|
|
|
[Languages.English]: 'English',
|
|
|
|
[Languages.Espanol]: 'Español',
|
|
|
|
[Languages.Chinese]: '中文(简体字)',
|
|
|
|
[Languages.ChineseTrandational]: '中文(繁體字)',
|
|
|
|
[Languages.Italian]: 'Italiano',
|
|
|
|
[Languages.Portuguese]: 'Português',
|
|
|
|
[Languages.Ukrainian]: 'Українська',
|
|
|
|
[Languages.Japanese]: '日本語',
|
|
|
|
[Languages.German]: 'Deutsch',
|
|
|
|
[Languages.Arabic]: 'العربية'
|
|
|
|
};
|
2020-12-16 08:02:52 +00:00
|
|
|
|
|
|
|
/* These are for formatting dates and numbers. Used with JS .toLocaleString().
|
|
|
|
* There's an example in profile/components/Camper.js
|
|
|
|
* List: https://github.com/unicode-cldr/cldr-dates-modern/tree/master/main
|
|
|
|
*/
|
2022-11-08 15:30:46 +00:00
|
|
|
export const LangCodes = {
|
|
|
|
[Languages.English]: 'en-US',
|
|
|
|
[Languages.Espanol]: 'es-419',
|
|
|
|
[Languages.Chinese]: 'zh',
|
|
|
|
[Languages.ChineseTrandational]: 'zh-Hant',
|
|
|
|
[Languages.Italian]: 'it',
|
|
|
|
[Languages.Portuguese]: 'pt-BR',
|
|
|
|
[Languages.Ukrainian]: 'uk',
|
|
|
|
[Languages.Japanese]: 'ja',
|
|
|
|
[Languages.German]: 'de',
|
|
|
|
[Languages.Arabic]: 'ar'
|
|
|
|
};
|
2022-05-02 15:53:30 +00:00
|
|
|
|
2022-08-23 18:53:47 +00:00
|
|
|
/**
|
|
|
|
* This array contains languages that should NOT appear in the language selector.
|
|
|
|
*/
|
2022-10-21 10:30:21 +00:00
|
|
|
export const hiddenLangs = ['arabic'];
|
2022-08-23 18:53:47 +00:00
|
|
|
|
2022-10-28 06:13:09 +00:00
|
|
|
/**
|
|
|
|
* This array contains languages that use the RTL layouts.
|
|
|
|
*/
|
|
|
|
export const rtlLangs = ['arabic'];
|
|
|
|
|
|
|
|
// locale is sourced from a JSON file, so we use getLangCode to
|
2022-05-02 15:53:30 +00:00
|
|
|
// find the associated enum values
|
|
|
|
|
|
|
|
export function getLangCode(locale: PropertyKey) {
|
|
|
|
if (isPropertyOf(LangCodes, locale)) return LangCodes[locale];
|
|
|
|
throw new Error(`${String(locale)} is not a valid locale`);
|
|
|
|
}
|
|
|
|
|
|
|
|
function isPropertyOf<O>(
|
|
|
|
obj: Record<string, string>,
|
|
|
|
key: PropertyKey
|
|
|
|
): key is keyof O {
|
|
|
|
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
|
|
}
|