feat(i18n): support zh_CN (#51)

This commit is contained in:
scarletsky
2025-11-03 11:26:09 +08:00
committed by GitHub
parent a501a55ae4
commit de3d43b70e
11 changed files with 2340 additions and 5 deletions

View File

@@ -3,7 +3,7 @@ import { formatter } from "@lingui/format-json";
import type { SupportedLocale } from "./src/lib/i18n/schema";
const config = defineConfig({
locales: ["ja", "en"] satisfies SupportedLocale[],
locales: ["ja", "en", "zh_CN"] satisfies SupportedLocale[],
sourceLocale: "en",
fallbackLocales: {
default: "en",

View File

@@ -254,6 +254,9 @@ export const SettingsControls: FC<SettingsControlsProps> = ({
<SelectItem value="en">
<Trans id="settings.locale.en" />
</SelectItem>
<SelectItem value="zh_CN">
<Trans id="settings.locale.zh_CN" />
</SelectItem>
</SelectContent>
</Select>
{showDescriptions && (

View File

@@ -1,6 +1,7 @@
import { format } from "date-fns";
import { enUS } from "date-fns/locale/en-US";
import { ja } from "date-fns/locale/ja";
import { zhCN } from "date-fns/locale/zh-CN";
import type { SupportedLocale } from "../i18n/schema";
export const convertDateFnsLocale = (locale: SupportedLocale) => {
@@ -9,6 +10,8 @@ export const convertDateFnsLocale = (locale: SupportedLocale) => {
return ja;
case "en":
return enUS;
case "zh_CN":
return zhCN;
default:
locale satisfies never;
return enUS;
@@ -49,6 +52,15 @@ export const formatLocaleDate = (
case "time":
return "MM/dd/yyyy HH:mm";
}
} else if (locale === "zh_CN") {
switch (target) {
case "month":
return "yyyy年M月";
case "day":
return "yyyy年M月d日";
case "time":
return "yyyy年M月d日 HH:mm";
}
}
// default
switch (target) {

View File

@@ -1,7 +1,7 @@
import { i18n } from "@lingui/core";
import type { SupportedLocale } from "./schema";
export const locales: SupportedLocale[] = ["ja", "en"];
export const locales: SupportedLocale[] = ["ja", "en", "zh_CN"];
const importMessages = async (locale: SupportedLocale) => {
switch (locale) {
@@ -9,6 +9,8 @@ const importMessages = async (locale: SupportedLocale) => {
return import("./locales/ja/messages");
case "en":
return import("./locales/en/messages");
case "zh_CN":
return import("./locales/zh_CN/messages");
default:
locale satisfies never;
throw new Error(`Unsupported locale: ${locale}`);

View File

@@ -303,6 +303,12 @@
"origin": [["src/components/SettingsControls.tsx", 255]],
"translation": "English"
},
"settings.locale.zh_CN": {
"placeholders": {},
"comments": [],
"origin": [["src/components/SettingsControls.tsx", 258]],
"translation": "Chinese (Simplified)"
},
"settings.locale.description": {
"placeholders": {},
"comments": [],

File diff suppressed because one or more lines are too long

View File

@@ -303,6 +303,12 @@
"origin": [["src/components/SettingsControls.tsx", 255]],
"translation": "English"
},
"settings.locale.zh_CN": {
"placeholders": {},
"comments": [],
"origin": [["src/components/SettingsControls.tsx", 258]],
"translation": "中国語(簡体字)"
},
"settings.locale.description": {
"placeholders": {},
"comments": [],

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
import z from "zod";
export const localeSchema = z.enum(["ja", "en"]);
export const localeSchema = z.enum(["ja", "en", "zh_CN"]);
export type SupportedLocale = z.infer<typeof localeSchema>;