diff --git a/libs/components/layout/src/i18n/index.ts b/libs/components/layout/src/i18n/index.ts index 866edee933..20f4e2a3ce 100644 --- a/libs/components/layout/src/i18n/index.ts +++ b/libs/components/layout/src/i18n/index.ts @@ -3,6 +3,20 @@ import { initReactI18next } from 'react-i18next'; import en_US from './resources/en.json'; import zh_CN from './resources/zh.json'; +// See https://react.i18next.com/latest/typescript +declare module 'react-i18next' { + // and extend them! + interface CustomTypeOptions { + // custom namespace type if you changed it + defaultNS: 'ns1'; + // custom resources type + resources: { + en: typeof en_US.translation; + zh: typeof zh_CN.translation; + }; + } +} + const resources = { en: en_US, zh: zh_CN, diff --git a/libs/components/layout/src/i18n/resources/en.json b/libs/components/layout/src/i18n/resources/en.json index 0a3efcdc9a..4c6a714e9b 100644 --- a/libs/components/layout/src/i18n/resources/en.json +++ b/libs/components/layout/src/i18n/resources/en.json @@ -10,12 +10,17 @@ "Layout": "Layout", "Comment": "Comment", "Settings": "Settings", - + "ComingSoon": "Layout Settings Coming Soon...", "Duplicate Page": "Duplicate Page", "Copy Page Link": "Copy Page Link", "Language": "Language", "Clear Workspace": "Clear Workspace", - "Last edited by": "Last edited by ", + "Export As Markdown": "Export As Markdown", + "Export As HTML": "Export As HTML", + "Export As PDF (Unsupported)": "Export As PDF (Unsupported)", + "Import Workspace": "Import Workspace", + "Export Workspace": "Export Workspace", + "Last edited by": "Last edited by {{name}}", "Logout": "Logout" } } diff --git a/libs/components/layout/src/i18n/resources/zh.json b/libs/components/layout/src/i18n/resources/zh.json index d8fcedc53f..da86cef6b2 100644 --- a/libs/components/layout/src/i18n/resources/zh.json +++ b/libs/components/layout/src/i18n/resources/zh.json @@ -7,7 +7,7 @@ "IsNotLocalWorkspace": "欢迎来到AFFiNE 的演示界面,您可以同步到磁盘来进行保存操作。", "DoNotStore": "AFFINE 正在积极开发中,当前版本不稳定。请不要存储信息或数据。" }, - + "ComingSoon": "布局设置即将到来", "Layout": "布局", "Comment": "评论", "Settings": "设置", @@ -15,7 +15,12 @@ "Copy Page Link": "复制页面链接", "Language": "当前语言", "Clear Workspace": "清空工作区域", - "Last edited by": "最后编辑者为 ", + "Export As Markdown": "导出 markdown", + "Export As HTML": "导出 HTML", + "Export As PDF (Unsupported)": "导出 PDF (暂不支持)", + "Import Workspace": "导入 Workspace", + "Export Workspace": "导出 Workspace", + "Last edited by": "最后编辑者为 {{name}}", "Logout": "退出登录" } } diff --git a/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx b/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx index a479e7f372..4503482d05 100644 --- a/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx +++ b/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx @@ -23,7 +23,7 @@ export const ContainerTabs = () => { return [ { type: 'layout', - text: 'Layout', + text: t('Layout'), icon: ( @@ -33,7 +33,7 @@ export const ContainerTabs = () => { }, { type: 'comment', - text: 'Comment', + text: t('Comment'), icon: ( @@ -50,7 +50,7 @@ export const ContainerTabs = () => { }, { type: 'settings', - text: 'Settings', + text: t('Settings'), icon: ( @@ -59,7 +59,7 @@ export const ContainerTabs = () => { panel: , }, ]; - }, [activeCommentId, resolveComment]); + }, [activeCommentId, resolveComment, t]); const settingsTabsData = useMemo(() => { return getSettingsTabsData(); @@ -76,7 +76,7 @@ export const ContainerTabs = () => { const { type, text, icon } = tab; return ( { diff --git a/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx b/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx index 90ecf60cc6..d1b633b754 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx @@ -28,7 +28,7 @@ export const SettingsList = () => { if (type === 'switch') { return ( { item.onChange(!item.value); }} @@ -44,9 +44,9 @@ export const SettingsList = () => { } return ( - item.onClick()}> + item.onClick()}> {item.name} - {item.name === 'Language' ? ( + {item.key === 'Language' ? (
- ) : item.name === '当前语言' ? ( -
- -
) : null}
); diff --git a/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx b/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx index 853912780b..0c0b5c2efd 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx @@ -15,8 +15,7 @@ export const LastModified = () => {
- {t('Last edited by')} - {username} + {t('Last edited by', { name: username })}
diff --git a/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts b/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts index 8b08312e94..dfd8918c49 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts +++ b/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts @@ -17,6 +17,7 @@ import { interface BaseSettingItem { flag?: keyof SettingFlags; + key: string; } interface SwitchItem extends BaseSettingItem { @@ -83,6 +84,7 @@ export const useSettings = (): SettingItem[] => { { type: 'button', name: t('Duplicate Page'), + key: 'Duplicate Page', onClick: async () => { const newPageInfo = await duplicatePage({ workspaceId, @@ -94,6 +96,7 @@ export const useSettings = (): SettingItem[] => { { type: 'button', name: t('Copy Page Link'), + key: 'Copy Page Link', onClick: () => { copyToClipboard(window.location.href); message.success('Page link copied successfully'); @@ -102,16 +105,19 @@ export const useSettings = (): SettingItem[] => { { type: 'button', name: t('Language'), + key: 'Language', onClick: () => { - //Do noting + // Do noting }, }, { type: 'separator', + key: 'separator1', }, { type: 'button', - name: 'Export As Markdown', + name: t('Export As Markdown'), + key: 'Export As Markdown', onClick: async () => { const title = await getPageTitle({ workspaceId, pageId }); exportMarkdown({ workspaceId, rootBlockId: pageId, title }); @@ -120,7 +126,8 @@ export const useSettings = (): SettingItem[] => { }, { type: 'button', - name: 'Export As HTML', + name: t('Export As HTML'), + key: 'Export As HTML', onClick: async () => { const title = await getPageTitle({ workspaceId, pageId }); exportHtml({ workspaceId, rootBlockId: pageId, title }); @@ -129,28 +136,33 @@ export const useSettings = (): SettingItem[] => { }, { type: 'button', - name: 'Export As PDF (Unsupported)', + name: t('Export As PDF (Unsupported)'), + key: 'Export As PDF (Unsupported)', onClick: () => console.log('Export As PDF'), flag: 'booleanExportPdf', }, { type: 'separator', + key: 'separator2', }, { type: 'button', - name: 'Import Workspace', + name: t('Import Workspace'), + key: 'Import Workspace', onClick: () => importWorkspace(workspaceId), flag: 'booleanImportWorkspace', }, { type: 'button', - name: 'Export Workspace', + name: t('Export Workspace'), + key: 'Export Workspace', onClick: () => exportWorkspace(), flag: 'booleanExportWorkspace', }, { type: 'button', name: t('Clear Workspace'), + key: 'Clear Workspace', onClick: () => clearWorkspace(workspaceId), flag: 'booleanClearWorkspace', },