i18n: add translations for Bahasa Melayu(ms) (#2543)

This commit is contained in:
Huang Xin
2025-11-25 17:35:29 +08:00
committed by GitHub
parent 6f8b2d1dc4
commit 0c51a625f3
32 changed files with 729 additions and 82 deletions
@@ -33,7 +33,7 @@ const ThemePreview: React.FC<{
>
<p className='mb-2 whitespace-pre-line text-xs'>
{_(
"All the world's a stage,\nAnd all the men and women merely players;\nThey have their exits and their entrances,\nAnd one man in his time plays many parts,\nHis acts being seven ages.\n\n—William Shakespeare",
"All the world's a stage,\nAnd all the men and women merely players;\nThey have their exits and their entrances,\nAnd one man in his time plays many parts,\nHis acts being seven ages.\n\n— William Shakespeare",
)}
{'\n\n'}
<span
@@ -711,6 +711,7 @@ export const TRANSLATED_LANGS = {
id: 'Indonesia',
vi: 'Tiếng Việt',
th: 'ภาษาไทย',
ms: 'Melayu',
bo: 'བོད་སྐད་',
bn: 'বাংলা',
ta: 'தமிழ்',
+23 -53
View File
@@ -12,65 +12,35 @@ export const isCJKLang = (lang: string | null | undefined): boolean => {
return ['zh', 'ja', 'ko', 'zho', 'jpn', 'kor'].includes(normalizedLang);
};
export const normalizeToFullLang = (langCode: string): string => {
const mapping: Record<string, string> = {
en: 'en-US',
fr: 'fr-FR',
de: 'de-DE',
es: 'es-ES',
it: 'it-IT',
ja: 'ja-JP',
ko: 'ko-KR',
pt: 'pt-PT',
ar: 'ar-SA',
fa: 'fa-IR',
nl: 'nl-NL',
pl: 'pl-PL',
tr: 'tr-TR',
id: 'id-ID',
ru: 'ru-RU',
uk: 'uk-UA',
th: 'th-TH',
nb: 'nb-NO',
sv: 'sv-SE',
fi: 'fi-FI',
da: 'da-DK',
cs: 'cs-CZ',
hu: 'hu-HU',
ro: 'ro-RO',
bg: 'bg-BG',
hr: 'hr-HR',
lt: 'lt-LT',
sl: 'sl-SI',
sk: 'sk-SK',
bo: 'bo-CN',
bn: 'bn-BD',
ta: 'ta-IN',
si: 'si-LK',
zh: 'zh-Hans',
'zh-cn': 'zh-Hans',
'zh-tw': 'zh-Hant',
'zh-mo': 'zh-Hant',
'zh-hans': 'zh-Hans',
'zh-hant': 'zh-Hant',
};
const ZH_SCRIPTS_MAPPING: Record<string, string> = {
zh: 'zh-Hans',
'zh-cn': 'zh-Hans',
'zh-hk': 'zh-Hant',
'zh-tw': 'zh-Hant',
'zh-mo': 'zh-Hant',
'zh-hans': 'zh-Hans',
'zh-hant': 'zh-Hant',
};
return mapping[langCode.toLowerCase()] || langCode;
export const normalizeToFullLang = (langCode: string): string => {
try {
const locale = new Intl.Locale(langCode.toLowerCase());
const maximized = locale.maximize();
if (maximized.language === 'zh') {
return maximized.script === 'Hant' ? 'zh-Hant' : 'zh-Hans';
}
return maximized.region ? `${maximized.language}-${maximized.region}` : langCode;
} catch {
return ZH_SCRIPTS_MAPPING[langCode.toLowerCase()] || langCode;
}
};
export const normalizeToShortLang = (langCode: string): string => {
const lang = langCode.toLowerCase();
const mapping: Record<string, string> = {
'zh-cn': 'zh-Hans',
'zh-tw': 'zh-Hant',
'zh-hk': 'zh-Hant',
'zh-mo': 'zh-Hant',
'zh-hans': 'zh-Hans',
'zh-hant': 'zh-Hant',
};
if (lang.startsWith('zh')) {
return mapping[lang] || 'zh-Hans';
return ZH_SCRIPTS_MAPPING[lang] || 'zh-Hans';
}
return lang.split('-')[0]!;
};