feat: add Chinese translations
This commit is contained in:
@@ -60,3 +60,7 @@ pnpm-debug.log
|
|||||||
|
|
||||||
# Cloud compose (separate deployment)
|
# Cloud compose (separate deployment)
|
||||||
cloud/
|
cloud/
|
||||||
|
|
||||||
|
# Local temporary caches
|
||||||
|
.pnpm-store
|
||||||
|
v8-compile-cache-0
|
||||||
|
|||||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -4,6 +4,9 @@
|
|||||||
node_modules
|
node_modules
|
||||||
.pnp
|
.pnp
|
||||||
.pnp.js
|
.pnp.js
|
||||||
|
.pnpm/
|
||||||
|
.pnpm-store/
|
||||||
|
v8-compile-cache-0/
|
||||||
|
|
||||||
# testing
|
# testing
|
||||||
coverage
|
coverage
|
||||||
@@ -58,4 +61,4 @@ i18n.cache
|
|||||||
# local scripts
|
# local scripts
|
||||||
scripts/
|
scripts/
|
||||||
|
|
||||||
.claude
|
.claude
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"version": "1.10",
|
"version": "1.10",
|
||||||
"locale": {
|
"locale": {
|
||||||
"source": "en",
|
"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": {
|
"buckets": {
|
||||||
"json": {
|
"json": {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { formatter } from "@lingui/format-json";
|
|||||||
|
|
||||||
|
|
||||||
export default defineConfig({
|
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",
|
sourceLocale: "en",
|
||||||
catalogs: [
|
catalogs: [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import type { Locale as DateFnsLocale } from "date-fns";
|
import type { Locale as DateFnsLocale } from "date-fns";
|
||||||
import { useLingui } from "@lingui/react";
|
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 type { Locale } from "~/locales";
|
||||||
import { useLinguiContext } from "~/providers/lingui";
|
import { useLinguiContext } from "~/providers/lingui";
|
||||||
@@ -20,6 +20,7 @@ export function useLocalisation() {
|
|||||||
ru,
|
ru,
|
||||||
pl,
|
pl,
|
||||||
ptbr: ptBR,
|
ptbr: ptBR,
|
||||||
|
"zh-CN": zhCN,
|
||||||
};
|
};
|
||||||
|
|
||||||
const currentDateLocale = dateLocaleMap[locale] ?? enGB;
|
const currentDateLocale = dateLocaleMap[locale] ?? enGB;
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ export const locales = [
|
|||||||
"nl",
|
"nl",
|
||||||
"ru",
|
"ru",
|
||||||
"pl",
|
"pl",
|
||||||
"ptbr"
|
"ptbr",
|
||||||
|
"zh-CN",
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export type Locale = (typeof locales)[number];
|
export type Locale = (typeof locales)[number];
|
||||||
@@ -24,4 +25,5 @@ export const localeNames: Record<Locale, string> = {
|
|||||||
ru: "Русский",
|
ru: "Русский",
|
||||||
pl: "Polski",
|
pl: "Polski",
|
||||||
ptbr: "Português",
|
ptbr: "Português",
|
||||||
|
"zh-CN": "简体中文",
|
||||||
};
|
};
|
||||||
|
|||||||
12735
apps/web/src/locales/zh-CN/messages.json
Normal file
12735
apps/web/src/locales/zh-CN/messages.json
Normal file
File diff suppressed because it is too large
Load Diff
1
apps/web/src/locales/zh-CN/messages.ts
Normal file
1
apps/web/src/locales/zh-CN/messages.ts
Normal file
File diff suppressed because one or more lines are too long
@@ -35,10 +35,31 @@ function detectBrowserLocale(availableLocales: readonly string[]): Locale {
|
|||||||
const browserLanguages = navigator.languages || [navigator.language];
|
const browserLanguages = navigator.languages || [navigator.language];
|
||||||
|
|
||||||
for (const browserLang of browserLanguages) {
|
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())) {
|
if (exactLocale) {
|
||||||
return langCode.toLowerCase() as Locale;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ const loadMessages = async (locale: Locale) => {
|
|||||||
return (await import("~/locales/pl/messages")).messages;
|
return (await import("~/locales/pl/messages")).messages;
|
||||||
case "ptbr":
|
case "ptbr":
|
||||||
return (await import("~/locales/ptbr/messages")).messages;
|
return (await import("~/locales/ptbr/messages")).messages;
|
||||||
|
case "zh-CN":
|
||||||
|
return (await import("~/locales/zh-CN/messages")).messages;
|
||||||
default:
|
default:
|
||||||
return enMessages;
|
return enMessages;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user