feat(i18n): standardize bilingual catalogs and tooling

This commit is contained in:
Maofeng
2026-09-20 15:52:31 +08:00
parent ea00a71112
commit 6cd981d6a2
92 changed files with 685 additions and 1986 deletions
+10 -5
View File
@@ -1,6 +1,6 @@
{
"sourceLocale": "en",
"locales": ["en", "zh-Hans"],
"sourceLocale": "en-US",
"locales": ["en-US", "zh-Hans"],
"catalogPath": "src/locales/{locale}/messages",
"catalogSources": [
"@workspace/ui/locales/{locale}",
@@ -10,9 +10,14 @@
"@workspace/blocks/media/locales/{locale}",
"@workspace/blocks/navigation/locales/{locale}",
"@workspace/blocks/notifications/locales/{locale}",
"@workspace/blocks/search/locales/{locale}",
"@workspace/search/locales/{locale}",
"@workspace/lexical/locales/{locale}"
],
"include": ["src", "../../packages/blocks/src", "../../packages/ui/src"],
"include": [
"src",
"../../packages/blocks/src",
"../../packages/search/src",
"../../packages/ui/src"
],
"exclude": ["**/*.test.{ts,tsx}", "**/node_modules/**"]
}
}
+2 -2
View File
@@ -19,7 +19,7 @@ import {
I18nProvider as UiI18nProvider,
type CalendarLocale,
} from "@workspace/ui/components/i18n"
import { calendarLocale as englishCalendarLocale } from "@workspace/ui/locales/en"
import { calendarLocale as englishCalendarLocale } from "@workspace/ui/locales/en-US"
import { calendarLocale as simplifiedChineseCalendarLocale } from "@workspace/ui/locales/zh-Hans"
import { appLocales, DEFAULT_APP_LOCALE, type AppLocale } from "./app-locales"
@@ -27,7 +27,7 @@ import { AppI18nDevtool } from "./app-i18n-devtool"
import { setAppLocale as persistAppLocale } from "@/server/app-locale.functions"
const appCalendarLocales: Partial<Record<AppLocale, CalendarLocale>> = {
en: englishCalendarLocale,
"en-US": englishCalendarLocale,
"zh-Hans": simplifiedChineseCalendarLocale,
}
@@ -7,16 +7,11 @@ import { AppLanguageSwitcher } from "./app-language-switcher"
vi.mock("./app-i18n-provider", () => ({
useAppLocale: () => ({
locale: "en",
locale: "en-US",
setLocale: vi.fn(),
}),
}))
vi.mock("country-flag-icons/react/1x1", () => ({
CN: () => <svg />,
US: () => <svg />,
}))
beforeAll(() => {
vi.stubGlobal(
"ResizeObserver",
+2 -2
View File
@@ -1,6 +1,6 @@
import type { LocaleDefinition } from "@workspace/i18n"
export type AppLocale = "en" | "zh-Hans"
export type AppLocale = "en-US" | "zh-Hans"
export type AppLocaleCountry = "CN" | "US"
export interface AppLocaleDefinition extends LocaleDefinition {
@@ -16,7 +16,7 @@ export const appLocales = [
direction: "ltr",
languageTag: "en-US",
label: "English",
locale: "en",
locale: "en-US",
},
{
country: "CN",
@@ -4,7 +4,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: en\n"
"Language: en-US\n"
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: \n"
@@ -23,6 +23,21 @@ msgstr "Account password"
msgid "blocks.appearance.active"
msgstr "Active"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:16
msgid "blocks.chats.actions.addEmoji"
msgstr "Add emoji"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:4
msgid "blocks.chats.actions.addFiles"
msgstr "Add files"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:8
msgid "blocks.chats.actions.addImage"
msgstr "Add image"
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:276
msgid "app.navigation.system-members-admins"
@@ -33,6 +48,11 @@ msgstr "Administrator accounts"
msgid "app.navigation.after-sales-center"
msgstr "After-sales"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:12
msgid "blocks.chats.emojiPicker.allEmojis"
msgstr "All emojis"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/appearance/messages.ts:91
msgid "blocks.appearance.color.amber"
@@ -73,6 +93,11 @@ msgstr "Awaiting payment"
msgid "app.navigation.trade-orders-awaiting-shipment"
msgstr "Awaiting shipment"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:20
msgid "blocks.chats.actions.backToConversations"
msgstr "Back to conversations"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/appearance/messages.ts:16
msgid "blocks.appearance.baseColor"
@@ -124,7 +149,7 @@ msgid "app.navigation.report-channels"
msgstr "Channel analysis"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:4
#: ../../packages/blocks/src/blocks/chats/messages.ts:112
msgid "blocks.chats.title"
msgstr "Chats"
@@ -133,6 +158,11 @@ msgstr "Chats"
msgid "blocks.notifications.error.description"
msgstr "Check your network connection and try again."
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:108
msgid "blocks.chats.selectConversation.description"
msgstr "Choose a conversation from the list to read its messages."
#. js-lingui-explicit-id
#: ../../packages/ui/src/components/i18n.tsx:29
msgid "ui.common.close"
@@ -158,6 +188,11 @@ msgstr "Completed orders"
msgid "app.navigation.content-assets"
msgstr "Content"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:24
msgid "blocks.chats.actions.conversationDetails"
msgstr "Conversation details"
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:192
msgid "app.navigation.marketing-coupons"
@@ -218,6 +253,11 @@ msgstr "Dark theme"
msgid "app.navigation.data-and-finance"
msgstr "Data and finance"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:52
msgid "blocks.chats.messageStatus.delivered"
msgstr "Delivered"
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:296
msgid "app.navigation.system-notification-logs"
@@ -343,6 +383,11 @@ msgstr "Light theme"
msgid "blocks.appearance.color.lime"
msgstr "Lime"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:28
msgid "blocks.chats.actions.loadEarlier"
msgstr "Load earlier messages"
#. js-lingui-explicit-id
#: ../../packages/ui/src/components/i18n.tsx:37
msgid "ui.common.loading"
@@ -383,6 +428,11 @@ msgstr "Media"
msgid "app.navigation.loyalty-center"
msgstr "Membership benefits"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:84
msgid "blocks.chats.emptyMessages.description"
msgstr "Messages in this conversation will appear here."
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/appearance/messages.ts:127
msgid "blocks.appearance.color.mist"
@@ -433,11 +483,31 @@ msgstr "Next"
msgid "ui.carousel.nextSlide"
msgstr "Next slide"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:80
msgid "blocks.chats.emptyConversations.title"
msgstr "No conversations"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:92
msgid "blocks.chats.emptySearch"
msgstr "No conversations match your search."
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:88
msgid "blocks.chats.emptyMessages.title"
msgstr "No messages yet"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/notifications/messages.ts:12
msgid "blocks.notifications.empty.title"
msgstr "No notifications"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:56
msgid "blocks.chats.messageStatus.failed"
msgstr "Not sent"
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:292
msgid "app.navigation.system-notification-templates"
@@ -543,6 +613,11 @@ msgstr "Pink"
msgid "app.navigation.loyalty-points"
msgstr "Points rules"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:44
msgid "blocks.chats.actions.sendOnEnter"
msgstr "Press Enter to send"
#. js-lingui-explicit-id
#: ../../packages/ui/src/components/i18n.tsx:65
msgid "ui.pagination.previous"
@@ -598,11 +673,21 @@ msgstr "Products and inventory"
msgid "blocks.appearance.color.purple"
msgstr "Purple"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:60
msgid "blocks.chats.messageStatus.read"
msgstr "Read"
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:12
msgid "app.navigation.overview-realtime"
msgstr "Real-time monitoring"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:64
msgid "blocks.chats.emojiPicker.recentEmojis"
msgstr "Recently used"
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:256
msgid "app.navigation.finance-reconciliation"
@@ -638,6 +723,11 @@ msgstr "Refresh the current page data"
msgid "app.navigation.after-sales-refunds"
msgstr "Refund review"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:32
msgid "blocks.chats.actions.removeAttachment"
msgstr "Remove {name}"
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:228
msgid "app.navigation.report-center"
@@ -668,6 +758,36 @@ msgstr "Rose"
msgid "app.navigation.report-sales"
msgstr "Sales analysis"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:100
msgid "blocks.chats.search"
msgstr "Search conversations"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:104
msgid "blocks.chats.selectConversation"
msgstr "Select conversation {title}"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:40
msgid "blocks.chats.actions.send"
msgstr "Send"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:72
msgid "blocks.chats.messageStatus.sending"
msgstr "Sending"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:48
msgid "blocks.chats.actions.sending"
msgstr "Sending…"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:68
msgid "blocks.chats.messageStatus.sent"
msgstr "Sent"
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:252
msgid "app.navigation.finance-settlements"
@@ -698,6 +818,11 @@ msgstr "Sky"
msgid "app.navigation.catalog-product-specifications"
msgstr "Specification templates"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:76
msgid "blocks.chats.emptyConversations.description"
msgstr "Start a conversation to see it here."
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:80
msgid "app.navigation.inventory-transfers"
@@ -803,6 +928,11 @@ msgstr "Toggle theme"
msgid "app.navigation.after-sales-disputes"
msgstr "Transaction disputes"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:36
msgid "blocks.chats.actions.retry"
msgstr "Try again"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/notifications/messages.ts:36
msgid "blocks.notifications.retry"
@@ -843,6 +973,11 @@ msgstr "Violet"
msgid "app.navigation.system-integration-webhooks"
msgstr "Webhook configuration"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:96
msgid "blocks.chats.messagePlaceholder"
msgstr "Write a message…"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/appearance/messages.ts:179
msgid "blocks.appearance.color.yellow"
File diff suppressed because one or more lines are too long
+136 -1
View File
@@ -23,6 +23,21 @@ msgstr "账号密码"
msgid "blocks.appearance.active"
msgstr "使用中"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:16
msgid "blocks.chats.actions.addEmoji"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:4
msgid "blocks.chats.actions.addFiles"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:8
msgid "blocks.chats.actions.addImage"
msgstr ""
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:276
msgid "app.navigation.system-members-admins"
@@ -33,6 +48,11 @@ msgstr "管理员账号"
msgid "app.navigation.after-sales-center"
msgstr "售后中心"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:12
msgid "blocks.chats.emojiPicker.allEmojis"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/appearance/messages.ts:91
msgid "blocks.appearance.color.amber"
@@ -73,6 +93,11 @@ msgstr "待付款订单"
msgid "app.navigation.trade-orders-awaiting-shipment"
msgstr "待发货订单"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:20
msgid "blocks.chats.actions.backToConversations"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/appearance/messages.ts:16
msgid "blocks.appearance.baseColor"
@@ -124,7 +149,7 @@ msgid "app.navigation.report-channels"
msgstr "渠道分析"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:4
#: ../../packages/blocks/src/blocks/chats/messages.ts:112
msgid "blocks.chats.title"
msgstr "聊天"
@@ -133,6 +158,11 @@ msgstr "聊天"
msgid "blocks.notifications.error.description"
msgstr "请检查网络连接后重试。"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:108
msgid "blocks.chats.selectConversation.description"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/ui/src/components/i18n.tsx:29
msgid "ui.common.close"
@@ -158,6 +188,11 @@ msgstr "已完成订单"
msgid "app.navigation.content-assets"
msgstr "内容素材"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:24
msgid "blocks.chats.actions.conversationDetails"
msgstr ""
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:192
msgid "app.navigation.marketing-coupons"
@@ -218,6 +253,11 @@ msgstr "深色主题"
msgid "app.navigation.data-and-finance"
msgstr "数据与财务"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:52
msgid "blocks.chats.messageStatus.delivered"
msgstr ""
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:296
msgid "app.navigation.system-notification-logs"
@@ -343,6 +383,11 @@ msgstr "浅色主题"
msgid "blocks.appearance.color.lime"
msgstr "青柠色"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:28
msgid "blocks.chats.actions.loadEarlier"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/ui/src/components/i18n.tsx:37
msgid "ui.common.loading"
@@ -383,6 +428,11 @@ msgstr "媒体资源"
msgid "app.navigation.loyalty-center"
msgstr "会员权益"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:84
msgid "blocks.chats.emptyMessages.description"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/appearance/messages.ts:127
msgid "blocks.appearance.color.mist"
@@ -433,11 +483,31 @@ msgstr "下一页"
msgid "ui.carousel.nextSlide"
msgstr "下一张"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:80
msgid "blocks.chats.emptyConversations.title"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:92
msgid "blocks.chats.emptySearch"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:88
msgid "blocks.chats.emptyMessages.title"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/notifications/messages.ts:12
msgid "blocks.notifications.empty.title"
msgstr "暂无通知"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:56
msgid "blocks.chats.messageStatus.failed"
msgstr ""
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:292
msgid "app.navigation.system-notification-templates"
@@ -543,6 +613,11 @@ msgstr "粉色"
msgid "app.navigation.loyalty-points"
msgstr "积分规则"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:44
msgid "blocks.chats.actions.sendOnEnter"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/ui/src/components/i18n.tsx:65
msgid "ui.pagination.previous"
@@ -598,11 +673,21 @@ msgstr "商品与库存"
msgid "blocks.appearance.color.purple"
msgstr "紫色"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:60
msgid "blocks.chats.messageStatus.read"
msgstr ""
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:12
msgid "app.navigation.overview-realtime"
msgstr "实时监控"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:64
msgid "blocks.chats.emojiPicker.recentEmojis"
msgstr ""
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:256
msgid "app.navigation.finance-reconciliation"
@@ -638,6 +723,11 @@ msgstr "刷新当前页面的数据"
msgid "app.navigation.after-sales-refunds"
msgstr "退款审核"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:32
msgid "blocks.chats.actions.removeAttachment"
msgstr ""
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:228
msgid "app.navigation.report-center"
@@ -668,6 +758,36 @@ msgstr "玫红色"
msgid "app.navigation.report-sales"
msgstr "销售分析"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:100
msgid "blocks.chats.search"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:104
msgid "blocks.chats.selectConversation"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:40
msgid "blocks.chats.actions.send"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:72
msgid "blocks.chats.messageStatus.sending"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:48
msgid "blocks.chats.actions.sending"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:68
msgid "blocks.chats.messageStatus.sent"
msgstr ""
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:252
msgid "app.navigation.finance-settlements"
@@ -698,6 +818,11 @@ msgstr "天蓝色"
msgid "app.navigation.catalog-product-specifications"
msgstr "规格模板"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:76
msgid "blocks.chats.emptyConversations.description"
msgstr ""
#. js-lingui-explicit-id
#: src/data/navigation-messages.ts:80
msgid "app.navigation.inventory-transfers"
@@ -803,6 +928,11 @@ msgstr "切换主题"
msgid "app.navigation.after-sales-disputes"
msgstr "交易纠纷"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:36
msgid "blocks.chats.actions.retry"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/notifications/messages.ts:36
msgid "blocks.notifications.retry"
@@ -843,6 +973,11 @@ msgstr "紫罗兰色"
msgid "app.navigation.system-integration-webhooks"
msgstr "Webhook 配置"
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/chats/messages.ts:96
msgid "blocks.chats.messagePlaceholder"
msgstr ""
#. js-lingui-explicit-id
#: ../../packages/blocks/src/blocks/appearance/messages.ts:179
msgid "blocks.appearance.color.yellow"
File diff suppressed because one or more lines are too long
+1
View File
@@ -1,3 +1,4 @@
// oxlint-disable-next-line import/no-unassigned-import -- Enforces server-only module usage.
import "@tanstack/react-start/server-only"
import { getCookie, setCookie } from "@tanstack/react-start/server"