feat: add Chinese translations
This commit is contained in:
@@ -60,3 +60,7 @@ pnpm-debug.log
|
||||
|
||||
# Cloud compose (separate deployment)
|
||||
cloud/
|
||||
|
||||
# Local temporary caches
|
||||
.pnpm-store
|
||||
v8-compile-cache-0
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -4,6 +4,9 @@
|
||||
node_modules
|
||||
.pnp
|
||||
.pnp.js
|
||||
.pnpm/
|
||||
.pnpm-store/
|
||||
v8-compile-cache-0/
|
||||
|
||||
# testing
|
||||
coverage
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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: [
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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": "简体中文",
|
||||
};
|
||||
|
||||
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];
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user