From 7c0a686cd96bc1486fff6e154b7eb5bc7d8f49d0 Mon Sep 17 00:00:00 2001 From: EYHN Date: Thu, 20 Jun 2024 02:19:41 +0000 Subject: [PATCH] refactor(i18n): new hook api (#7273) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # NEW HOOK API `useI18n`: same as `useAFFiNEI18N`, with additional APIs ```ts import { useI18n } from '@affine/i18n' const i18n = useI18n() i18n['hello world']() -> 你好世界 ``` # NEW GLOBAL i18n Instance `I18n`: use i18n capabilities outside of React ```ts import { I18n } from '@affine/i18n' I18n['hello world']() -> 你好世界 ``` # NEW TYPES `I18nKeys` -> all i18n keys `I18nString` -> An i18n message (key&options) transfer and store i18n text outside of React ```ts const msg: I18nString = { key: 'helloworld', options: { arg1: '123' } } I18n.t(msg) -> 你好世界123 ``` before: ```ts registerCommand('open-page', { name: t('command.open-page') // ^- translation happens here, }) ``` after: ```ts registerCommand('open-page', { name: { key: 'command.open-page' } // ^- store I18nString here, translate when the command render to UI }) ``` --- .../affine-banner/local-demo-tips.tsx | 4 +- .../affine-other-page-layout/layout.tsx | 4 +- .../use-nav-config.ts | 4 +- .../auth-components/back-button.tsx | 4 +- .../auth-components/change-email-page.tsx | 4 +- .../auth-components/change-password-page.tsx | 4 +- .../auth-components/confirm-change-email.tsx | 4 +- .../auth-components/email-verified-email.tsx | 4 +- .../auth-components/password-input/index.tsx | 4 +- .../auth-components/set-password-page.tsx | 4 +- .../auth-components/set-password.tsx | 4 +- .../auth-components/sign-in-success-page.tsx | 4 +- .../auth-components/sign-up-page.tsx | 4 +- .../components/disable-public-link/index.tsx | 4 +- .../member-components/accept-invite-page.tsx | 4 +- .../member-components/invite-modal.tsx | 4 +- .../member-components/member-limit-modal.tsx | 4 +- .../not-found-page/not-found-page.tsx | 6 +- .../components/notification-center/index.tsx | 4 +- .../core/src/commands/affine-creation.tsx | 4 +- .../core/src/commands/affine-help.tsx | 4 +- .../core/src/commands/affine-layout.tsx | 4 +- .../core/src/commands/affine-navigation.tsx | 4 +- .../core/src/commands/affine-settings.tsx | 4 +- .../core/src/commands/affine-updates.tsx | 4 +- .../error-basic/error-detail.tsx | 5 +- .../error-fallbacks/any-error-fallback.tsx | 4 +- .../error-fallbacks/no-page-root-fallback.tsx | 4 +- .../page-not-found-fallback.tsx | 4 +- .../recoverable-error-fallback.tsx | 4 +- .../affine/ai-onboarding/edgeless.dialog.tsx | 4 +- .../affine/ai-onboarding/general.dialog.tsx | 7 +- .../affine/ai-onboarding/local.dialog.tsx | 6 +- .../affine/auth/after-sign-in-send-email.tsx | 5 +- .../affine/auth/after-sign-up-send-email.tsx | 5 +- .../affine/auth/ai-login-required.tsx | 4 +- .../src/components/affine/auth/send-email.tsx | 10 +-- .../affine/auth/sign-in-with-password.tsx | 4 +- .../src/components/affine/auth/sign-in.tsx | 5 +- .../affine/auth/user-plan-button.tsx | 4 +- .../affine/create-workspace-modal/index.tsx | 6 +- .../affine/history-tips-modal/index.tsx | 4 +- .../affine/issue-feedback-modal/index.tsx | 4 +- .../page-history-modal/history-modal.tsx | 11 ++- .../confirm-delete-property-modal.tsx | 5 +- .../affine/page-properties/icons-selector.tsx | 4 +- .../affine/page-properties/menu-items.tsx | 6 +- .../property-row-value-renderer.tsx | 11 ++- .../affine/page-properties/table.tsx | 19 +++-- .../page-properties/tags-inline-editor.tsx | 6 +- .../affine/payment-disable/index.tsx | 4 +- .../quota-reached-modal/cloud-quota-modal.tsx | 4 +- .../quota-reached-modal/local-quota-modal.tsx | 4 +- .../affine/reference-link/index.tsx | 6 +- .../account-setting/ai-usage-panel.tsx | 4 +- .../setting-modal/account-setting/index.tsx | 10 +-- .../account-setting/storage-progress.tsx | 4 +- .../general-setting/about/index.tsx | 4 +- .../about/update-check-section.tsx | 6 +- .../general-setting/appearance/index.tsx | 8 +- .../general-setting/billing/index.tsx | 23 +++--- .../experimental-features/index.tsx | 6 +- .../setting-modal/general-setting/index.tsx | 4 +- .../plans/ai/actions/cancel.tsx | 4 +- .../plans/ai/actions/login.tsx | 4 +- .../plans/ai/actions/resume.tsx | 4 +- .../plans/ai/actions/subscribe.tsx | 4 +- .../general-setting/plans/ai/ai-plan.tsx | 5 +- .../general-setting/plans/ai/benefits.tsx | 6 +- .../general-setting/plans/cloud-plans.tsx | 4 +- .../general-setting/plans/index.tsx | 9 +-- .../general-setting/plans/layout.tsx | 6 +- .../general-setting/plans/modals.tsx | 6 +- .../general-setting/plans/plan-card.tsx | 17 ++-- .../general-setting/shortcuts/index.tsx | 4 +- .../setting-modal/setting-sidebar/index.tsx | 10 +-- .../delete-leave-workspace/delete/index.tsx | 5 +- .../delete-leave-workspace/index.tsx | 4 +- .../enable-cloud.tsx | 4 +- .../new-workspace-setting-detail/export.tsx | 4 +- .../new-workspace-setting-detail/index.tsx | 4 +- .../new-workspace-setting-detail/members.tsx | 12 +-- .../new-workspace-setting-detail/profile.tsx | 4 +- .../workspace-setting/properties/index.tsx | 13 ++- .../share-menu/share-export.tsx | 4 +- .../share-menu/share-menu.tsx | 8 +- .../share-menu/share-page.tsx | 6 +- .../affine/sign-out-modal/index.tsx | 4 +- .../affine/star-affine-modal/index.tsx | 4 +- .../affine/subscription-landing/index.tsx | 9 +-- .../tmp-disable-affine-cloud-modal/index.tsx | 5 +- .../app-sidebar/add-page-button/index.tsx | 4 +- .../app-sidebar/app-updater-button/index.tsx | 12 +-- .../app-sidebar/quick-search-input/index.tsx | 4 +- .../sidebar-header/sidebar-switch.tsx | 4 +- .../block-suite-editor/journal-doc-title.tsx | 4 +- .../block-suite-header/favorite/index.tsx | 4 +- .../journal/today-button.tsx | 4 +- .../block-suite-header/menu/index.tsx | 4 +- .../block-suite-mode-switch/index.tsx | 6 +- .../authenticated-item.tsx | 4 +- .../cloud/share-header-right-item/present.tsx | 4 +- .../share-header-right-item/user-avatar.tsx | 4 +- .../collections/collection-list-header.tsx | 4 +- .../collections/collection-list-item.tsx | 4 +- .../page-list/components/favorite-tag.tsx | 4 +- .../page-list/components/new-page-button.tsx | 4 +- .../components/page-display-menu.tsx | 4 +- .../page-list/docs/page-list-header.tsx | 10 +-- .../page-list/docs/virtualized-page-list.tsx | 5 +- .../page-list/filter/date-select.tsx | 4 +- .../page-list/filter/filter-list.tsx | 4 +- .../filter/filter-tag-translation.tsx | 4 +- .../page-list/filter/multi-select.tsx | 4 +- .../src/components/page-list/filter/vars.tsx | 4 +- .../page-list/group-definitions.tsx | 8 +- .../components/page-list/operation-cell.tsx | 10 +-- .../disable-public-sharing.tsx | 4 +- .../page-list/operation-menu-items/export.tsx | 6 +- .../operation-menu-items/move-to-trash.tsx | 6 +- .../src/components/page-list/page-group.tsx | 8 +- .../src/components/page-list/page-header.tsx | 4 +- .../components/page-list/tags/create-tag.tsx | 4 +- .../page-list/tags/tag-list-header.tsx | 4 +- .../page-list/tags/tag-list-item.tsx | 4 +- .../page-list/view/collection-list.tsx | 6 +- .../page-list/view/collection-operations.tsx | 4 +- .../page-list/view/create-collection.tsx | 6 +- .../view/edit-collection/edit-collection.tsx | 6 +- .../view/edit-collection/pages-mode.tsx | 4 +- .../view/edit-collection/rules-mode.tsx | 7 +- .../view/edit-collection/select-page.tsx | 7 +- .../view/save-as-collection-button.tsx | 4 +- .../components/page-list/view/use-action.tsx | 4 +- .../page-list/virtualized-trash-list.tsx | 5 +- .../src/components/pure/file-upload/index.tsx | 4 +- .../src/components/pure/help-island/index.tsx | 4 +- .../pure/trash-page-footer/index.tsx | 4 +- .../pure/workspace-mode-filter-tab/index.tsx | 4 +- .../collections/collections-list.tsx | 6 +- .../workspace-slider-bar/collections/doc.tsx | 4 +- .../components/operation-item.tsx | 4 +- .../components/operation-menu-button.tsx | 4 +- .../components/postfix-item.tsx | 4 +- .../components/reference-page.tsx | 4 +- .../favorite/empty-item.tsx | 4 +- .../favorite/favorite-list.tsx | 4 +- .../favorite/favourite-nav-item.tsx | 4 +- .../add-workspace/index.tsx | 4 +- .../user-with-workspace-list/index.tsx | 4 +- .../workspace-list/index.tsx | 6 +- .../workspace-card/index.tsx | 4 +- .../root-app-sidebar/import-page.tsx | 4 +- .../src/components/root-app-sidebar/index.tsx | 4 +- .../root-app-sidebar/journal-button.tsx | 4 +- .../components/root-app-sidebar/user-info.tsx | 4 +- .../frontend/core/src/components/top-tip.tsx | 5 +- .../components/workspace-upgrade/upgrade.tsx | 4 +- .../hooks/affine/use-all-page-list-config.tsx | 4 +- .../src/hooks/affine/use-enable-cloud.tsx | 4 +- .../core/src/hooks/affine/use-export-page.ts | 4 +- .../src/hooks/affine/use-global-dnd-helper.ts | 4 +- .../src/hooks/affine/use-is-shared-page.tsx | 14 +--- .../src/hooks/affine/use-language-helper.ts | 4 +- ...se-register-blocksuite-editor-commands.tsx | 4 +- .../core/src/hooks/affine/use-share-url.ts | 4 +- .../core/src/hooks/affine/use-shortcuts.ts | 18 ++--- .../hooks/affine/use-trash-modal-helper.ts | 4 +- .../hooks/use-register-workspace-commands.ts | 4 +- .../src/modules/cmdk/views/data-hooks.tsx | 13 ++- .../core/src/modules/cmdk/views/main.tsx | 22 ++--- .../core/src/modules/cmdk/views/not-found.tsx | 4 +- .../multi-tabs/tabs/journal.tsx | 10 +-- .../navigation/view/navigation-buttons.tsx | 4 +- .../peek-view/view/doc-peek-controls.tsx | 4 +- .../src/modules/tag/view/delete-tag-modal.tsx | 5 +- .../workbench/view/split-view/panel.tsx | 4 +- packages/frontend/core/src/pages/auth.tsx | 4 +- packages/frontend/core/src/pages/expired.tsx | 4 +- packages/frontend/core/src/pages/open-app.tsx | 5 +- .../src/pages/share/share-detail-page.tsx | 4 +- .../core/src/pages/share/share-footer.tsx | 4 +- .../pages/workspace/all-collection/index.tsx | 4 +- .../src/pages/workspace/collection/index.tsx | 5 +- .../src/pages/workspace/page-list-empty.tsx | 9 +-- .../core/src/pages/workspace/trash-page.tsx | 4 +- packages/frontend/i18n/README.md | 8 +- packages/frontend/i18n/package.json | 4 +- packages/frontend/i18n/src/i18n.ts | 80 +++++++++++++------ packages/frontend/i18n/src/index.ts | 17 +--- .../i18n/src/utils/__tests__/time.spec.ts | 6 +- tsconfig.json | 1 - yarn.lock | 1 + 193 files changed, 553 insertions(+), 575 deletions(-) diff --git a/packages/frontend/component/src/components/affine-banner/local-demo-tips.tsx b/packages/frontend/component/src/components/affine-banner/local-demo-tips.tsx index 56a82848c4..b42be3727c 100644 --- a/packages/frontend/component/src/components/affine-banner/local-demo-tips.tsx +++ b/packages/frontend/component/src/components/affine-banner/local-demo-tips.tsx @@ -1,5 +1,5 @@ import { Button, IconButton } from '@affine/component/ui/button'; -import { useAFFiNEI18N } from '@affine/i18n/hooks'; +import { useI18n } from '@affine/i18n'; import { CloseIcon } from '@blocksuite/icons/rc'; import { useCallback } from 'react'; @@ -18,7 +18,7 @@ export const LocalDemoTips = ({ onLogin, onEnableCloud, }: LocalDemoTipsProps) => { - const t = useAFFiNEI18N(); + const t = useI18n(); const buttonLabel = isLoggedIn ? t['Enable AFFiNE Cloud']() : t['Sign in and Enable'](); diff --git a/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx b/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx index b42b099fa3..197a00c508 100644 --- a/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx +++ b/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx @@ -1,5 +1,5 @@ import { Button } from '@affine/component/ui/button'; -import { useAFFiNEI18N } from '@affine/i18n/hooks'; +import { useI18n } from '@affine/i18n'; import { Logo1Icon } from '@blocksuite/icons/rc'; import { useCallback } from 'react'; @@ -12,7 +12,7 @@ export const AffineOtherPageLayout = ({ }: { children: React.ReactNode; }) => { - const t = useAFFiNEI18N(); + const t = useI18n(); const openDownloadLink = useCallback(() => { open(runtimeConfig.downloadUrl, '_blank'); diff --git a/packages/frontend/component/src/components/affine-other-page-layout/use-nav-config.ts b/packages/frontend/component/src/components/affine-other-page-layout/use-nav-config.ts index 379da19bf7..bafc81c3f0 100644 --- a/packages/frontend/component/src/components/affine-other-page-layout/use-nav-config.ts +++ b/packages/frontend/component/src/components/affine-other-page-layout/use-nav-config.ts @@ -1,8 +1,8 @@ -import { useAFFiNEI18N } from '@affine/i18n/hooks'; +import { useI18n } from '@affine/i18n'; import { useMemo } from 'react'; export const useNavConfig = () => { - const t = useAFFiNEI18N(); + const t = useI18n(); return useMemo( () => [ { diff --git a/packages/frontend/component/src/components/auth-components/back-button.tsx b/packages/frontend/component/src/components/auth-components/back-button.tsx index 668e611c7c..eade042a77 100644 --- a/packages/frontend/component/src/components/auth-components/back-button.tsx +++ b/packages/frontend/component/src/components/auth-components/back-button.tsx @@ -1,4 +1,4 @@ -import { useAFFiNEI18N } from '@affine/i18n/hooks'; +import { useI18n } from '@affine/i18n'; import { ArrowLeftSmallIcon } from '@blocksuite/icons/rc'; import type { FC } from 'react'; @@ -6,7 +6,7 @@ import type { ButtonProps } from '../../ui/button'; import { Button } from '../../ui/button'; export const BackButton: FC = props => { - const t = useAFFiNEI18N(); + const t = useI18n(); return (