From d73ab982bc2e493c554ed5188372d6eeff7f9a8e Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Thu, 17 Feb 2022 14:44:12 +0100 Subject: [PATCH] Remove translations which are less than 70% completed, simplify localization code --- src/shared/components/app/navbar.tsx | 4 +- src/shared/components/common/moment-time.tsx | 4 +- src/shared/components/person/settings.tsx | 10 +- src/shared/i18next.ts | 113 ++++------ src/shared/utils.ts | 207 +------------------ 5 files changed, 53 insertions(+), 285 deletions(-) diff --git a/src/shared/components/app/navbar.tsx b/src/shared/components/app/navbar.tsx index 57555410..9ab3b656 100644 --- a/src/shared/components/app/navbar.tsx +++ b/src/shared/components/app/navbar.tsx @@ -18,7 +18,7 @@ import { UserService, WebSocketService } from "../../services"; import { authField, donateLemmyUrl, - getLanguage, + getLanguages, isBrowser, notifyComment, notifyPrivateMessage, @@ -612,7 +612,7 @@ export class Navbar extends Component { setTheme( UserService.Instance.myUserInfo.local_user_view.local_user.theme ); - i18n.changeLanguage(getLanguage()); + i18n.changeLanguage(getLanguages()[0]); this.state.isLoggedIn = true; this.setState(this.state); } else if (op == UserOperation.CreateComment) { diff --git a/src/shared/components/common/moment-time.tsx b/src/shared/components/common/moment-time.tsx index 122fbf7c..1afc9796 100644 --- a/src/shared/components/common/moment-time.tsx +++ b/src/shared/components/common/moment-time.tsx @@ -1,7 +1,7 @@ import { Component } from "inferno"; import moment from "moment"; import { i18n } from "../../i18next"; -import { capitalizeFirstLetter, getMomentLanguage } from "../../utils"; +import { capitalizeFirstLetter, getLanguages } from "../../utils"; import { Icon } from "./icon"; interface MomentTimeProps { @@ -18,7 +18,7 @@ export class MomentTime extends Component { constructor(props: any, context: any) { super(props, context); - let lang = getMomentLanguage(); + let lang = getLanguages(); moment.locale(lang); } diff --git a/src/shared/components/person/settings.tsx b/src/shared/components/person/settings.tsx index 322dfa98..f462fb1e 100644 --- a/src/shared/components/person/settings.tsx +++ b/src/shared/components/person/settings.tsx @@ -18,7 +18,7 @@ import { UserOperation, } from "lemmy-js-client"; import { Subscription } from "rxjs"; -import { i18n } from "../../i18next"; +import { i18n, languages } from "../../i18next"; import { UserService, WebSocketService } from "../../services"; import { authField, @@ -30,10 +30,8 @@ import { elementUrl, fetchCommunities, fetchUsers, - getLanguage, - getNativeLanguageName, + getLanguages, isBrowser, - languages, personSelectName, personToChoice, setIsoData, @@ -527,7 +525,7 @@ export class Settings extends Component { .sort((a, b) => a.code.localeCompare(b.code)) .map(lang => ( ))} @@ -935,7 +933,7 @@ export class Settings extends Component { handleLangChange(i: Settings, event: any) { i.state.saveUserSettingsForm.lang = event.target.value; - i18n.changeLanguage(getLanguage(i.state.saveUserSettingsForm.lang)); + i18n.changeLanguage(getLanguages(i.state.saveUserSettingsForm.lang)[0]); i.setState(i.state); } diff --git a/src/shared/i18next.ts b/src/shared/i18next.ts index cc7e441a..6deda9ff 100644 --- a/src/shared/i18next.ts +++ b/src/shared/i18next.ts @@ -1,11 +1,8 @@ -import i18next, { i18nTyped } from "i18next"; +import i18next, { i18nTyped, Resource } from "i18next"; import { ar } from "./translations/ar"; -import { as } from "./translations/as"; import { bg } from "./translations/bg"; -import { bn } from "./translations/bn"; import { ca } from "./translations/ca"; import { cs } from "./translations/cs"; -import { cy } from "./translations/cy"; import { da } from "./translations/da"; import { de } from "./translations/de"; import { el } from "./translations/el"; @@ -18,88 +15,57 @@ import { fi } from "./translations/fi"; import { fr } from "./translations/fr"; import { ga } from "./translations/ga"; import { gl } from "./translations/gl"; -import { hi } from "./translations/hi"; import { hr } from "./translations/hr"; -import { hu } from "./translations/hu"; import { id } from "./translations/id"; import { it } from "./translations/it"; import { ja } from "./translations/ja"; -import { ka } from "./translations/ka"; -import { km } from "./translations/km"; import { ko } from "./translations/ko"; -import { lt } from "./translations/lt"; -import { ml } from "./translations/ml"; -import { mnc } from "./translations/mnc"; -import { nb_NO } from "./translations/nb_NO"; import { nl } from "./translations/nl"; -import { oc } from "./translations/oc"; import { pl } from "./translations/pl"; import { pt } from "./translations/pt"; import { pt_BR } from "./translations/pt_BR"; import { ru } from "./translations/ru"; -import { sk } from "./translations/sk"; -import { sq } from "./translations/sq"; -import { sr_Latn } from "./translations/sr_Latn"; import { sv } from "./translations/sv"; -import { th } from "./translations/th"; -import { tr } from "./translations/tr"; -import { uk } from "./translations/uk"; import { vi } from "./translations/vi"; import { zh } from "./translations/zh"; import { zh_Hant } from "./translations/zh_Hant"; -import { getLanguage } from "./utils"; +import { getLanguages } from "./utils"; -// https://github.com/nimbusec-oss/inferno-i18next/blob/master/tests/T.test.js#L66 -const resources = { - en, - el, - eu, - eo, - es, - ka, - hi, - de, - zh, - fr, - sv, - ru, - nl, - it, - fi, - ca, - fa, - pl, - pt_BR, - ja, - gl, - tr, - hu, - uk, - sq, - km, - ga, - sr_Latn, - da, - oc, - hr, - th, - bg, - ar, - ko, - id, - nb_NO, - zh_Hant, - cy, - mnc, - sk, - vi, - pt, - bn, - ml, - cs, - as, - lt, -}; +export const languages = [ + { resource: ar, code: "ar", name: "العربية" }, + { resource: bg, code: "bg", name: "Български" }, + { resource: ca, code: "ca", name: "Català" }, + { resource: cs, code: "cs", name: "Česky" }, + { resource: da, code: "da", name: "Dansk" }, + { resource: de, code: "de", name: "Deutsch" }, + { resource: el, code: "el", name: "Ελληνικά" }, + { resource: en, code: "en", name: "English" }, + { resource: eo, code: "eo", name: "Esperanto" }, + { resource: es, code: "es", name: "Español" }, + { resource: eu, code: "eu", name: "Euskara" }, + { resource: fa, code: "fa", name: "فارسی" }, + { resource: fi, code: "fi", name: "Suomi" }, + { resource: fr, code: "fr", name: "Français" }, + { resource: ga, code: "ga", name: "Gaeilge" }, + { resource: gl, code: "gl", name: "Galego" }, + { resource: hr, code: "hr", name: "Hrvatski" }, + { resource: id, code: "id", name: "Bahasa Indonesia" }, + { resource: it, code: "it", name: "Italiano" }, + { resource: ja, code: "ja", name: "日本語" }, + { resource: ko, code: "ko", name: "한국어" }, + { resource: nl, code: "nl", name: "Nederlands" }, + { resource: pl, code: "pl", name: "Polski" }, + { resource: pt, code: "pt", name: "Português" }, + { resource: pt_BR, code: "pt_BR", name: "Português (Brasil)" }, + { resource: ru, code: "ru", name: "Русский" }, + { resource: sv, code: "sv", name: "Svenska" }, + { resource: vi, code: "vi", name: "Tiếng Việt" }, + { resource: zh, code: "zh", name: "中文" }, + { resource: zh_Hant, code: "zh_Hant", name: "文言" }, +]; + +const resources: Resource = {}; +languages.forEach(l => (resources[l.code] = l.resource)); function format(value: any, format: any): any { return format === "uppercase" ? value.toUpperCase() : value; @@ -109,14 +75,11 @@ i18next.init({ debug: false, compatibilityJSON: "v3", // load: 'languageOnly', - // initImmediate: false, - lng: getLanguage(), + lng: getLanguages()[0], fallbackLng: "en", resources, interpolation: { format }, }); export const i18n = i18next as i18nTyped; - -export { resources }; diff --git a/src/shared/utils.ts b/src/shared/utils.ts index 34315346..1c7c5f4a 100644 --- a/src/shared/utils.ts +++ b/src/shared/utils.ts @@ -34,51 +34,12 @@ import markdown_it_html5_embed from "markdown-it-html5-embed"; import markdown_it_sub from "markdown-it-sub"; import markdown_it_sup from "markdown-it-sup"; import moment from "moment"; -import "moment/locale/bg"; -import "moment/locale/bn"; -import "moment/locale/ca"; -import "moment/locale/cs"; -import "moment/locale/cy"; -import "moment/locale/da"; -import "moment/locale/de"; -import "moment/locale/el"; -import "moment/locale/eo"; -import "moment/locale/es"; -import "moment/locale/eu"; -import "moment/locale/fa"; -import "moment/locale/fi"; -import "moment/locale/fr"; -import "moment/locale/ga"; -import "moment/locale/gl"; -import "moment/locale/hi"; -import "moment/locale/hr"; -import "moment/locale/hu"; -import "moment/locale/id"; -import "moment/locale/it"; -import "moment/locale/ja"; -import "moment/locale/ka"; -import "moment/locale/km"; -import "moment/locale/ko"; -import "moment/locale/ml"; -import "moment/locale/nb"; -import "moment/locale/nl"; -import "moment/locale/pl"; -import "moment/locale/pt-br"; -import "moment/locale/ru"; -import "moment/locale/sk"; -import "moment/locale/sq"; -import "moment/locale/sr"; -import "moment/locale/sv"; -import "moment/locale/tr"; -import "moment/locale/uk"; -import "moment/locale/vi"; -import "moment/locale/zh-cn"; import { Subscription } from "rxjs"; import { delay, retryWhen, take } from "rxjs/operators"; import tippy from "tippy.js"; import Toastify from "toastify-js"; import { httpBase } from "./env"; -import { i18n } from "./i18next"; +import { i18n, languages } from "./i18next"; import { CommentNode as CommentNodeI, CommentSortType, @@ -114,57 +75,6 @@ export const postRefetchSeconds: number = 60 * 1000; export const fetchLimit = 20; export const mentionDropdownFetchLimit = 10; -export const languages = [ - { code: "ca", name: "Català" }, - { code: "en", name: "English" }, - { code: "el", name: "Ελληνικά" }, - { code: "eu", name: "Euskara" }, - { code: "eo", name: "Esperanto" }, - { code: "es", name: "Español" }, - { code: "da", name: "Dansk" }, - { code: "de", name: "Deutsch" }, - { code: "ga", name: "Gaeilge" }, - { code: "gl", name: "Galego" }, - { code: "hr", name: "Hrvatski" }, - { code: "hu", name: "Magyar" }, - { code: "id", name: "Bahasa Indonesia" }, - { code: "ka", name: "ქართული" }, - { code: "ko", name: "한국어" }, - { code: "km", name: "ខេមរភាសា" }, - { code: "hi", name: "हिन्दी" }, - { code: "fa", name: "فارسی" }, - { code: "ja", name: "日本語" }, - { code: "oc", name: "Occitan" }, - { code: "nb_NO", name: "Norsk (bokmål)" }, - { code: "pl", name: "Polski" }, - { code: "pt_BR", name: "Português (Brasil)" }, - { code: "zh", name: "中文" }, - { code: "fi", name: "Suomi" }, - { code: "fr", name: "Français" }, - { code: "sv", name: "Svenska" }, - { code: "sq", name: "Shqip" }, - { code: "sr_Latn", name: "Српски" }, - { code: "th", name: "ไทย" }, - { code: "tr", name: "Türkçe" }, - { code: "uk", name: "Українська" }, - { code: "ru", name: "Русский" }, - { code: "nl", name: "Nederlands" }, - { code: "it", name: "Italiano" }, - { code: "bg", name: "Български" }, - { code: "zh_Hant", name: "文言" }, - { code: "cy", name: "Cymraeg" }, - { code: "mnc", name: "ᠮᠠᠨᠵᡠ ᡤᡳᠰᡠᠨ" }, - { code: "sk", name: "Slovenčina" }, - { code: "vi", name: "Tiếng Việt" }, - { code: "pt", name: "Português" }, - { code: "ar", name: "العربية" }, - { code: "bn", name: "বাংলা" }, - { code: "ml", name: "മലയാളം" }, - { code: "cs", name: "Česky" }, - { code: "as", name: "অসমীয়া" }, - { code: "lt", name: "Lietuvių" }, -]; - export const themes = [ "litera", "materia", @@ -427,12 +337,7 @@ export function debounce(func: any, wait = 1000, immediate = false) { }; } -export function getNativeLanguageName(code: string): string { - return languages.filter(c => c.code === code).map(l => l.name)[0]; -} - -// TODO -export function getLanguage(override?: string): string { +export function getLanguages(override?: string): string[] { let myUserInfo = UserService.Instance.myUserInfo; let lang = override || @@ -441,13 +346,13 @@ export function getLanguage(override?: string): string { : "browser"); if (lang == "browser" && isBrowser()) { - return getBrowserLanguage(); + return getBrowserLanguages(); } else { - return lang; + return [lang]; } } -export function getBrowserLanguage(): string { +function getBrowserLanguages(): string[] { // Intersect lemmy's langs, with the browser langs let langs = languages ? languages.map(l => l.code) : ["en"]; @@ -455,105 +360,7 @@ export function getBrowserLanguage(): string { let allowedLangs = navigator.languages .concat("en") .filter(v => langs.includes(v)); - return allowedLangs[0]; -} - -export function getMomentLanguage(): string { - let lang = getLanguage(); - if (lang.startsWith("zh")) { - lang = "zh-cn"; - } else if (lang.startsWith("sv")) { - lang = "sv"; - } else if (lang.startsWith("fr")) { - lang = "fr"; - } else if (lang.startsWith("de")) { - lang = "de"; - } else if (lang.startsWith("ru")) { - lang = "ru"; - } else if (lang.startsWith("es")) { - lang = "es"; - } else if (lang.startsWith("eo")) { - lang = "eo"; - } else if (lang.startsWith("nl")) { - lang = "nl"; - } else if (lang.startsWith("it")) { - lang = "it"; - } else if (lang.startsWith("fi")) { - lang = "fi"; - } else if (lang.startsWith("ca")) { - lang = "ca"; - } else if (lang.startsWith("fa")) { - lang = "fa"; - } else if (lang.startsWith("pl")) { - lang = "pl"; - } else if (lang.startsWith("pt_BR")) { - lang = "pt-br"; - } else if (lang.startsWith("ja")) { - lang = "ja"; - } else if (lang.startsWith("ka")) { - lang = "ka"; - } else if (lang.startsWith("hi")) { - lang = "hi"; - } else if (lang.startsWith("el")) { - lang = "el"; - } else if (lang.startsWith("eu")) { - lang = "eu"; - } else if (lang.startsWith("gl")) { - lang = "gl"; - } else if (lang.startsWith("tr")) { - lang = "tr"; - } else if (lang.startsWith("hu")) { - lang = "hu"; - } else if (lang.startsWith("uk")) { - lang = "uk"; - } else if (lang.startsWith("sq")) { - lang = "sq"; - } else if (lang.startsWith("km")) { - lang = "km"; - } else if (lang.startsWith("ga")) { - lang = "ga"; - } else if (lang.startsWith("sr")) { - lang = "sr"; - } else if (lang.startsWith("ko")) { - lang = "ko"; - } else if (lang.startsWith("da")) { - lang = "da"; - } else if (lang.startsWith("oc")) { - lang = "oc"; - } else if (lang.startsWith("hr")) { - lang = "hr"; - } else if (lang.startsWith("th")) { - lang = "th"; - } else if (lang.startsWith("bg")) { - lang = "bg"; - } else if (lang.startsWith("id")) { - lang = "id"; - } else if (lang.startsWith("nb")) { - lang = "nb"; - } else if (lang.startsWith("cy")) { - lang = "cy"; - } else if (lang.startsWith("sk")) { - lang = "sk"; - } else if (lang.startsWith("vi")) { - lang = "vi"; - } else if (lang.startsWith("pt")) { - lang = "pt"; - } else if (lang.startsWith("ar")) { - lang = "ar"; - } else if (lang.startsWith("bn")) { - lang = "bn"; - } else if (lang.startsWith("ml")) { - lang = "ml"; - } else if (lang.startsWith("cs")) { - lang = "cs"; - } else if (lang.startsWith("as")) { - lang = "as"; - } else if (lang.startsWith("lt")) { - lang = "lt"; - } else { - lang = "en"; - } - return lang; + return allowedLangs; } export function setTheme(theme: string, forceReload = false) { @@ -1510,7 +1317,7 @@ export function personSelectName(pvs: PersonViewSafe): string { export function initializeSite(site: GetSiteResponse) { UserService.Instance.myUserInfo = site.my_user; - i18n.changeLanguage(getLanguage()); + i18n.changeLanguage(getLanguages()[0]); } const SHORTNUM_SI_FORMAT = new Intl.NumberFormat("en-US", {