feat: add Chinese translations

This commit is contained in:
2026-08-23 11:58:02 +08:00
parent 02b367fcaa
commit 5a8a478386
10 changed files with 12777 additions and 8 deletions

View File

@@ -60,3 +60,7 @@ pnpm-debug.log
# Cloud compose (separate deployment)
cloud/
# Local temporary caches
.pnpm-store
v8-compile-cache-0

3
.gitignore vendored
View File

@@ -4,6 +4,9 @@
node_modules
.pnp
.pnp.js
.pnpm/
.pnpm-store/
v8-compile-cache-0/
# testing
coverage

View File

@@ -2,7 +2,7 @@
"version": "1.10",
"locale": {
"source": "en",
"targets": ["fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR"]
"targets": ["fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR", "zh-CN"]
},
"buckets": {
"json": {

View File

@@ -3,7 +3,7 @@ import { formatter } from "@lingui/format-json";
export default defineConfig({
locales: ["en", "fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR"],
locales: ["en", "fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR", "zh-CN"],
sourceLocale: "en",
catalogs: [
{

View File

@@ -1,6 +1,6 @@
import type { Locale as DateFnsLocale } from "date-fns";
import { useLingui } from "@lingui/react";
import { de, enGB, es, fr, it, nl, pl, ptBR, ru } from "date-fns/locale";
import { de, enGB, es, fr, it, nl, pl, ptBR, ru, zhCN } from "date-fns/locale";
import type { Locale } from "~/locales";
import { useLinguiContext } from "~/providers/lingui";
@@ -20,6 +20,7 @@ export function useLocalisation() {
ru,
pl,
ptbr: ptBR,
"zh-CN": zhCN,
};
const currentDateLocale = dateLocaleMap[locale] ?? enGB;

View File

@@ -7,7 +7,8 @@ export const locales = [
"nl",
"ru",
"pl",
"ptbr"
"ptbr",
"zh-CN",
] as const;
export type Locale = (typeof locales)[number];
@@ -24,4 +25,5 @@ export const localeNames: Record<Locale, string> = {
ru: "Русский",
pl: "Polski",
ptbr: "Português",
"zh-CN": "简体中文",
};

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -35,10 +35,31 @@ function detectBrowserLocale(availableLocales: readonly string[]): Locale {
const browserLanguages = navigator.languages || [navigator.language];
for (const browserLang of browserLanguages) {
const langCode = browserLang.split("-")[0];
const normalizedLocale = browserLang.toLowerCase();
const exactLocale = availableLocales.find(
(availableLocale) => availableLocale.toLowerCase() === normalizedLocale,
);
if (langCode && availableLocales.includes(langCode.toLowerCase())) {
return langCode.toLowerCase() as Locale;
if (exactLocale) {
return exactLocale as Locale;
}
const languageCode = normalizedLocale.split("-")[0];
if (languageCode === "zh" && availableLocales.includes("zh-CN")) {
return "zh-CN";
}
if (languageCode === "pt" && availableLocales.includes("ptbr")) {
return "ptbr";
}
const baseLocale = availableLocales.find(
(availableLocale) => availableLocale.toLowerCase() === languageCode,
);
if (baseLocale) {
return baseLocale as Locale;
}
}

View File

@@ -24,6 +24,8 @@ const loadMessages = async (locale: Locale) => {
return (await import("~/locales/pl/messages")).messages;
case "ptbr":
return (await import("~/locales/ptbr/messages")).messages;
case "zh-CN":
return (await import("~/locales/zh-CN/messages")).messages;
default:
return enMessages;
}