Handle unsupported dayjs locales

DayJs doesn't support all the locales returned by "navigator.language"
This commit is contained in:
schroda
2024-06-25 17:11:33 +02:00
parent 1e39619314
commit 17e2d7585d
10 changed files with 418 additions and 220 deletions

View File

@@ -18,6 +18,9 @@
"gql:codegen-formatter": "ts-node -T tools/scripts/codegenFormatter.ts", "gql:codegen-formatter": "ts-node -T tools/scripts/codegenFormatter.ts",
"gql:codegen": "yarn gql:codegen-base & yarn gql:codegen-formatter", "gql:codegen": "yarn gql:codegen-base & yarn gql:codegen-formatter",
"i18n:gen-resources": "ts-node -T tools/scripts/generatei18nResources.ts", "i18n:gen-resources": "ts-node -T tools/scripts/generatei18nResources.ts",
"dayjs:gen-locales-array": "ts-node -T tools/scripts/generateDayJsLocales.ts",
"dayjs:gen-locales-import": "ts-node -T tools/scripts/generateDayJsLocalesImport.ts",
"dayjs:gen-locales": "yarn dayjs:gen-locales-array && yarn dayjs:gen-locales-import",
"prepare": "husky" "prepare": "husky"
}, },
"engines": { "engines": {

View File

@@ -89,7 +89,7 @@ export const DateSetting = ({
<Dialog open={isDialogOpen} onClose={closeDialog}> <Dialog open={isDialogOpen} onClose={closeDialog}>
<DialogContent> <DialogContent>
<DialogTitle sx={{ paddingLeft: 0 }}>{settingName}</DialogTitle> <DialogTitle sx={{ paddingLeft: 0 }}>{settingName}</DialogTitle>
<LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale={navigator.language}> <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale={dayjs.locale()}>
<DatePicker <DatePicker
value={dialogValue ? dayjs(Number(dialogValue)) : null} value={dialogValue ? dayjs(Number(dialogValue)) : null}
onChange={(date) => { onChange={(date) => {

View File

@@ -86,7 +86,7 @@ export const TimeSetting = ({
<Dialog open={isDialogOpen} onClose={closeDialog}> <Dialog open={isDialogOpen} onClose={closeDialog}>
<DialogContent> <DialogContent>
<DialogTitle sx={{ paddingLeft: 0 }}>{settingName}</DialogTitle> <DialogTitle sx={{ paddingLeft: 0 }}>{settingName}</DialogTitle>
<LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale={navigator.language}> <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale={dayjs.locale()}>
<TimePicker <TimePicker
value={dayjs(dialogValue, 'HH:mm')} value={dayjs(dialogValue, 'HH:mm')}
defaultValue={dayjs(defaultValue, 'HH:mm')} defaultValue={dayjs(defaultValue, 'HH:mm')}

View File

@@ -0,0 +1,190 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { DAYJS_LOCALES, DayJsLocale } from '@/lib/dayjs/Locales.ts';
export const getDayJsLocale = (locale: string): DayJsLocale => {
if (DAYJS_LOCALES.includes(locale as DayJsLocale)) {
return locale as DayJsLocale;
}
if (DAYJS_LOCALES.includes(locale.toLowerCase() as DayJsLocale)) {
return locale.toLowerCase() as DayJsLocale;
}
const convertedLocale = locale.split('-')[0].toLowerCase();
if (DAYJS_LOCALES.includes(convertedLocale as DayJsLocale)) {
return convertedLocale as DayJsLocale;
}
return 'en';
};
export const importDayJsLocale = async (locale: string): Promise<DayJsLocale> => {
const dayjsLocale = getDayJsLocale(locale);
try {
// eslint-disable-next-line @typescript-eslint/no-use-before-define
await localesToImport[dayjsLocale]();
} catch (e) {
// ignore - dayjs falls back to "en" by default
}
return dayjsLocale;
};
/**
* **IMPORTANT:**
*
* This is generated by the `dayjs:gen-locales-imports` script
*/
const localesToImport: Record<(typeof DAYJS_LOCALES)[number], () => Promise<unknown>> = {
af: () => import('dayjs/locale/af.js'),
am: () => import('dayjs/locale/am.js'),
'ar-dz': () => import('dayjs/locale/ar-dz.js'),
'ar-iq': () => import('dayjs/locale/ar-iq.js'),
'ar-kw': () => import('dayjs/locale/ar-kw.js'),
'ar-ly': () => import('dayjs/locale/ar-ly.js'),
'ar-ma': () => import('dayjs/locale/ar-ma.js'),
'ar-sa': () => import('dayjs/locale/ar-sa.js'),
'ar-tn': () => import('dayjs/locale/ar-tn.js'),
ar: () => import('dayjs/locale/ar.js'),
az: () => import('dayjs/locale/az.js'),
be: () => import('dayjs/locale/be.js'),
bg: () => import('dayjs/locale/bg.js'),
bi: () => import('dayjs/locale/bi.js'),
bm: () => import('dayjs/locale/bm.js'),
'bn-bd': () => import('dayjs/locale/bn-bd.js'),
bn: () => import('dayjs/locale/bn.js'),
bo: () => import('dayjs/locale/bo.js'),
br: () => import('dayjs/locale/br.js'),
bs: () => import('dayjs/locale/bs.js'),
ca: () => import('dayjs/locale/ca.js'),
cs: () => import('dayjs/locale/cs.js'),
cv: () => import('dayjs/locale/cv.js'),
cy: () => import('dayjs/locale/cy.js'),
da: () => import('dayjs/locale/da.js'),
'de-at': () => import('dayjs/locale/de-at.js'),
'de-ch': () => import('dayjs/locale/de-ch.js'),
de: () => import('dayjs/locale/de.js'),
dv: () => import('dayjs/locale/dv.js'),
el: () => import('dayjs/locale/el.js'),
'en-au': () => import('dayjs/locale/en-au.js'),
'en-ca': () => import('dayjs/locale/en-ca.js'),
'en-gb': () => import('dayjs/locale/en-gb.js'),
'en-ie': () => import('dayjs/locale/en-ie.js'),
'en-il': () => import('dayjs/locale/en-il.js'),
'en-in': () => import('dayjs/locale/en-in.js'),
'en-nz': () => import('dayjs/locale/en-nz.js'),
'en-sg': () => import('dayjs/locale/en-sg.js'),
'en-tt': () => import('dayjs/locale/en-tt.js'),
en: () => import('dayjs/locale/en.js'),
eo: () => import('dayjs/locale/eo.js'),
'es-do': () => import('dayjs/locale/es-do.js'),
'es-mx': () => import('dayjs/locale/es-mx.js'),
'es-pr': () => import('dayjs/locale/es-pr.js'),
'es-us': () => import('dayjs/locale/es-us.js'),
es: () => import('dayjs/locale/es.js'),
et: () => import('dayjs/locale/et.js'),
eu: () => import('dayjs/locale/eu.js'),
fa: () => import('dayjs/locale/fa.js'),
fi: () => import('dayjs/locale/fi.js'),
fo: () => import('dayjs/locale/fo.js'),
'fr-ca': () => import('dayjs/locale/fr-ca.js'),
'fr-ch': () => import('dayjs/locale/fr-ch.js'),
fr: () => import('dayjs/locale/fr.js'),
fy: () => import('dayjs/locale/fy.js'),
ga: () => import('dayjs/locale/ga.js'),
gd: () => import('dayjs/locale/gd.js'),
gl: () => import('dayjs/locale/gl.js'),
'gom-latn': () => import('dayjs/locale/gom-latn.js'),
gu: () => import('dayjs/locale/gu.js'),
he: () => import('dayjs/locale/he.js'),
hi: () => import('dayjs/locale/hi.js'),
hr: () => import('dayjs/locale/hr.js'),
ht: () => import('dayjs/locale/ht.js'),
hu: () => import('dayjs/locale/hu.js'),
'hy-am': () => import('dayjs/locale/hy-am.js'),
id: () => import('dayjs/locale/id.js'),
is: () => import('dayjs/locale/is.js'),
'it-ch': () => import('dayjs/locale/it-ch.js'),
it: () => import('dayjs/locale/it.js'),
ja: () => import('dayjs/locale/ja.js'),
jv: () => import('dayjs/locale/jv.js'),
ka: () => import('dayjs/locale/ka.js'),
kk: () => import('dayjs/locale/kk.js'),
km: () => import('dayjs/locale/km.js'),
kn: () => import('dayjs/locale/kn.js'),
ko: () => import('dayjs/locale/ko.js'),
ku: () => import('dayjs/locale/ku.js'),
ky: () => import('dayjs/locale/ky.js'),
lb: () => import('dayjs/locale/lb.js'),
lo: () => import('dayjs/locale/lo.js'),
lt: () => import('dayjs/locale/lt.js'),
lv: () => import('dayjs/locale/lv.js'),
me: () => import('dayjs/locale/me.js'),
mi: () => import('dayjs/locale/mi.js'),
mk: () => import('dayjs/locale/mk.js'),
ml: () => import('dayjs/locale/ml.js'),
mn: () => import('dayjs/locale/mn.js'),
mr: () => import('dayjs/locale/mr.js'),
'ms-my': () => import('dayjs/locale/ms-my.js'),
ms: () => import('dayjs/locale/ms.js'),
mt: () => import('dayjs/locale/mt.js'),
my: () => import('dayjs/locale/my.js'),
nb: () => import('dayjs/locale/nb.js'),
ne: () => import('dayjs/locale/ne.js'),
'nl-be': () => import('dayjs/locale/nl-be.js'),
nl: () => import('dayjs/locale/nl.js'),
nn: () => import('dayjs/locale/nn.js'),
'oc-lnc': () => import('dayjs/locale/oc-lnc.js'),
'pa-in': () => import('dayjs/locale/pa-in.js'),
pl: () => import('dayjs/locale/pl.js'),
'pt-br': () => import('dayjs/locale/pt-br.js'),
pt: () => import('dayjs/locale/pt.js'),
rn: () => import('dayjs/locale/rn.js'),
ro: () => import('dayjs/locale/ro.js'),
ru: () => import('dayjs/locale/ru.js'),
rw: () => import('dayjs/locale/rw.js'),
sd: () => import('dayjs/locale/sd.js'),
se: () => import('dayjs/locale/se.js'),
si: () => import('dayjs/locale/si.js'),
sk: () => import('dayjs/locale/sk.js'),
sl: () => import('dayjs/locale/sl.js'),
sq: () => import('dayjs/locale/sq.js'),
'sr-cyrl': () => import('dayjs/locale/sr-cyrl.js'),
sr: () => import('dayjs/locale/sr.js'),
ss: () => import('dayjs/locale/ss.js'),
'sv-fi': () => import('dayjs/locale/sv-fi.js'),
sv: () => import('dayjs/locale/sv.js'),
sw: () => import('dayjs/locale/sw.js'),
ta: () => import('dayjs/locale/ta.js'),
te: () => import('dayjs/locale/te.js'),
tet: () => import('dayjs/locale/tet.js'),
tg: () => import('dayjs/locale/tg.js'),
th: () => import('dayjs/locale/th.js'),
tk: () => import('dayjs/locale/tk.js'),
'tl-ph': () => import('dayjs/locale/tl-ph.js'),
tlh: () => import('dayjs/locale/tlh.js'),
tr: () => import('dayjs/locale/tr.js'),
tzl: () => import('dayjs/locale/tzl.js'),
'tzm-latn': () => import('dayjs/locale/tzm-latn.js'),
tzm: () => import('dayjs/locale/tzm.js'),
'ug-cn': () => import('dayjs/locale/ug-cn.js'),
uk: () => import('dayjs/locale/uk.js'),
ur: () => import('dayjs/locale/ur.js'),
'uz-latn': () => import('dayjs/locale/uz-latn.js'),
uz: () => import('dayjs/locale/uz.js'),
vi: () => import('dayjs/locale/vi.js'),
'x-pseudo': () => import('dayjs/locale/x-pseudo.js'),
yo: () => import('dayjs/locale/yo.js'),
'zh-cn': () => import('dayjs/locale/zh-cn.js'),
'zh-hk': () => import('dayjs/locale/zh-hk.js'),
'zh-tw': () => import('dayjs/locale/zh-tw.js'),
zh: () => import('dayjs/locale/zh.js'),
};

160
src/lib/dayjs/Locales.ts Normal file
View File

@@ -0,0 +1,160 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
export type DayJsLocale = (typeof DAYJS_LOCALES)[number];
/**
* **IMPORTANT:**
*
* This is generated by the `dayjs:gen-locales-array` script
*/
export const DAYJS_LOCALES = [
'af',
'am',
'ar-dz',
'ar-iq',
'ar-kw',
'ar-ly',
'ar-ma',
'ar-sa',
'ar-tn',
'ar',
'az',
'be',
'bg',
'bi',
'bm',
'bn-bd',
'bn',
'bo',
'br',
'bs',
'ca',
'cs',
'cv',
'cy',
'da',
'de-at',
'de-ch',
'de',
'dv',
'el',
'en-au',
'en-ca',
'en-gb',
'en-ie',
'en-il',
'en-in',
'en-nz',
'en-sg',
'en-tt',
'en',
'eo',
'es-do',
'es-mx',
'es-pr',
'es-us',
'es',
'et',
'eu',
'fa',
'fi',
'fo',
'fr-ca',
'fr-ch',
'fr',
'fy',
'ga',
'gd',
'gl',
'gom-latn',
'gu',
'he',
'hi',
'hr',
'ht',
'hu',
'hy-am',
'id',
'is',
'it-ch',
'it',
'ja',
'jv',
'ka',
'kk',
'km',
'kn',
'ko',
'ku',
'ky',
'lb',
'lo',
'lt',
'lv',
'me',
'mi',
'mk',
'ml',
'mn',
'mr',
'ms-my',
'ms',
'mt',
'my',
'nb',
'ne',
'nl-be',
'nl',
'nn',
'oc-lnc',
'pa-in',
'pl',
'pt-br',
'pt',
'rn',
'ro',
'ru',
'rw',
'sd',
'se',
'si',
'sk',
'sl',
'sq',
'sr-cyrl',
'sr',
'ss',
'sv-fi',
'sv',
'sw',
'ta',
'te',
'tet',
'tg',
'th',
'tk',
'tl-ph',
'tlh',
'tr',
'tzl',
'tzm-latn',
'tzm',
'ug-cn',
'uk',
'ur',
'uz-latn',
'uz',
'vi',
'x-pseudo',
'yo',
'zh-cn',
'zh-hk',
'zh-tw',
'zh',
] as const;

View File

@@ -12,12 +12,11 @@ import calendar from 'dayjs/plugin/calendar';
import relativeTime from 'dayjs/plugin/relativeTime'; import relativeTime from 'dayjs/plugin/relativeTime';
import isToday from 'dayjs/plugin/isToday'; import isToday from 'dayjs/plugin/isToday';
import isYesterday from 'dayjs/plugin/isYesterday'; import isYesterday from 'dayjs/plugin/isYesterday';
import { importDayJsLocale } from '@/lib/dayjs/LocaleImporter.ts';
// import localizedFormat from 'dayjs/plugin/localizedFormat'; // import localizedFormat from 'dayjs/plugin/localizedFormat';
// import updateLocale from 'dayjs/plugin/updateLocale'; // import updateLocale from 'dayjs/plugin/updateLocale';
// import { t } from 'i18next'; // import { t } from 'i18next';
import { loadDayJsLocale } from '@/util/language.tsx';
dayjs.extend(customParseFormat); dayjs.extend(customParseFormat);
dayjs.extend(calendar); dayjs.extend(calendar);
dayjs.extend(relativeTime); dayjs.extend(relativeTime);
@@ -26,8 +25,8 @@ dayjs.extend(isYesterday);
// dayjs.extend(localizedFormat); // dayjs.extend(localizedFormat);
// dayjs.extend(updateLocale); // dayjs.extend(updateLocale);
loadDayJsLocale(navigator.language).then(() => { importDayJsLocale(navigator.language).then((dayjsLocale) => {
dayjs.locale(navigator.language); dayjs.locale(dayjsLocale);
// dayjs.updateLocale(navigator.language, { // dayjs.updateLocale(navigator.language, {
// calendar: { // calendar: {
// lastDay: `[${t('global.date.label.yesterday_at')}] LT`, // lastDay: `[${t('global.date.label.yesterday_at')}] LT`,

View File

@@ -8,12 +8,9 @@
import { I18nResourceCode } from '@/i18n'; import { I18nResourceCode } from '@/i18n';
export const loadDefaultDayJsLocale = () => import('dayjs/locale/en.js');
export type ISOLanguage = { export type ISOLanguage = {
name: string; name: string;
nativeName: string; nativeName: string;
dayjsImport: () => Promise<any>;
}; };
// full list: https://github.com/meikidd/iso-639-1/blob/master/src/data.js // full list: https://github.com/meikidd/iso-639-1/blob/master/src/data.js
@@ -26,52 +23,42 @@ export const ISOLanguages: { [languageCode in I18nResourceCode]: ISOLanguage } &
'es-419': { 'es-419': {
name: 'Spanish; Castilian', name: 'Spanish; Castilian',
nativeName: 'Español', nativeName: 'Español',
dayjsImport: () => import('dayjs/locale/es.js'),
}, },
'pt-pt': { 'pt-pt': {
name: 'Portuguese', name: 'Portuguese',
nativeName: 'Português (Portugal)', nativeName: 'Português (Portugal)',
dayjsImport: () => import('dayjs/locale/pt.js'),
}, },
'pt-br': { 'pt-br': {
name: 'Portuguese; Brasil', name: 'Portuguese; Brasil',
nativeName: 'Português (Brasil)', nativeName: 'Português (Brasil)',
dayjsImport: () => import('dayjs/locale/pt-br.js'),
}, },
zh_Hans: { zh_Hans: {
name: 'Chinese (Simplified)', name: 'Chinese (Simplified)',
nativeName: '中文 (HANS)', nativeName: '中文 (HANS)',
dayjsImport: () => import('dayjs/locale/zh-cn.js'),
}, },
zh_Hant: { zh_Hant: {
name: 'Chinese (Traditional)', name: 'Chinese (Traditional)',
nativeName: '中文 (HANT)', nativeName: '中文 (HANT)',
dayjsImport: () => import('dayjs/locale/zh-hk.js'),
}, },
'zh-rhk': { 'zh-rhk': {
name: 'Chinese', name: 'Chinese',
nativeName: '中文 (RHK)', nativeName: '中文 (RHK)',
dayjsImport: () => import('dayjs/locale/zh-hk.js'),
}, },
'zh-rtw': { 'zh-rtw': {
name: 'Chinese', name: 'Chinese',
nativeName: '中文 (RTW)', nativeName: '中文 (RTW)',
dayjsImport: () => import('dayjs/locale/zh-tw.js'),
}, },
fil: { fil: {
name: 'Filipino', name: 'Filipino',
nativeName: 'Filipino', nativeName: 'Filipino',
dayjsImport: () => import('dayjs/locale/tl-ph'),
}, },
sh: { sh: {
name: 'Serbo-Croatian', name: 'Serbo-Croatian',
nativeName: 'srpskohrvatski', nativeName: 'srpskohrvatski',
dayjsImport: loadDefaultDayJsLocale,
}, },
'nb-NO': { 'nb-NO': {
name: 'Norwegian Bokmål', name: 'Norwegian Bokmål',
nativeName: 'Norsk bokmål', nativeName: 'Norsk bokmål',
dayjsImport: () => import('dayjs/locale/nb.js'),
}, },
// ############################# // #############################
// ### ### // ### ###
@@ -81,918 +68,735 @@ export const ISOLanguages: { [languageCode in I18nResourceCode]: ISOLanguage } &
aa: { aa: {
name: 'Afar', name: 'Afar',
nativeName: 'Afaraf', nativeName: 'Afaraf',
dayjsImport: loadDefaultDayJsLocale,
}, },
ab: { ab: {
name: 'Abkhaz', name: 'Abkhaz',
nativeName: 'аҧсуа бызшәа', nativeName: 'аҧсуа бызшәа',
dayjsImport: loadDefaultDayJsLocale,
}, },
ae: { ae: {
name: 'Avestan', name: 'Avestan',
nativeName: 'avesta', nativeName: 'avesta',
dayjsImport: loadDefaultDayJsLocale,
}, },
af: { af: {
name: 'Afrikaans', name: 'Afrikaans',
nativeName: 'Afrikaans', nativeName: 'Afrikaans',
dayjsImport: () => import('dayjs/locale/af.js'),
}, },
ak: { ak: {
name: 'Akan', name: 'Akan',
nativeName: 'Akan', nativeName: 'Akan',
dayjsImport: loadDefaultDayJsLocale,
}, },
am: { am: {
name: 'Amharic', name: 'Amharic',
nativeName: 'አማርኛ', nativeName: 'አማርኛ',
dayjsImport: () => import('dayjs/locale/am.js'),
}, },
an: { an: {
name: 'Aragonese', name: 'Aragonese',
nativeName: 'aragonés', nativeName: 'aragonés',
dayjsImport: loadDefaultDayJsLocale,
}, },
ar: { ar: {
name: 'Arabic', name: 'Arabic',
nativeName: 'اَلْعَرَبِيَّةُ', nativeName: 'اَلْعَرَبِيَّةُ',
dayjsImport: () => import('dayjs/locale/ar.js'),
}, },
as: { as: {
name: 'Assamese', name: 'Assamese',
nativeName: 'অসমীয়া', nativeName: 'অসমীয়া',
dayjsImport: loadDefaultDayJsLocale,
}, },
av: { av: {
name: 'Avaric', name: 'Avaric',
nativeName: 'авар мацӀ', nativeName: 'авар мацӀ',
dayjsImport: loadDefaultDayJsLocale,
}, },
ay: { ay: {
name: 'Aymara', name: 'Aymara',
nativeName: 'aymar aru', nativeName: 'aymar aru',
dayjsImport: loadDefaultDayJsLocale,
}, },
az: { az: {
name: 'Azerbaijani', name: 'Azerbaijani',
nativeName: 'azərbaycan dili', nativeName: 'azərbaycan dili',
dayjsImport: () => import('dayjs/locale/az.js'),
}, },
ba: { ba: {
name: 'Bashkir', name: 'Bashkir',
nativeName: 'башҡорт теле', nativeName: 'башҡорт теле',
dayjsImport: loadDefaultDayJsLocale,
}, },
be: { be: {
name: 'Belarusian', name: 'Belarusian',
nativeName: 'беларуская мова', nativeName: 'беларуская мова',
dayjsImport: () => import('dayjs/locale/be.js'),
}, },
bg: { bg: {
name: 'Bulgarian', name: 'Bulgarian',
nativeName: 'български език', nativeName: 'български език',
dayjsImport: () => import('dayjs/locale/bg.js'),
}, },
bi: { bi: {
name: 'Bislama', name: 'Bislama',
nativeName: 'Bislama', nativeName: 'Bislama',
dayjsImport: () => import('dayjs/locale/bi.js'),
}, },
bm: { bm: {
name: 'Bambara', name: 'Bambara',
nativeName: 'bamanankan', nativeName: 'bamanankan',
dayjsImport: () => import('dayjs/locale/bm.js'),
}, },
bn: { bn: {
name: 'Bengali', name: 'Bengali',
nativeName: 'বাংলা', nativeName: 'বাংলা',
dayjsImport: () => import('dayjs/locale/bn.js'),
}, },
bo: { bo: {
name: 'Tibetan', name: 'Tibetan',
nativeName: 'བོད་ཡིག', nativeName: 'བོད་ཡིག',
dayjsImport: () => import('dayjs/locale/bo.js'),
}, },
br: { br: {
name: 'Breton', name: 'Breton',
nativeName: 'brezhoneg', nativeName: 'brezhoneg',
dayjsImport: () => import('dayjs/locale/br.js'),
}, },
bs: { bs: {
name: 'Bosnian', name: 'Bosnian',
nativeName: 'bosanski jezik', nativeName: 'bosanski jezik',
dayjsImport: () => import('dayjs/locale/bs.js'),
}, },
ca: { ca: {
name: 'Catalan', name: 'Catalan',
nativeName: 'Català', nativeName: 'Català',
dayjsImport: () => import('dayjs/locale/ca.js'),
}, },
ce: { ce: {
name: 'Chechen', name: 'Chechen',
nativeName: 'нохчийн мотт', nativeName: 'нохчийн мотт',
dayjsImport: loadDefaultDayJsLocale,
}, },
ch: { ch: {
name: 'Chamorro', name: 'Chamorro',
nativeName: 'Chamoru', nativeName: 'Chamoru',
dayjsImport: loadDefaultDayJsLocale,
}, },
co: { co: {
name: 'Corsican', name: 'Corsican',
nativeName: 'corsu', nativeName: 'corsu',
dayjsImport: loadDefaultDayJsLocale,
}, },
cr: { cr: {
name: 'Cree', name: 'Cree',
nativeName: 'ᓀᐦᐃᔭᐍᐏᐣ', nativeName: 'ᓀᐦᐃᔭᐍᐏᐣ',
dayjsImport: loadDefaultDayJsLocale,
}, },
cs: { cs: {
name: 'Czech', name: 'Czech',
nativeName: 'čeština', nativeName: 'čeština',
dayjsImport: () => import('dayjs/locale/cs.js'),
}, },
cu: { cu: {
name: 'Old Church Slavonic', name: 'Old Church Slavonic',
nativeName: 'ѩзыкъ словѣньскъ', nativeName: 'ѩзыкъ словѣньскъ',
dayjsImport: loadDefaultDayJsLocale,
}, },
cv: { cv: {
name: 'Chuvash', name: 'Chuvash',
nativeName: 'чӑваш чӗлхи', nativeName: 'чӑваш чӗлхи',
dayjsImport: () => import('dayjs/locale/cv.js'),
}, },
cy: { cy: {
name: 'Welsh', name: 'Welsh',
nativeName: 'Cymraeg', nativeName: 'Cymraeg',
dayjsImport: () => import('dayjs/locale/cy.js'),
}, },
da: { da: {
name: 'Danish', name: 'Danish',
nativeName: 'Dansk', nativeName: 'Dansk',
dayjsImport: () => import('dayjs/locale/da.js'),
}, },
de: { de: {
name: 'German', name: 'German',
nativeName: 'Deutsch', nativeName: 'Deutsch',
dayjsImport: () => import('dayjs/locale/de.js'),
}, },
dv: { dv: {
name: 'Divehi', name: 'Divehi',
nativeName: 'ދިވެހި', nativeName: 'ދިވެހި',
dayjsImport: () => import('dayjs/locale/dv.js'),
}, },
dz: { dz: {
name: 'Dzongkha', name: 'Dzongkha',
nativeName: 'རྫོང་ཁ', nativeName: 'རྫོང་ཁ',
dayjsImport: loadDefaultDayJsLocale,
}, },
ee: { ee: {
name: 'Ewe', name: 'Ewe',
nativeName: 'Eʋegbe', nativeName: 'Eʋegbe',
dayjsImport: loadDefaultDayJsLocale,
}, },
el: { el: {
name: 'Greek', name: 'Greek',
nativeName: 'Ελληνικά', nativeName: 'Ελληνικά',
dayjsImport: () => import('dayjs/locale/el.js'),
}, },
en: { en: {
name: 'English', name: 'English',
nativeName: 'English', nativeName: 'English',
dayjsImport: loadDefaultDayJsLocale,
}, },
eo: { eo: {
name: 'Esperanto', name: 'Esperanto',
nativeName: 'Esperanto', nativeName: 'Esperanto',
dayjsImport: () => import('dayjs/locale/eo.js'),
}, },
es: { es: {
name: 'Spanish', name: 'Spanish',
nativeName: 'Español', nativeName: 'Español',
dayjsImport: () => import('dayjs/locale/es.js'),
}, },
et: { et: {
name: 'Estonian', name: 'Estonian',
nativeName: 'eesti', nativeName: 'eesti',
dayjsImport: () => import('dayjs/locale/et.js'),
}, },
eu: { eu: {
name: 'Basque', name: 'Basque',
nativeName: 'euskara', nativeName: 'euskara',
dayjsImport: () => import('dayjs/locale/eu.js'),
}, },
fa: { fa: {
name: 'Persian', name: 'Persian',
nativeName: 'فارسی', nativeName: 'فارسی',
dayjsImport: () => import('dayjs/locale/fa.js'),
}, },
ff: { ff: {
name: 'Fula', name: 'Fula',
nativeName: 'Fulfulde', nativeName: 'Fulfulde',
dayjsImport: loadDefaultDayJsLocale,
}, },
fi: { fi: {
name: 'Finnish', name: 'Finnish',
nativeName: 'suomi', nativeName: 'suomi',
dayjsImport: () => import('dayjs/locale/fi.js'),
}, },
fj: { fj: {
name: 'Fijian', name: 'Fijian',
nativeName: 'vosa Vakaviti', nativeName: 'vosa Vakaviti',
dayjsImport: loadDefaultDayJsLocale,
}, },
fo: { fo: {
name: 'Faroese', name: 'Faroese',
nativeName: 'Føroyskt', nativeName: 'Føroyskt',
dayjsImport: () => import('dayjs/locale/fo.js'),
}, },
fr: { fr: {
name: 'French', name: 'French',
nativeName: 'Français', nativeName: 'Français',
dayjsImport: () => import('dayjs/locale/fr.js'),
}, },
fy: { fy: {
name: 'Western Frisian', name: 'Western Frisian',
nativeName: 'Frysk', nativeName: 'Frysk',
dayjsImport: () => import('dayjs/locale/fy.js'),
}, },
ga: { ga: {
name: 'Irish', name: 'Irish',
nativeName: 'Gaeilge', nativeName: 'Gaeilge',
dayjsImport: () => import('dayjs/locale/ga.js'),
}, },
gd: { gd: {
name: 'Scottish Gaelic', name: 'Scottish Gaelic',
nativeName: 'Gàidhlig', nativeName: 'Gàidhlig',
dayjsImport: () => import('dayjs/locale/gd.js'),
}, },
gl: { gl: {
name: 'Galician', name: 'Galician',
nativeName: 'galego', nativeName: 'galego',
dayjsImport: () => import('dayjs/locale/gl.js'),
}, },
gn: { gn: {
name: 'Guaraní', name: 'Guaraní',
nativeName: "Avañe'ẽ", nativeName: "Avañe'ẽ",
dayjsImport: loadDefaultDayJsLocale,
}, },
gu: { gu: {
name: 'Gujarati', name: 'Gujarati',
nativeName: 'ગુજરાતી', nativeName: 'ગુજરાતી',
dayjsImport: () => import('dayjs/locale/gu.js'),
}, },
gv: { gv: {
name: 'Manx', name: 'Manx',
nativeName: 'Gaelg', nativeName: 'Gaelg',
dayjsImport: loadDefaultDayJsLocale,
}, },
ha: { ha: {
name: 'Hausa', name: 'Hausa',
nativeName: 'هَوُسَ', nativeName: 'هَوُسَ',
dayjsImport: loadDefaultDayJsLocale,
}, },
he: { he: {
name: 'Hebrew', name: 'Hebrew',
nativeName: 'עברית', nativeName: 'עברית',
dayjsImport: () => import('dayjs/locale/he.js'),
}, },
hi: { hi: {
name: 'Hindi', name: 'Hindi',
nativeName: 'हिन्दी', nativeName: 'हिन्दी',
dayjsImport: () => import('dayjs/locale/hi.js'),
}, },
ho: { ho: {
name: 'Hiri Motu', name: 'Hiri Motu',
nativeName: 'Hiri Motu', nativeName: 'Hiri Motu',
dayjsImport: loadDefaultDayJsLocale,
}, },
hr: { hr: {
name: 'Croatian', name: 'Croatian',
nativeName: 'Hrvatski', nativeName: 'Hrvatski',
dayjsImport: () => import('dayjs/locale/hr.js'),
}, },
ht: { ht: {
name: 'Haitian', name: 'Haitian',
nativeName: 'Kreyòl ayisyen', nativeName: 'Kreyòl ayisyen',
dayjsImport: () => import('dayjs/locale/ht.js'),
}, },
hu: { hu: {
name: 'Hungarian', name: 'Hungarian',
nativeName: 'magyar', nativeName: 'magyar',
dayjsImport: () => import('dayjs/locale/hu.js'),
}, },
hy: { hy: {
name: 'Armenian', name: 'Armenian',
nativeName: 'Հայերեն', nativeName: 'Հայերեն',
dayjsImport: loadDefaultDayJsLocale,
}, },
hz: { hz: {
name: 'Herero', name: 'Herero',
nativeName: 'Otjiherero', nativeName: 'Otjiherero',
dayjsImport: loadDefaultDayJsLocale,
}, },
ia: { ia: {
name: 'Interlingua', name: 'Interlingua',
nativeName: 'Interlingua', nativeName: 'Interlingua',
dayjsImport: loadDefaultDayJsLocale,
}, },
id: { id: {
name: 'Indonesian', name: 'Indonesian',
nativeName: 'Bahasa Indonesia', nativeName: 'Bahasa Indonesia',
dayjsImport: () => import('dayjs/locale/id.js'),
}, },
ie: { ie: {
name: 'Interlingue', name: 'Interlingue',
nativeName: 'Interlingue', nativeName: 'Interlingue',
dayjsImport: loadDefaultDayJsLocale,
}, },
ig: { ig: {
name: 'Igbo', name: 'Igbo',
nativeName: 'Asụsụ Igbo', nativeName: 'Asụsụ Igbo',
dayjsImport: loadDefaultDayJsLocale,
}, },
ii: { ii: {
name: 'Nuosu', name: 'Nuosu',
nativeName: 'ꆈꌠ꒿ Nuosuhxop', nativeName: 'ꆈꌠ꒿ Nuosuhxop',
dayjsImport: loadDefaultDayJsLocale,
}, },
ik: { ik: {
name: 'Inupiaq', name: 'Inupiaq',
nativeName: 'Iñupiaq', nativeName: 'Iñupiaq',
dayjsImport: loadDefaultDayJsLocale,
}, },
io: { io: {
name: 'Ido', name: 'Ido',
nativeName: 'Ido', nativeName: 'Ido',
dayjsImport: loadDefaultDayJsLocale,
}, },
is: { is: {
name: 'Icelandic', name: 'Icelandic',
nativeName: 'Íslenska', nativeName: 'Íslenska',
dayjsImport: () => import('dayjs/locale/is.js'),
}, },
it: { it: {
name: 'Italian', name: 'Italian',
nativeName: 'Italiano', nativeName: 'Italiano',
dayjsImport: () => import('dayjs/locale/it.js'),
}, },
iu: { iu: {
name: 'Inuktitut', name: 'Inuktitut',
nativeName: 'ᐃᓄᒃᑎᑐᑦ', nativeName: 'ᐃᓄᒃᑎᑐᑦ',
dayjsImport: loadDefaultDayJsLocale,
}, },
ja: { ja: {
name: 'Japanese', name: 'Japanese',
nativeName: '日本語', nativeName: '日本語',
dayjsImport: () => import('dayjs/locale/ja.js'),
}, },
jv: { jv: {
name: 'Javanese', name: 'Javanese',
nativeName: 'basa Jawa', nativeName: 'basa Jawa',
dayjsImport: () => import('dayjs/locale/jv.js'),
}, },
ka: { ka: {
name: 'Georgian', name: 'Georgian',
nativeName: 'ქართული', nativeName: 'ქართული',
dayjsImport: () => import('dayjs/locale/ka.js'),
}, },
kg: { kg: {
name: 'Kongo', name: 'Kongo',
nativeName: 'Kikongo', nativeName: 'Kikongo',
dayjsImport: loadDefaultDayJsLocale,
}, },
ki: { ki: {
name: 'Kikuyu', name: 'Kikuyu',
nativeName: 'Gĩkũyũ', nativeName: 'Gĩkũyũ',
dayjsImport: loadDefaultDayJsLocale,
}, },
kj: { kj: {
name: 'Kwanyama', name: 'Kwanyama',
nativeName: 'Kuanyama', nativeName: 'Kuanyama',
dayjsImport: loadDefaultDayJsLocale,
}, },
kk: { kk: {
name: 'Kazakh', name: 'Kazakh',
nativeName: 'қазақ тілі', nativeName: 'қазақ тілі',
dayjsImport: () => import('dayjs/locale/kk.js'),
}, },
kl: { kl: {
name: 'Kalaallisut', name: 'Kalaallisut',
nativeName: 'kalaallisut', nativeName: 'kalaallisut',
dayjsImport: loadDefaultDayJsLocale,
}, },
km: { km: {
name: 'Khmer', name: 'Khmer',
nativeName: 'ខេមរភាសា', nativeName: 'ខេមរភាសា',
dayjsImport: () => import('dayjs/locale/km.js'),
}, },
kn: { kn: {
name: 'Kannada', name: 'Kannada',
nativeName: 'ಕನ್ನಡ', nativeName: 'ಕನ್ನಡ',
dayjsImport: () => import('dayjs/locale/kn.js'),
}, },
ko: { ko: {
name: 'Korean', name: 'Korean',
nativeName: '한국어', nativeName: '한국어',
dayjsImport: () => import('dayjs/locale/ko.js'),
}, },
kr: { kr: {
name: 'Kanuri', name: 'Kanuri',
nativeName: 'Kanuri', nativeName: 'Kanuri',
dayjsImport: loadDefaultDayJsLocale,
}, },
ks: { ks: {
name: 'Kashmiri', name: 'Kashmiri',
nativeName: 'कश्मीरी', nativeName: 'कश्मीरी',
dayjsImport: loadDefaultDayJsLocale,
}, },
ku: { ku: {
name: 'Kurdish', name: 'Kurdish',
nativeName: 'Kurdî', nativeName: 'Kurdî',
dayjsImport: () => import('dayjs/locale/ku.js'),
}, },
kv: { kv: {
name: 'Komi', name: 'Komi',
nativeName: 'коми кыв', nativeName: 'коми кыв',
dayjsImport: loadDefaultDayJsLocale,
}, },
kw: { kw: {
name: 'Cornish', name: 'Cornish',
nativeName: 'Kernewek', nativeName: 'Kernewek',
dayjsImport: loadDefaultDayJsLocale,
}, },
ky: { ky: {
name: 'Kyrgyz', name: 'Kyrgyz',
nativeName: 'Кыргызча', nativeName: 'Кыргызча',
dayjsImport: () => import('dayjs/locale/ky.js'),
}, },
la: { la: {
name: 'Latin', name: 'Latin',
nativeName: 'latine', nativeName: 'latine',
dayjsImport: loadDefaultDayJsLocale,
}, },
lb: { lb: {
name: 'Luxembourgish', name: 'Luxembourgish',
nativeName: 'Lëtzebuergesch', nativeName: 'Lëtzebuergesch',
dayjsImport: () => import('dayjs/locale/lb.js'),
}, },
lg: { lg: {
name: 'Ganda', name: 'Ganda',
nativeName: 'Luganda', nativeName: 'Luganda',
dayjsImport: loadDefaultDayJsLocale,
}, },
li: { li: {
name: 'Limburgish', name: 'Limburgish',
nativeName: 'Limburgs', nativeName: 'Limburgs',
dayjsImport: loadDefaultDayJsLocale,
}, },
ln: { ln: {
name: 'Lingala', name: 'Lingala',
nativeName: 'Lingála', nativeName: 'Lingála',
dayjsImport: loadDefaultDayJsLocale,
}, },
lo: { lo: {
name: 'Lao', name: 'Lao',
nativeName: 'ພາສາລາວ', nativeName: 'ພາສາລາວ',
dayjsImport: () => import('dayjs/locale/lo.js'),
}, },
lt: { lt: {
name: 'Lithuanian', name: 'Lithuanian',
nativeName: 'lietuvių kalba', nativeName: 'lietuvių kalba',
dayjsImport: () => import('dayjs/locale/lt.js'),
}, },
lu: { lu: {
name: 'Luba-Katanga', name: 'Luba-Katanga',
nativeName: 'Kiluba', nativeName: 'Kiluba',
dayjsImport: loadDefaultDayJsLocale,
}, },
lv: { lv: {
name: 'Latvian', name: 'Latvian',
nativeName: 'latviešu valoda', nativeName: 'latviešu valoda',
dayjsImport: () => import('dayjs/locale/lv.js'),
}, },
mg: { mg: {
name: 'Malagasy', name: 'Malagasy',
nativeName: 'fiteny malagasy', nativeName: 'fiteny malagasy',
dayjsImport: loadDefaultDayJsLocale,
}, },
mh: { mh: {
name: 'Marshallese', name: 'Marshallese',
nativeName: 'Kajin M̧ajeļ', nativeName: 'Kajin M̧ajeļ',
dayjsImport: loadDefaultDayJsLocale,
}, },
mi: { mi: {
name: 'Māori', name: 'Māori',
nativeName: 'te reo Māori', nativeName: 'te reo Māori',
dayjsImport: () => import('dayjs/locale/mi.js'),
}, },
mk: { mk: {
name: 'Macedonian', name: 'Macedonian',
nativeName: 'македонски јазик', nativeName: 'македонски јазик',
dayjsImport: () => import('dayjs/locale/mk.js'),
}, },
ml: { ml: {
name: 'Malayalam', name: 'Malayalam',
nativeName: 'മലയാളം', nativeName: 'മലയാളം',
dayjsImport: () => import('dayjs/locale/ml.js'),
}, },
mn: { mn: {
name: 'Mongolian', name: 'Mongolian',
nativeName: 'Монгол хэл', nativeName: 'Монгол хэл',
dayjsImport: () => import('dayjs/locale/mn.js'),
}, },
mr: { mr: {
name: 'Marathi', name: 'Marathi',
nativeName: 'मराठी', nativeName: 'मराठी',
dayjsImport: () => import('dayjs/locale/mr.js'),
}, },
ms: { ms: {
name: 'Malay', name: 'Malay',
nativeName: 'Bahasa Melayu', nativeName: 'Bahasa Melayu',
dayjsImport: () => import('dayjs/locale/ms.js'),
}, },
mt: { mt: {
name: 'Maltese', name: 'Maltese',
nativeName: 'Malti', nativeName: 'Malti',
dayjsImport: () => import('dayjs/locale/mt.js'),
}, },
my: { my: {
name: 'Burmese', name: 'Burmese',
nativeName: 'ဗမာစာ', nativeName: 'ဗမာစာ',
dayjsImport: () => import('dayjs/locale/my.js'),
}, },
na: { na: {
name: 'Nauru', name: 'Nauru',
nativeName: 'Dorerin Naoero', nativeName: 'Dorerin Naoero',
dayjsImport: loadDefaultDayJsLocale,
}, },
nb: { nb: {
name: 'Norwegian Bokmål', name: 'Norwegian Bokmål',
nativeName: 'Norsk bokmål', nativeName: 'Norsk bokmål',
dayjsImport: () => import('dayjs/locale/nb.js'),
}, },
nd: { nd: {
name: 'Northern Ndebele', name: 'Northern Ndebele',
nativeName: 'isiNdebele', nativeName: 'isiNdebele',
dayjsImport: loadDefaultDayJsLocale,
}, },
ne: { ne: {
name: 'Nepali', name: 'Nepali',
nativeName: 'नेपाली', nativeName: 'नेपाली',
dayjsImport: () => import('dayjs/locale/ne.js'),
}, },
ng: { ng: {
name: 'Ndonga', name: 'Ndonga',
nativeName: 'Owambo', nativeName: 'Owambo',
dayjsImport: loadDefaultDayJsLocale,
}, },
nl: { nl: {
name: 'Dutch', name: 'Dutch',
nativeName: 'Nederlands', nativeName: 'Nederlands',
dayjsImport: () => import('dayjs/locale/nl.js'),
}, },
nn: { nn: {
name: 'Norwegian Nynorsk', name: 'Norwegian Nynorsk',
nativeName: 'Norsk nynorsk', nativeName: 'Norsk nynorsk',
dayjsImport: () => import('dayjs/locale/nn.js'),
}, },
no: { no: {
name: 'Norwegian', name: 'Norwegian',
nativeName: 'Norsk', nativeName: 'Norsk',
dayjsImport: loadDefaultDayJsLocale,
}, },
nr: { nr: {
name: 'Southern Ndebele', name: 'Southern Ndebele',
nativeName: 'isiNdebele', nativeName: 'isiNdebele',
dayjsImport: loadDefaultDayJsLocale,
}, },
nv: { nv: {
name: 'Navajo', name: 'Navajo',
nativeName: 'Diné bizaad', nativeName: 'Diné bizaad',
dayjsImport: loadDefaultDayJsLocale,
}, },
ny: { ny: {
name: 'Chichewa', name: 'Chichewa',
nativeName: 'chiCheŵa', nativeName: 'chiCheŵa',
dayjsImport: loadDefaultDayJsLocale,
}, },
oc: { oc: {
name: 'Occitan', name: 'Occitan',
nativeName: 'occitan', nativeName: 'occitan',
dayjsImport: loadDefaultDayJsLocale,
}, },
oj: { oj: {
name: 'Ojibwe', name: 'Ojibwe',
nativeName: 'ᐊᓂᔑᓈᐯᒧᐎᓐ', nativeName: 'ᐊᓂᔑᓈᐯᒧᐎᓐ',
dayjsImport: loadDefaultDayJsLocale,
}, },
om: { om: {
name: 'Oromo', name: 'Oromo',
nativeName: 'Afaan Oromoo', nativeName: 'Afaan Oromoo',
dayjsImport: loadDefaultDayJsLocale,
}, },
or: { or: {
name: 'Oriya', name: 'Oriya',
nativeName: 'ଓଡ଼ିଆ', nativeName: 'ଓଡ଼ିଆ',
dayjsImport: loadDefaultDayJsLocale,
}, },
os: { os: {
name: 'Ossetian', name: 'Ossetian',
nativeName: 'ирон æвзаг', nativeName: 'ирон æвзаг',
dayjsImport: loadDefaultDayJsLocale,
}, },
pa: { pa: {
name: 'Panjabi', name: 'Panjabi',
nativeName: 'ਪੰਜਾਬੀ', nativeName: 'ਪੰਜਾਬੀ',
dayjsImport: loadDefaultDayJsLocale,
}, },
pi: { pi: {
name: 'Pāli', name: 'Pāli',
nativeName: 'पाऴि', nativeName: 'पाऴि',
dayjsImport: loadDefaultDayJsLocale,
}, },
pl: { pl: {
name: 'Polish', name: 'Polish',
nativeName: 'Polski', nativeName: 'Polski',
dayjsImport: () => import('dayjs/locale/pl.js'),
}, },
ps: { ps: {
name: 'Pashto', name: 'Pashto',
nativeName: 'پښتو', nativeName: 'پښتو',
dayjsImport: loadDefaultDayJsLocale,
}, },
pt: { pt: {
name: 'Portuguese', name: 'Portuguese',
nativeName: 'Português', nativeName: 'Português',
dayjsImport: () => import('dayjs/locale/pt.js'),
}, },
qu: { qu: {
name: 'Quechua', name: 'Quechua',
nativeName: 'Runa Simi', nativeName: 'Runa Simi',
dayjsImport: loadDefaultDayJsLocale,
// asdfasdfasdfasdf // asdfasdfasdfasdf
}, },
rm: { rm: {
name: 'Romansh', name: 'Romansh',
nativeName: 'rumantsch grischun', nativeName: 'rumantsch grischun',
dayjsImport: () => import('dayjs/locale/cs.js'),
}, },
rn: { rn: {
name: 'Kirundi', name: 'Kirundi',
nativeName: 'Ikirundi', nativeName: 'Ikirundi',
dayjsImport: () => import('dayjs/locale/cs.js'),
}, },
ro: { ro: {
name: 'Romanian', name: 'Romanian',
nativeName: 'Română', nativeName: 'Română',
dayjsImport: () => import('dayjs/locale/ro.js'),
}, },
ru: { ru: {
name: 'Russian', name: 'Russian',
nativeName: 'Русский', nativeName: 'Русский',
dayjsImport: () => import('dayjs/locale/ru.js'),
}, },
rw: { rw: {
name: 'Kinyarwanda', name: 'Kinyarwanda',
nativeName: 'Ikinyarwanda', nativeName: 'Ikinyarwanda',
dayjsImport: () => import('dayjs/locale/rw.js'),
}, },
sa: { sa: {
name: 'Sanskrit', name: 'Sanskrit',
nativeName: 'संस्कृतम्', nativeName: 'संस्कृतम्',
dayjsImport: loadDefaultDayJsLocale,
}, },
sc: { sc: {
name: 'Sardinian', name: 'Sardinian',
nativeName: 'sardu', nativeName: 'sardu',
dayjsImport: loadDefaultDayJsLocale,
}, },
sd: { sd: {
name: 'Sindhi', name: 'Sindhi',
nativeName: 'सिन्धी', nativeName: 'सिन्धी',
dayjsImport: () => import('dayjs/locale/sd.js'),
}, },
se: { se: {
name: 'Northern Sami', name: 'Northern Sami',
nativeName: 'Davvisámegiella', nativeName: 'Davvisámegiella',
dayjsImport: () => import('dayjs/locale/se.js'),
}, },
sg: { sg: {
name: 'Sango', name: 'Sango',
nativeName: 'yângâ tî sängö', nativeName: 'yângâ tî sängö',
dayjsImport: loadDefaultDayJsLocale,
}, },
si: { si: {
name: 'Sinhala', name: 'Sinhala',
nativeName: 'සිංහල', nativeName: 'සිංහල',
dayjsImport: () => import('dayjs/locale/si.js'),
}, },
sk: { sk: {
name: 'Slovak', name: 'Slovak',
nativeName: 'slovenčina', nativeName: 'slovenčina',
dayjsImport: () => import('dayjs/locale/sk.js'),
}, },
sl: { sl: {
name: 'Slovenian', name: 'Slovenian',
nativeName: 'slovenščina', nativeName: 'slovenščina',
dayjsImport: () => import('dayjs/locale/sl.js'),
}, },
sm: { sm: {
name: 'Samoan', name: 'Samoan',
nativeName: "gagana fa'a Samoa", nativeName: "gagana fa'a Samoa",
dayjsImport: loadDefaultDayJsLocale,
}, },
sn: { sn: {
name: 'Shona', name: 'Shona',
nativeName: 'chiShona', nativeName: 'chiShona',
dayjsImport: loadDefaultDayJsLocale,
}, },
so: { so: {
name: 'Somali', name: 'Somali',
nativeName: 'Soomaaliga', nativeName: 'Soomaaliga',
dayjsImport: loadDefaultDayJsLocale,
}, },
sq: { sq: {
name: 'Albanian', name: 'Albanian',
nativeName: 'Shqip', nativeName: 'Shqip',
dayjsImport: () => import('dayjs/locale/sq.js'),
}, },
sr: { sr: {
name: 'Serbian', name: 'Serbian',
nativeName: 'српски језик', nativeName: 'српски језик',
dayjsImport: () => import('dayjs/locale/sr.js'),
}, },
ss: { ss: {
name: 'Swati', name: 'Swati',
nativeName: 'SiSwati', nativeName: 'SiSwati',
dayjsImport: () => import('dayjs/locale/ss.js'),
}, },
st: { st: {
name: 'Southern Sotho', name: 'Southern Sotho',
nativeName: 'Sesotho', nativeName: 'Sesotho',
dayjsImport: loadDefaultDayJsLocale,
}, },
su: { su: {
name: 'Sundanese', name: 'Sundanese',
nativeName: 'Basa Sunda', nativeName: 'Basa Sunda',
dayjsImport: loadDefaultDayJsLocale,
}, },
sv: { sv: {
name: 'Swedish', name: 'Swedish',
nativeName: 'Svenska', nativeName: 'Svenska',
dayjsImport: () => import('dayjs/locale/sv.js'),
}, },
sw: { sw: {
name: 'Swahili', name: 'Swahili',
nativeName: 'Kiswahili', nativeName: 'Kiswahili',
dayjsImport: () => import('dayjs/locale/sw.js'),
}, },
ta: { ta: {
name: 'Tamil', name: 'Tamil',
nativeName: 'தமிழ்', nativeName: 'தமிழ்',
dayjsImport: () => import('dayjs/locale/ta.js'),
}, },
te: { te: {
name: 'Telugu', name: 'Telugu',
nativeName: 'తెలుగు', nativeName: 'తెలుగు',
dayjsImport: () => import('dayjs/locale/te.js'),
}, },
tg: { tg: {
name: 'Tajik', name: 'Tajik',
nativeName: 'тоҷикӣ', nativeName: 'тоҷикӣ',
dayjsImport: () => import('dayjs/locale/tg.js'),
}, },
th: { th: {
name: 'Thai', name: 'Thai',
nativeName: 'ไทย', nativeName: 'ไทย',
dayjsImport: () => import('dayjs/locale/th.js'),
}, },
ti: { ti: {
name: 'Tigrinya', name: 'Tigrinya',
nativeName: 'ትግርኛ', nativeName: 'ትግርኛ',
dayjsImport: loadDefaultDayJsLocale,
}, },
tk: { tk: {
name: 'Turkmen', name: 'Turkmen',
nativeName: 'Türkmençe', nativeName: 'Türkmençe',
dayjsImport: () => import('dayjs/locale/tk.js'),
}, },
tl: { tl: {
name: 'Tagalog', name: 'Tagalog',
nativeName: 'Wikang Tagalog', nativeName: 'Wikang Tagalog',
dayjsImport: loadDefaultDayJsLocale,
}, },
tn: { tn: {
name: 'Tswana', name: 'Tswana',
nativeName: 'Setswana', nativeName: 'Setswana',
dayjsImport: loadDefaultDayJsLocale,
}, },
to: { to: {
name: 'Tonga', name: 'Tonga',
nativeName: 'faka Tonga', nativeName: 'faka Tonga',
dayjsImport: loadDefaultDayJsLocale,
}, },
tr: { tr: {
name: 'Turkish', name: 'Turkish',
nativeName: 'Türkçe', nativeName: 'Türkçe',
dayjsImport: () => import('dayjs/locale/tr.js'),
}, },
ts: { ts: {
name: 'Tsonga', name: 'Tsonga',
nativeName: 'Xitsonga', nativeName: 'Xitsonga',
dayjsImport: loadDefaultDayJsLocale,
}, },
tt: { tt: {
name: 'Tatar', name: 'Tatar',
nativeName: 'татар теле', nativeName: 'татар теле',
dayjsImport: loadDefaultDayJsLocale,
}, },
tw: { tw: {
name: 'Twi', name: 'Twi',
nativeName: 'Twi', nativeName: 'Twi',
dayjsImport: loadDefaultDayJsLocale,
}, },
ty: { ty: {
name: 'Tahitian', name: 'Tahitian',
nativeName: 'Reo Tahiti', nativeName: 'Reo Tahiti',
dayjsImport: loadDefaultDayJsLocale,
}, },
ug: { ug: {
name: 'Uyghur', name: 'Uyghur',
nativeName: 'ئۇيغۇرچە‎', nativeName: 'ئۇيغۇرچە‎',
dayjsImport: loadDefaultDayJsLocale,
}, },
uk: { uk: {
name: 'Ukrainian', name: 'Ukrainian',
nativeName: 'Українська', nativeName: 'Українська',
dayjsImport: () => import('dayjs/locale/uk.js'),
}, },
ur: { ur: {
name: 'Urdu', name: 'Urdu',
nativeName: 'اردو', nativeName: 'اردو',
dayjsImport: () => import('dayjs/locale/ur.js'),
}, },
uz: { uz: {
name: 'Uzbek', name: 'Uzbek',
nativeName: 'Ўзбек', nativeName: 'Ўзбек',
dayjsImport: () => import('dayjs/locale/uz.js'),
}, },
ve: { ve: {
name: 'Venda', name: 'Venda',
nativeName: 'Tshivenḓa', nativeName: 'Tshivenḓa',
dayjsImport: loadDefaultDayJsLocale,
}, },
vi: { vi: {
name: 'Vietnamese', name: 'Vietnamese',
nativeName: 'Tiếng Việt', nativeName: 'Tiếng Việt',
dayjsImport: () => import('dayjs/locale/vi.js'),
}, },
vo: { vo: {
name: 'Volapük', name: 'Volapük',
nativeName: 'Volapük', nativeName: 'Volapük',
dayjsImport: loadDefaultDayJsLocale,
}, },
wa: { wa: {
name: 'Walloon', name: 'Walloon',
nativeName: 'walon', nativeName: 'walon',
dayjsImport: loadDefaultDayJsLocale,
}, },
wo: { wo: {
name: 'Wolof', name: 'Wolof',
nativeName: 'Wollof', nativeName: 'Wollof',
dayjsImport: loadDefaultDayJsLocale,
}, },
xh: { xh: {
name: 'Xhosa', name: 'Xhosa',
nativeName: 'isiXhosa', nativeName: 'isiXhosa',
dayjsImport: loadDefaultDayJsLocale,
}, },
yi: { yi: {
name: 'Yiddish', name: 'Yiddish',
nativeName: 'ייִדיש', nativeName: 'ייִדיש',
dayjsImport: loadDefaultDayJsLocale,
}, },
yo: { yo: {
name: 'Yoruba', name: 'Yoruba',
nativeName: 'Yorùbá', nativeName: 'Yorùbá',
dayjsImport: () => import('dayjs/locale/yo.js'),
}, },
za: { za: {
name: 'Zhuang', name: 'Zhuang',
nativeName: 'Saɯ cueŋƅ', nativeName: 'Saɯ cueŋƅ',
dayjsImport: loadDefaultDayJsLocale,
}, },
zh: { zh: {
name: 'Chinese', name: 'Chinese',
nativeName: '中文', nativeName: '中文',
dayjsImport: () => import('dayjs/locale/zh.js'),
}, },
zu: { zu: {
name: 'Zulu', name: 'Zulu',
nativeName: 'isiZulu', nativeName: 'isiZulu',
dayjsImport: loadDefaultDayJsLocale,
}, },
}; };

View File

@@ -7,7 +7,7 @@
*/ */
import { t } from 'i18next'; import { t } from 'i18next';
import { ISOLanguage, ISOLanguages, loadDefaultDayJsLocale } from '@/util/isoLanguages.ts'; import { ISOLanguage, ISOLanguages } from '@/util/isoLanguages.ts';
export enum DefaultLanguage { export enum DefaultLanguage {
ALL = 'all', ALL = 'all',
@@ -78,20 +78,3 @@ export const langSortCmp = (a: string, b: string) => {
return aLang > bLang ? 1 : -1; return aLang > bLang ? 1 : -1;
}; };
export const loadDayJsLocale = async (locale: string) => {
const lang = getISOLanguage(locale);
try {
if (!lang) {
await loadDefaultDayJsLocale();
return false;
}
await lang.dayjsImport();
return true;
} catch (e) {
return false;
// ignore - dayjs falls back to en anyway
}
};

View File

@@ -0,0 +1,28 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import path from 'path';
import fs from 'fs';
const outputFilePath = path.join(__dirname, '../../src/lib/dayjs/Locales.ts');
const resourcesDirPath = path.join(__dirname, '../../node_modules/dayjs/locale');
const dayjsLocaleFileNames = fs.readdirSync(resourcesDirPath);
const dayjsLocales = dayjsLocaleFileNames
.filter((dayjsLocaleFileName) => dayjsLocaleFileName.endsWith('.js'))
.map((dayjsLocaleFileName) => path.basename(dayjsLocaleFileName, path.extname(dayjsLocaleFileName)));
const outputFileContent = fs.readFileSync(outputFilePath, 'utf-8');
const updatedFileContent = outputFileContent.replace(
/(export const DAYJS_LOCALES = \[)[\s\S]*?(])/g,
`$1'${dayjsLocales.join("', '")}'$2`,
);
fs.writeFileSync(outputFilePath, updatedFileContent);

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import path from 'path';
import fs from 'fs';
const outputFilePath = path.join(__dirname, '../../src/lib/dayjs/LocaleImporter.ts');
const resourcesDirPath = path.join(__dirname, '../../node_modules/dayjs/locale');
const dayjsLocaleFileNames = fs.readdirSync(resourcesDirPath);
const dayjsLocaleToFileName = dayjsLocaleFileNames
.filter((dayjsLocaleFileName) => dayjsLocaleFileName.endsWith('.js'))
.map((dayjsLocaleFileName) => [
path.basename(dayjsLocaleFileName, path.extname(dayjsLocaleFileName)),
dayjsLocaleFileName,
]);
const outputFileContent = fs.readFileSync(outputFilePath, 'utf-8');
const updatedFileContent = outputFileContent.replace(
/(const localesToImport: Record<\(typeof DAYJS_LOCALES\)\[number], \(\) => Promise<unknown>> = \{)[\s\S]*?(})/g,
`$1${dayjsLocaleToFileName.map(([locale, fileName]) => `'${locale}': () => import('dayjs/locale/${fileName}')`).join(',')}$2`,
);
fs.writeFileSync(outputFilePath, updatedFileContent);