mirror of
https://gitee.com/mirrors/AllinSSL.git
synced 2026-03-23 14:14:32 +08:00
371 lines
11 KiB
TypeScript
371 lines
11 KiB
TypeScript
// 定义完整的基准模板结构
|
||
type TranslationTemplate = {
|
||
useModal: {
|
||
cannotClose: string
|
||
cancel: string
|
||
confirm: string
|
||
}
|
||
useBatch: {
|
||
batchOperation: string
|
||
selectedItems: (count: number) => string
|
||
startBatch: string
|
||
placeholder: string
|
||
}
|
||
useForm: {
|
||
submit: string
|
||
reset: string
|
||
expand: string
|
||
collapse: string
|
||
moreConfig: string
|
||
help: string
|
||
required: string
|
||
placeholder: (label: string) => string
|
||
}
|
||
useFullScreen: {
|
||
exit: string
|
||
enter: string
|
||
}
|
||
useTable: {
|
||
operation: string
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @description 格式化字符串,将传入的变量依次插入 `{}` 占位符
|
||
* @param {string} template 需要格式化的字符串,使用 `{}` 作为占位符
|
||
* @param {...any} values 需要插入的多个变量
|
||
* @returns {string} 格式化后的字符串
|
||
* @example
|
||
* formatString("你好,我是 {},今年 {} 岁", "小明", 25);
|
||
* // 返回:"你好,我是 小明,今年 25 岁"
|
||
*/
|
||
const formatString = (template: string, ...values: any[]) => {
|
||
let index = 0
|
||
return template.replace(/\{\}/g, () => (values[index] !== undefined ? values[index++] : ''))
|
||
}
|
||
|
||
// 创建语言翻译生成器函数
|
||
const createTranslation = <T = TranslationTemplate>(translation: T): T => translation
|
||
|
||
/**
|
||
* 国际化翻译
|
||
*/
|
||
export const translation = {
|
||
zhCN: createTranslation({
|
||
useModal: {
|
||
cannotClose: '当前状态无法关闭弹窗',
|
||
cancel: '取消',
|
||
confirm: '确认',
|
||
},
|
||
useBatch: {
|
||
batchOperation: '批量操作',
|
||
selectedItems: (count: number) => formatString('已选择 {} 项', count),
|
||
startBatch: '开始批量操作',
|
||
placeholder: '请选择操作',
|
||
},
|
||
useForm: {
|
||
submit: '提交',
|
||
reset: '重置',
|
||
expand: '展开',
|
||
collapse: '收起',
|
||
moreConfig: '更多配置',
|
||
help: '帮助文档',
|
||
required: '必填项',
|
||
placeholder: (label: string) => formatString('请输入{}', label),
|
||
},
|
||
useFullScreen: {
|
||
exit: '退出全屏',
|
||
enter: '进入全屏',
|
||
},
|
||
useTable: {
|
||
operation: '操作',
|
||
total: (total: number) => formatString('共 {} 条', total),
|
||
},
|
||
}),
|
||
zhTW: createTranslation({
|
||
useModal: {
|
||
cannotClose: '當前狀態無法關閉彈窗',
|
||
cancel: '取消',
|
||
confirm: '確認',
|
||
},
|
||
useBatch: {
|
||
batchOperation: '批量操作',
|
||
selectedItems: (count: number) => formatString('已選擇 {} 項', count),
|
||
startBatch: '開始批量操作',
|
||
placeholder: '請選擇操作',
|
||
},
|
||
useForm: {
|
||
submit: '提交',
|
||
reset: '重置',
|
||
expand: '展開',
|
||
collapse: '收起',
|
||
moreConfig: '更多配置',
|
||
help: '幫助文檔',
|
||
required: '必填項',
|
||
placeholder: (label: string) => formatString('請輸入{}', label),
|
||
},
|
||
useFullScreen: {
|
||
exit: '退出全屏',
|
||
enter: '進入全屏',
|
||
},
|
||
useTable: {
|
||
operation: '操作',
|
||
total: (total: number) => formatString('共 {} 條', total),
|
||
},
|
||
}),
|
||
enUS: createTranslation({
|
||
useModal: {
|
||
cannotClose: 'Cannot close the dialog in current state',
|
||
cancel: 'Cancel',
|
||
confirm: 'Confirm',
|
||
},
|
||
useBatch: {
|
||
batchOperation: 'Batch Operation',
|
||
selectedItems: (count: number) => formatString('{} items selected', count),
|
||
startBatch: 'Start Batch Operation',
|
||
placeholder: 'Select operation',
|
||
},
|
||
useForm: {
|
||
submit: 'Submit',
|
||
reset: 'Reset',
|
||
expand: 'Expand',
|
||
collapse: 'Collapse',
|
||
moreConfig: 'More Configuration',
|
||
help: 'Help Documentation',
|
||
required: 'Required',
|
||
placeholder: (label: string) => formatString('Please enter {}', label),
|
||
},
|
||
useFullScreen: {
|
||
exit: 'Exit Fullscreen',
|
||
enter: 'Enter Fullscreen',
|
||
},
|
||
useTable: {
|
||
operation: 'Operation',
|
||
total: (total: number) => formatString('Total {} items', total),
|
||
},
|
||
}),
|
||
jaJP: createTranslation({
|
||
useModal: {
|
||
cannotClose: '現在の状態ではダイアログを閉じることができません',
|
||
cancel: 'キャンセル',
|
||
confirm: '確認',
|
||
},
|
||
useBatch: {
|
||
batchOperation: 'バッチ操作',
|
||
selectedItems: (count: number) => formatString('{}項目が選択されました', count),
|
||
startBatch: 'バッチ操作を開始',
|
||
placeholder: '操作を選択',
|
||
},
|
||
useForm: {
|
||
submit: '提出する',
|
||
reset: 'リセット',
|
||
expand: '展開',
|
||
collapse: '折りたたみ',
|
||
moreConfig: '詳細設定',
|
||
help: 'ヘルプドキュメント',
|
||
required: '必須',
|
||
placeholder: (label: string) => formatString('{}を入力してください', label),
|
||
},
|
||
useFullScreen: {
|
||
exit: '全画面表示を終了',
|
||
enter: '全画面表示に入る',
|
||
},
|
||
useTable: {
|
||
operation: '操作',
|
||
total: (total: number) => formatString('合計 {} 件', total),
|
||
},
|
||
}),
|
||
ruRU: createTranslation({
|
||
useModal: {
|
||
cannotClose: 'Невозможно закрыть диалог в текущем состоянии',
|
||
cancel: 'Отмена',
|
||
confirm: 'Подтвердить',
|
||
},
|
||
useBatch: {
|
||
batchOperation: 'Пакетная операция',
|
||
selectedItems: (count: number) => formatString('Выбрано {} элементов', count),
|
||
startBatch: 'Начать пакетную операцию',
|
||
placeholder: 'Выберите операцию',
|
||
},
|
||
useForm: {
|
||
submit: 'Отправить',
|
||
reset: 'Сбросить',
|
||
expand: 'Развернуть',
|
||
collapse: 'Свернуть',
|
||
moreConfig: 'Дополнительная конфигурация',
|
||
help: 'Документация',
|
||
required: 'Обязательно',
|
||
placeholder: (label: string) => formatString('Пожалуйста, введите {}', label),
|
||
},
|
||
useFullScreen: {
|
||
exit: 'Выйти из полноэкранного режима',
|
||
enter: 'Войти в полноэкранный режим',
|
||
},
|
||
useTable: {
|
||
operation: 'Операция',
|
||
total: (total: number) => formatString('Всего {} элементов', total),
|
||
},
|
||
}),
|
||
koKR: createTranslation({
|
||
useModal: {
|
||
cannotClose: '현재 상태에서는 대화 상자를 닫을 수 없습니다',
|
||
cancel: '취소',
|
||
confirm: '확인',
|
||
},
|
||
useBatch: {
|
||
batchOperation: '일괄 작업',
|
||
selectedItems: (count: number) => formatString('{}개 항목 선택됨', count),
|
||
startBatch: '일괄 작업 시작',
|
||
placeholder: '작업 선택',
|
||
},
|
||
useForm: {
|
||
submit: '제출',
|
||
reset: '재설정',
|
||
expand: '확장',
|
||
collapse: '축소',
|
||
moreConfig: '추가 구성',
|
||
help: '도움말',
|
||
required: '필수 항목',
|
||
placeholder: (label: string) => formatString('{} 입력하세요', label),
|
||
},
|
||
useFullScreen: {
|
||
exit: '전체 화면 종료',
|
||
enter: '전체 화면 시작',
|
||
},
|
||
useTable: {
|
||
operation: '작업',
|
||
total: (total: number) => formatString('총 {} 페이지', total),
|
||
},
|
||
}),
|
||
ptBR: createTranslation({
|
||
useModal: {
|
||
cannotClose: 'Não é possível fechar o diálogo no estado atual',
|
||
cancel: 'Cancelar',
|
||
confirm: 'Confirmar',
|
||
},
|
||
useBatch: {
|
||
batchOperation: 'Operação em Lote',
|
||
selectedItems: (count: number) => formatString('{} itens selecionados', count),
|
||
startBatch: 'Iniciar Operação em Lote',
|
||
placeholder: 'Selecione a operação',
|
||
},
|
||
useForm: {
|
||
submit: 'Enviar',
|
||
reset: 'Redefinir',
|
||
expand: 'Expandir',
|
||
collapse: 'Recolher',
|
||
moreConfig: 'Mais Configurações',
|
||
help: 'Documentação de Ajuda',
|
||
required: 'Obrigatório',
|
||
placeholder: (label: string) => formatString('Por favor, insira {}', label),
|
||
},
|
||
useFullScreen: {
|
||
exit: 'Sair da Tela Cheia',
|
||
enter: 'Entrar em Tela Cheia',
|
||
},
|
||
useTable: {
|
||
operation: 'Operação',
|
||
total: (total: number) => formatString('Total {} páginas', total),
|
||
},
|
||
}),
|
||
frFR: createTranslation({
|
||
useModal: {
|
||
cannotClose: "Impossible de fermer la boîte de dialogue dans l'état actuel",
|
||
cancel: 'Annuler',
|
||
confirm: 'Confirmer',
|
||
},
|
||
useBatch: {
|
||
batchOperation: 'Opération par lot',
|
||
selectedItems: (count: number) => formatString('{} éléments sélectionnés', count),
|
||
startBatch: 'Démarrer une opération par lot',
|
||
placeholder: 'Sélectionnez une opération',
|
||
},
|
||
useForm: {
|
||
submit: 'Soumettre',
|
||
reset: 'Réinitialiser',
|
||
expand: 'Développer',
|
||
collapse: 'Réduire',
|
||
moreConfig: 'Plus de configuration',
|
||
help: "Documentation d'aide",
|
||
required: 'Obligatoire',
|
||
placeholder: (label: string) => formatString('Veuillez entrer {}', label),
|
||
},
|
||
useFullScreen: {
|
||
exit: 'Quitter le mode plein écran',
|
||
enter: 'Passer en mode plein écran',
|
||
},
|
||
useTable: {
|
||
operation: 'Opération',
|
||
total: (total: number) => formatString('Total {} pages', total),
|
||
},
|
||
}),
|
||
esAR: createTranslation({
|
||
useModal: {
|
||
cannotClose: 'No se puede cerrar el diálogo en el estado actual',
|
||
cancel: 'Cancelar',
|
||
confirm: 'Confirmar',
|
||
},
|
||
useBatch: {
|
||
batchOperation: 'Operación por lotes',
|
||
selectedItems: (count: number) => formatString('{} elementos seleccionados', count),
|
||
startBatch: 'Iniciar operación por lotes',
|
||
placeholder: 'Seleccionar operación',
|
||
},
|
||
useForm: {
|
||
submit: 'Enviar',
|
||
reset: 'Restablecer',
|
||
expand: 'Expandir',
|
||
collapse: 'Colapsar',
|
||
moreConfig: 'Más configuración',
|
||
help: 'Documentación de ayuda',
|
||
required: 'Obligatorio',
|
||
placeholder: (label: string) => formatString('Por favor ingrese {}', label),
|
||
},
|
||
useFullScreen: {
|
||
exit: 'Salir de pantalla completa',
|
||
enter: 'Entrar en pantalla completa',
|
||
},
|
||
useTable: {
|
||
operation: 'Operación',
|
||
total: (total: number) => formatString('Total {} páginas', total),
|
||
},
|
||
}),
|
||
arDZ: createTranslation({
|
||
useModal: {
|
||
cannotClose: 'لا يمكن إغلاق مربع الحوار في الحالة الحالية',
|
||
cancel: 'إلغاء',
|
||
confirm: 'تأكيد',
|
||
},
|
||
useBatch: {
|
||
batchOperation: 'عملية دفعية',
|
||
selectedItems: (count: number) => formatString('تم تحديد {} عنصر', count),
|
||
startBatch: 'بدء عملية دفعية',
|
||
placeholder: 'اختر العملية',
|
||
},
|
||
useForm: {
|
||
submit: 'إرسال',
|
||
reset: 'إعادة تعيين',
|
||
expand: 'توسيع',
|
||
collapse: 'طي',
|
||
moreConfig: 'مزيد من الإعدادات',
|
||
help: 'وثائق المساعدة',
|
||
required: 'إلزامي',
|
||
placeholder: (label: string) => formatString('الرجاء إدخال {}', label),
|
||
},
|
||
useFullScreen: {
|
||
exit: 'الخروج من وضع ملء الشاشة',
|
||
enter: 'الدخول إلى وضع ملء الشاشة',
|
||
},
|
||
useTable: {
|
||
operation: 'العملية',
|
||
total: (total: number) => formatString('إجمالي {} صفحات', total),
|
||
},
|
||
}),
|
||
}
|
||
|
||
// 类型导出
|
||
export type TranslationType = typeof translation
|
||
export type TranslationLocale = keyof TranslationType
|
||
export type TranslationModule = TranslationType[TranslationLocale]
|
||
export type TranslationModuleValue = keyof TranslationType[TranslationLocale][TranslationModule]
|