Commit 9e4647b

HPCesia <me@hpcesia.com>
2025-05-20 06:41:28
feat(i18n): add zh-TW locale
1 parent 443ada1
i18n/zh-TW/cli/index.ts
@@ -0,0 +1,59 @@
+import type { NamespaceCliTranslation } from '../../i18n-types.js';
+
+const zh_TW_cli = {
+  new: {
+    prompt: {
+      title: '請輸入新文章的標題:',
+      category: '請輸入文章分類(可選):',
+      tags: '請輸入文章標籤,以逗號分隔(可選):',
+    },
+    action: {
+      exit: '退出,不創建草稿',
+    },
+    info: {
+      success_created: '成功創建文章:{filePath}',
+      overwrite: '正在覆蓋現有文件:{filePath}',
+    },
+    error: {
+      no_title: '文章標題不能為空。',
+    },
+  },
+  pub: {
+    prompt: {
+      select: '請選擇要發布的草稿:',
+    },
+    action: {
+      exit: '退出,不發布',
+    },
+    info: {
+      no_drafts_found: '未找到可發布的草稿。',
+      success_article_published: "成功將 '{source}' 發布到 '{destination}'。",
+      info_empty_dir_removed: '已清理空的源目錄:{dirPath}',
+      publish_cancelled: '發布操作已取消。',
+    },
+    error: {
+      publish_article: '發布文章時出錯:{message}',
+    },
+  },
+  prompt: {
+    file_exists: '文件 {filePath} 已存在。請選擇操作:',
+    enter_new_name: '請輸入新文件名(不帶擴展名):',
+  },
+  action: {
+    rename: '重命名文件',
+    overwrite: '覆蓋現有文件',
+  },
+  info: {
+    cancelled_by_user: '用戶已取消操作。',
+  },
+  error: {
+    unexpected: '發生意外錯誤:{message}',
+    generic: '發生錯誤:{message}',
+    file_exists: '文件已存在:{filePath}',
+    create_file: '創建文件時出錯:{message}',
+    empty_filename: '文件名不能為空。',
+    rename_to_original_conflict: '新文件名與原文件名衝突:{fileName}',
+  },
+} satisfies NamespaceCliTranslation;
+
+export default zh_TW_cli;
i18n/zh-TW/index.ts
@@ -0,0 +1,7 @@
+import type { Translation } from '../i18n-types.js';
+
+const zh_TW = {
+  // Add non-namespaced Chinese translations here if needed
+} satisfies Translation;
+
+export default zh_TW;
i18n/i18n-types.ts
@@ -8,6 +8,7 @@ export type BaseLocale = 'en'
 export type Locales =
 	| 'en'
 	| 'zh-CN'
+	| 'zh-TW'
 
 export type Translation = RootTranslation & DisallowNamespaces
 
i18n/i18n-util.async.ts
@@ -8,6 +8,7 @@ import { loadedFormatters, loadedLocales, locales } from './i18n-util.js'
 const localeTranslationLoaders = {
 	en: () => import('./en/index.js'),
 	'zh-CN': () => import('./zh-CN/index.js'),
+	'zh-TW': () => import('./zh-TW/index.js'),
 }
 
 const localeNamespaceLoaders = {
@@ -16,6 +17,9 @@ const localeNamespaceLoaders = {
 	},
 	'zh-CN': {
 		cli: () => import('./zh-CN/cli/index.js')
+	},
+	'zh-TW': {
+		cli: () => import('./zh-TW/cli/index.js')
 	}
 }
 
i18n/i18n-util.sync.ts
@@ -7,9 +7,11 @@ import { loadedFormatters, loadedLocales, locales } from './i18n-util.js'
 
 import en from './en/index.js'
 import zh_CN from './zh-CN/index.js'
+import zh_TW from './zh-TW/index.js'
 
 import en_cli from './en/cli/index.js'
 import zh_CN_cli from './zh-CN/cli/index.js'
+import zh_TW_cli from './zh-TW/cli/index.js'
 
 const localeTranslations = {
 	en: {
@@ -20,6 +22,10 @@ const localeTranslations = {
 		...zh_CN,
 		cli: zh_CN_cli
 	},
+	'zh-TW': {
+		...zh_TW,
+		cli: zh_TW_cli
+	},
 }
 
 export const loadLocale = (locale: Locales): void => {
i18n/i18n-util.ts
@@ -12,7 +12,8 @@ export const baseLocale: Locales = 'en'
 
 export const locales: Locales[] = [
 	'en',
-	'zh-CN'
+	'zh-CN',
+	'zh-TW'
 ]
 
 export const namespaces: Namespaces[] = [
scripts/new.ts
@@ -20,7 +20,7 @@ interface CLIOptions extends OptionValues {
 const program = new Command<[], CLIOptions>();
 
 // Determine current locale
-const availableLocalesForScript: Locales[] = ['en', 'zh-CN'];
+const availableLocalesForScript: Locales[] = ['en', 'zh-CN', 'zh-TW'];
 let detectedSystemLocale: string = 'en';
 try {
   detectedSystemLocale = osLocaleSync().replace('_', '-');
scripts/pub.ts
@@ -10,7 +10,7 @@ import fs from 'node:fs/promises';
 import path from 'node:path';
 import { osLocaleSync } from 'os-locale';
 
-const availableLocalesForScript: Locales[] = ['en', 'zh-CN'];
+const availableLocalesForScript: Locales[] = ['en', 'zh-CN', 'zh-TW'];
 let detectedSystemLocale: string = 'en';
 try {
   detectedSystemLocale = osLocaleSync().replace('_', '-');