chore(i18n): cleanup i18n file (#8318)

This commit is contained in:
EYHN 2024-09-20 06:25:17 +00:00
parent bed70cd51a
commit 096f50b83b
No known key found for this signature in database
GPG Key ID: 46C9E26A75AB276C
12 changed files with 110 additions and 444 deletions

View File

@ -2,6 +2,10 @@ name: Sync I18n with Crowdin
on: on:
push: push:
branches:
- canary
paths:
- 'packages/frontend/i18n/**'
workflow_dispatch: workflow_dispatch:
jobs: jobs:
@ -16,7 +20,7 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: crowdin action - name: Crowdin action
uses: crowdin/github-action@v2 uses: crowdin/github-action@v2
with: with:
upload_sources: true upload_sources: true

View File

@ -44,7 +44,6 @@
"peerDependencies": { "peerDependencies": {
"@affine/templates": "*", "@affine/templates": "*",
"@blocksuite/presets": "*", "@blocksuite/presets": "*",
"async-call-rpc": "*",
"electron": "*", "electron": "*",
"react": "*", "react": "*",
"yjs": "^13" "yjs": "^13"
@ -56,9 +55,6 @@
"@blocksuite/presets": { "@blocksuite/presets": {
"optional": true "optional": true
}, },
"async-call-rpc": {
"optional": true
},
"electron": { "electron": {
"optional": true "optional": true
}, },

View File

@ -1,4 +1,5 @@
import { Menu, MenuItem, MenuTrigger } from '@affine/component/ui/menu'; import { Menu, MenuItem, MenuTrigger } from '@affine/component/ui/menu';
import { calcLocaleCompleteness } from '@affine/i18n';
import { DoneIcon } from '@blocksuite/icons/rc'; import { DoneIcon } from '@blocksuite/icons/rc';
import type { ReactElement } from 'react'; import type { ReactElement } from 'react';
import { memo } from 'react'; import { memo } from 'react';
@ -10,17 +11,19 @@ import * as styles from './style.css';
const LanguageMenuContent = memo(function LanguageMenuContent() { const LanguageMenuContent = memo(function LanguageMenuContent() {
const { currentLanguage, languagesList, onLanguageChange } = const { currentLanguage, languagesList, onLanguageChange } =
useLanguageHelper(); useLanguageHelper();
return ( return (
<> <>
{languagesList.map(option => { {languagesList.map(option => {
const selected = currentLanguage?.originalName === option.originalName; const selected = currentLanguage?.originalName === option.originalName;
const completeness = calcLocaleCompleteness(option.tag);
return ( return (
<MenuItem <MenuItem
key={option.name} key={option.name}
title={option.name} title={option.name}
lang={option.tag} lang={option.tag}
onSelect={() => onLanguageChange(option.tag)} onSelect={() => onLanguageChange(option.tag)}
suffix={(option.Completeness * 100).toFixed(0) + '%'} suffix={(completeness * 100).toFixed(0) + '%'}
data-selected={selected} data-selected={selected}
className={styles.menuItem} className={styles.menuItem}
> >

View File

@ -14,7 +14,6 @@ export function useLanguageHelper() {
tag: item.tag, tag: item.tag,
originalName: item.originalName, originalName: item.originalName,
name: item.name, name: item.name,
Completeness: item.completeRate,
})), })),
[] []
); );

View File

@ -0,0 +1,74 @@
// this script is used to clean up the unused keys in the i18n file
// just run `node packages/frontend/i18n/cleanup.mjs`
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { glob } from 'glob';
const REPO_ROOT = path.resolve(
fileURLToPath(import.meta.url),
'..',
'..',
'..',
'..'
);
const files = await glob('packages/frontend/**/src/**/*.{js,tsx,ts}', {
ignore: [
'**/node_modules/**',
'**/packages/frontend/i18n/src/resources/*',
'**/dist/**',
'**/lib/**',
],
cwd: REPO_ROOT,
absolute: true,
});
const filesWithContent = files.map(file => {
return {
path: file,
content: fs.readFileSync(file, 'utf8'),
};
});
const enjson = JSON.parse(
fs.readFileSync(
path.join(REPO_ROOT, 'packages/frontend/i18n/src/resources/en.json'),
'utf8'
)
);
const keys = Object.keys(enjson).filter(
// exceptions
key => !key.startsWith('com.affine.payment.modal.')
);
const unusedKeys = keys.filter(key => {
const regex1 = new RegExp(`[\`'"]${key.replace('.', '\\.')}[\`'"]`, 'g');
// some place use i18n key like `t[`com.affine.modal.${var}`]`
// com.affine.modal.confirm -> com.affine.modal.
const keyWithoutLastDot = key.replace(/(?<=\.)[^.]+$/, '');
const regex2 = new RegExp(
`[\`'"]${keyWithoutLastDot.replace('.', '\\.')}`,
'g'
);
for (const file of filesWithContent) {
const match = file.content.match(regex1) || file.content.match(regex2);
if (match) {
return false;
}
}
return true;
});
for (const key of unusedKeys) {
delete enjson[key];
}
// write back to file
fs.writeFileSync(
path.join(REPO_ROOT, 'packages/frontend/i18n/src/resources/en.json'),
JSON.stringify(enjson, null, 2)
);

View File

@ -24,10 +24,7 @@
"undici": "^6.12.0" "undici": "^6.12.0"
}, },
"devDependencies": { "devDependencies": {
"@types/prettier": "^3.0.0", "glob": "^11.0.0",
"prettier": "^3.2.5",
"ts-node": "^10.9.2",
"typescript": "^5.4.5",
"vitest": "2.1.1" "vitest": "2.1.1"
}, },
"version": "0.16.0" "version": "0.16.0"

View File

@ -98,3 +98,25 @@ export function setUpLanguage(i: i18n) {
} }
return i.changeLanguage(language); return i.changeLanguage(language);
} }
const cachedCompleteness: Record<string, number> = {};
export const calcLocaleCompleteness = (
locale: (typeof LOCALES)[number]['tag']
) => {
if (cachedCompleteness[locale]) {
return cachedCompleteness[locale];
}
const base = LOCALES.find(item => item.base);
if (!base) {
throw new Error('Base language not found');
}
const target = LOCALES.find(item => item.tag === locale);
if (!target) {
throw new Error('Locale not found');
}
const baseKeyCount = Object.keys(base.res).length;
const translatedKeyCount = Object.keys(target.res).length;
const completeness = translatedKeyCount / baseKeyCount;
cachedCompleteness[target.tag] = completeness;
return completeness;
};

View File

@ -1,16 +0,0 @@
{
"Add to Favorites": "Add to favorites",
"Added to Favorites": "Added to favorites",
"Customize": "Customize",
"Enable AFFiNE Cloud Description": "If enabled, the data in this workspace will be backed up and synchronized via AFFiNE Cloud.",
"Favorite": "Favorite",
"Favorited": "Favorited",
"Favorites": "Favorites",
"Organize pages to build knowledge": "Organize docs to build knowledge",
"Remove from favorites": "Remove from favorites",
"Removed from Favorites": "Removed from favorites",
"com.affine.filter.is-favourited": "Favorited",
"com.affine.settings.suggestion": "Need more customization options? You can suggest them to us in the community.",
"com.affine.settings.workspace.description": "You can customize your workspace here.",
"emptyFavorite": "Click Add to Favorites and the page will appear here."
}

View File

@ -1,125 +1,41 @@
{ {
"404 - Page Not Found": "404 - Page not found",
"404.back": "Back to my Content", "404.back": "Back to my Content",
"404.hint": "Sorry, you do not have access or this content does not exist...", "404.hint": "Sorry, you do not have access or this content does not exist...",
"404.signOut": "Sign in to another account", "404.signOut": "Sign in to another account",
"AFFiNE Cloud": "AFFiNE Cloud", "AFFiNE Cloud": "AFFiNE Cloud",
"AFFiNE Community": "AFFiNE Community",
"About AFFiNE": "About AFFiNE",
"Access level": "Access level",
"Actions": "Actions",
"Add Filter": "Add filter",
"Add Workspace": "Add workspace",
"Add Workspace Hint": "Select the existed database file",
"Add a subpage inside": "Add a sub doc inside",
"Add to Favorites": "Add to favourites",
"Add to favorites": "Add to favourites",
"Added Successfully": "Added successfully",
"Added to Favorites": "Added to favourites",
"All changes are saved locally": "All changes are saved locally",
"All data has been stored in the cloud": "All data has been stored in the cloud. ",
"All pages": "All docs", "All pages": "All docs",
"App Version": "App version", "App Version": "App version",
"Appearance Settings": "Appearance settings",
"Append to Daily Note": "Append to daily note",
"Available Offline": "Available offline", "Available Offline": "Available offline",
"Back Home": "Back home",
"Back to Quick Search": "Back to quick search",
"Back to all": "Back to all",
"Body text": "Body text",
"Bold": "Bold", "Bold": "Bold",
"Cancel": "Cancel", "Cancel": "Cancel",
"Change avatar hint": "New avatar will be shown for everyone.",
"Change workspace name hint": "New name will be shown for everyone.",
"Changelog description": "View the AFFiNE Changelog.",
"Check Keyboard Shortcuts quickly": "Check keyboard shortcuts quickly",
"Check Our Docs": "Check our docs",
"Check for updates": "Check for updates",
"Check for updates automatically": "Check for updates automatically",
"Choose your font style": "Choose your font style",
"Click to replace photo": "Click to replace photo", "Click to replace photo": "Click to replace photo",
"Client Border Style": "Client border style",
"Cloud Workspace": "Cloud workspace",
"Cloud Workspace Description": "All data will be synchronised and saved to the AFFiNE account <1>{{email}}</1>",
"Code block": "Code block",
"Collaboration": "Collaboration",
"Collaboration Description": "Collaborating with other members requires AFFiNE Cloud service.",
"Collapse sidebar": "Collapse sidebar",
"Collections": "Collections", "Collections": "Collections",
"Communities": "Communities",
"Confirm": "Confirm", "Confirm": "Confirm",
"Connector": "Connector",
"Contact Us": "Contact us",
"Contact with us": "Contact us",
"Continue": "Continue", "Continue": "Continue",
"Continue with Google": "Continue with Google",
"Convert to ": "Convert to ", "Convert to ": "Convert to ",
"Copied link to clipboard": "Copied link to clipboard", "Copied link to clipboard": "Copied link to clipboard",
"Copy": "Copy", "Copy": "Copy",
"Copy Link": "Copy Link",
"Create": "Create", "Create": "Create",
"Create Or Import": "Create or import",
"Create Shared Link Description": "Create a link you can easily share with anyone.",
"Create a collection": "Create a collection",
"Create your own workspace": "Create your own workspace",
"Created": "Created", "Created": "Created",
"Created Successfully": "Created successfully",
"Created with": "Created with",
"Curve Connector": "Curve Connector",
"Customize": "Customise", "Customize": "Customise",
"Customize your AFFiNE Appearance": "Customise your AFFiNE Appearance",
"DB_FILE_ALREADY_LOADED": "Database file already loaded", "DB_FILE_ALREADY_LOADED": "Database file already loaded",
"DB_FILE_INVALID": "Invalid database file", "DB_FILE_INVALID": "Invalid database file",
"DB_FILE_MIGRATION_FAILED": "Database file migration failed", "DB_FILE_MIGRATION_FAILED": "Database file migration failed",
"DB_FILE_PATH_INVALID": "Database file path invalid", "DB_FILE_PATH_INVALID": "Database file path invalid",
"Data sync mode": "Data sync mode",
"Date": "Date", "Date": "Date",
"Date Format": "Date Format",
"Default Location": "Default location",
"Default db location hint": "By default will be saved to {{location}}",
"Delete": "Delete", "Delete": "Delete",
"Delete Member?": "Delete member?",
"Delete Workspace": "Delete workspace",
"Delete Workspace Description": "Deleting <1>{{workspace}}</1> cannot be undone, please proceed with caution. All contents will be lost.",
"Delete Workspace Description2": "Deleting <1>{{workspace}}</1> will delete both local and cloud data, this operation cannot be undone, please proceed with caution.",
"Delete Workspace Label Hint": "After deleting this Workspace, you will permanently delete all of its content for everyone. No one will be able to recover the content of this Workspace.",
"Delete Workspace placeholder": "Please type “Delete” to confirm",
"Delete page?": "Delete doc?",
"Delete permanently": "Delete permanently",
"Disable": "Disable", "Disable": "Disable",
"Disable Public Link": "Disable public link",
"Disable Public Link ?": "Disable public link ?",
"Disable Public Link Description": "Disabling this public link will prevent anyone with the link from accessing this page.",
"Disable Public Sharing": "Disable public sharing", "Disable Public Sharing": "Disable public sharing",
"Discover what's new": "Discover what's new",
"Discover what's new!": "Discover what's new!",
"Display Language": "Display language",
"Divider": "Divider", "Divider": "Divider",
"Download all data": "Download all data",
"Download core data": "Download core data",
"Download data": "Download {{CoreOrAll}} data",
"Download data Description1": "It takes up more space on your device.",
"Download data Description2": "It takes up little space on your device.",
"Download updates automatically": "Download updates automatically",
"Early Access Stage": "Early access stage",
"Edgeless": "Edgeless", "Edgeless": "Edgeless",
"Edit": "Edit", "Edit": "Edit",
"Edit Filter": "Edit filter",
"Editor Version": "Editor version", "Editor Version": "Editor version",
"Elbowed Connector": "Elbowed connector",
"Enable": "Enable", "Enable": "Enable",
"Enable AFFiNE Cloud": "Enable AFFiNE Cloud", "Enable AFFiNE Cloud": "Enable AFFiNE Cloud",
"Enable AFFiNE Cloud Description": "If enabled, the data in this workspace will be backed up and synchronised via AFFiNE Cloud.", "Enable AFFiNE Cloud Description": "If enabled, the data in this workspace will be backed up and synchronised via AFFiNE Cloud.",
"Enable cloud hint": "The following functions rely on AFFiNE Cloud. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", "Enable cloud hint": "The following functions rely on AFFiNE Cloud. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.",
"Enabled success": "Enabled success",
"Exclude from filter": "Exclude from filter",
"Expand sidebar": "Expand sidebar",
"Expand/Collapse Sidebar": "Expand/Collapse sidebar",
"Export": "Export", "Export": "Export",
"Export AFFiNE backup file": "Export AFFiNE backup file",
"Export Description": "You can export the entire Workspace data for backup, and the exported data can be re-imported.", "Export Description": "You can export the entire Workspace data for backup, and the exported data can be re-imported.",
"Export Shared Pages Description": "Download a static copy of your page to share with others",
"Export Workspace": "Export Workspace <1>{{workspace}}</1> is coming soon",
"Export failed": "Export failed", "Export failed": "Export failed",
"Export success": "Export success", "Export success": "Export success",
"Export to HTML": "Export to HTML", "Export to HTML": "Export to HTML",
@ -127,216 +43,80 @@
"Export to PDF": "Export to PDF", "Export to PDF": "Export to PDF",
"Export to PNG": "Export to PNG", "Export to PNG": "Export to PNG",
"FILE_ALREADY_EXISTS": "File already exists", "FILE_ALREADY_EXISTS": "File already exists",
"Failed to publish workspace": "Failed to publish workspace",
"Favorite": "Favourite", "Favorite": "Favourite",
"Favorite pages for easy access": "Favourite docs for easy access",
"Favorited": "Favourited", "Favorited": "Favourited",
"Favorites": "Favourites", "Favorites": "Favourites",
"Filters": "Filters",
"Find 0 result": "Found 0 results", "Find 0 result": "Found 0 results",
"Find results": "Found {{number}} result(s)",
"Font Style": "Font style",
"Force Sign Out": "Force sign out",
"Full width Layout": "Full width layout",
"General": "General",
"Get in touch!": "Get in touch!",
"Get in touch! Join our communities": "Get in touch! Join our communities.",
"Get in touch! Join our communities.": "Get in touch! Join our communities.",
"Go Back": "Go back", "Go Back": "Go back",
"Go Forward": "Go forward", "Go Forward": "Go forward",
"Got it": "Got it", "Got it": "Got it",
"Group": "Group",
"Group as Database": "Group as database",
"Hand": "Hand",
"Heading": "Heading {{number}}", "Heading": "Heading {{number}}",
"Help and Feedback": "Help and feedback",
"How is AFFiNE Alpha different?": "How is AFFiNE Alpha different?",
"Image": "Image", "Image": "Image",
"Import": "Import", "Import": "Import",
"Increase indent": "Increase indent",
"Info": "Info", "Info": "Info",
"Info of legal": "Legal info",
"Inline code": "Inline code",
"Invitation sent": "Invitation sent", "Invitation sent": "Invitation sent",
"Invitation sent hint": "Invited members have been notified with email to join this Workspace.", "Invitation sent hint": "Invited members have been notified with email to join this Workspace.",
"Invite": "Invite", "Invite": "Invite",
"Invite Members": "Invite members", "Invite Members": "Invite members",
"Invite Members Message": "Invited members will collaborate with you in current workspace", "Invite Members Message": "Invited members will collaborate with you in current workspace",
"Invite placeholder": "Search mail (Gmail support only)",
"It takes up little space on your device": "It takes up little space on your device.",
"It takes up little space on your device.": "It takes up little space on your device.",
"It takes up more space on your device": "It takes up more space on your device.",
"It takes up more space on your device.": "It takes up more space on your device.",
"Italic": "Italic",
"Joined Workspace": "Joined workspace", "Joined Workspace": "Joined workspace",
"Jump to": "Jump to",
"Keyboard Shortcuts": "Keyboard shortcuts",
"Leave": "Leave", "Leave": "Leave",
"Leave Workspace": "Leave workspace",
"Leave Workspace Description": "After you leave, you will no longer be able to access the contents of this workspace.",
"Leave Workspace hint": "After you leave, you will not be able to access content within this workspace.",
"Link": "Hyperlink (with selected text)", "Link": "Hyperlink (with selected text)",
"Loading": "Loading...", "Loading": "Loading...",
"Loading All Workspaces": "Loading All Workspaces",
"Local": "Local", "Local": "Local",
"Local Workspace": "Local workspace",
"Local Workspace Description": "All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.",
"Markdown Syntax": "Markdown syntax",
"Member": "Member", "Member": "Member",
"Member has been removed": "{{name}} has been removed",
"Members": "Members", "Members": "Members",
"Members hint": "Manage members here, invite new member by email.", "Members hint": "Manage members here, invite new member by email.",
"Move Down": "Move down",
"Move Up": "Move up",
"Move folder": "Move folder",
"Move folder hint": "Select a new storage location.",
"Move folder success": "Move folder success",
"Move page to": "Move doc to...",
"Move page to...": "Move doc to...",
"Move to": "Move to",
"Move to Trash": "Move to trash",
"Moved to Trash": "Moved to trash",
"My Workspaces": "My workspaces",
"Name Your Workspace": "Name your workspace",
"NativeTitleBar": "Native titlebar",
"Navigation Path": "Navigation path",
"New Keyword Page": "New '{{query}}' doc",
"New Page": "New doc", "New Page": "New doc",
"New Workspace": "New workspace",
"New version is ready": "New version is ready",
"No item": "No item",
"Non-Gmail": "Non-Gmail is not supported",
"None yet": "None yet",
"Not now": "Not now",
"Note": "Note",
"Official Website": "Official website",
"Open Workspace Settings": "Open workspace settings",
"Open folder": "Open folder",
"Open folder hint": "Check the where the storage folder is located.",
"Open in new tab": "Open in new tab",
"Organize pages to build knowledge": "Organise docs to build knowledge",
"Owner": "Owner", "Owner": "Owner",
"Page": "Page", "Page": "Page",
"Paper": "Paper",
"Pen": "Pen", "Pen": "Pen",
"Pending": "Pending", "Pending": "Pending",
"Permanently deleted": "Permanently deleted",
"Pivots": "Pivots",
"Placeholder of delete workspace": "Please type workspace name to confirm",
"Please make sure you are online": "Please make sure you are online",
"Privacy": "Privacy",
"Publish": "Publish", "Publish": "Publish",
"Publish to web": "Publish to web",
"Published Description": " The current workspace has been published to the web, everyone can view the contents of this workspace through the link.",
"Published hint": "Visitors can view the contents through the provided link.",
"Published to Web": "Published to web", "Published to Web": "Published to web",
"Publishing": "Publishing to web requires AFFiNE Cloud service.",
"Publishing Description": "After publishing to the web, everyone can view the content of this workspace through the link.",
"Quick Search": "Quick search", "Quick Search": "Quick search",
"Quick search": "Search", "Quick search": "Search",
"Quick search placeholder": "Quick search...",
"Quick search placeholder2": "Search in {{workspace}}",
"RFP": "Docs can be freely added/removed from pivots, remaining accessible from \"All docs\".",
"Recent": "Recent", "Recent": "Recent",
"Redo": "Redo",
"Reduce indent": "Reduce indent",
"Remove from Pivots": "Remove from pivots",
"Remove from favorites": "Remove from favourites",
"Remove from workspace": "Remove from workspace", "Remove from workspace": "Remove from workspace",
"Remove photo": "Remove photo", "Remove photo": "Remove photo",
"Remove special filter": "Remove special filter", "Remove special filter": "Remove special filter",
"Removed from Favorites": "Removed from Favourites",
"Removed successfully": "Removed successfully", "Removed successfully": "Removed successfully",
"Rename": "Rename", "Rename": "Rename",
"Restart Install Client Update": "Restart to install update",
"Restore it": "Restore it",
"Retain cached cloud data": "Retain cached cloud data",
"Retain local cached data": "Retain local cached data",
"Save": "Save", "Save": "Save",
"Save As New Collection": "Save as new collection",
"Save as New Collection": "Save as new collection",
"Saved then enable AFFiNE Cloud": "All changes are saved locally, click to enable AFFiNE Cloud.",
"Select": "Select", "Select": "Select",
"Select All": "Select all",
"Set a Workspace name": "Set a workspace name",
"Set database location": "Set database location",
"Set up an AFFiNE account to sync data": "Set up an AFFiNE account to sync data",
"Settings": "Settings",
"Shape": "Shape",
"Share Menu Public Workspace Description1": "Invite others to join the Workspace or publish it to web.",
"Share Menu Public Workspace Description2": "Current workspace has been published to the web as a public workspace.",
"Share with link": "Share with link",
"Shared Pages": "Shared docs",
"Shared Pages Description": "Sharing doc publicly requires AFFiNE Cloud service.",
"Shared Pages In Public Workspace Description": "The entire workspace is published on the web and can be edited via <1>Workspace settings</1>.",
"Shortcuts": "Shortcuts",
"Sidebar": "Sidebar",
"Sign in": "Sign in AFFiNE Cloud", "Sign in": "Sign in AFFiNE Cloud",
"Sign in and Enable": "Sign in and enable", "Sign in and Enable": "Sign in and enable",
"Sign out": "Sign out", "Sign out": "Sign out",
"Sign out description": "Signing out will cause the unsynchronised content to be lost.",
"Skip": "Skip",
"Start Week On Monday": "Start week on Monday",
"Stay logged out": "Stay logged out",
"Sticky": "Sticky",
"Stop publishing": "Stop publishing",
"Storage": "Storage", "Storage": "Storage",
"Storage Folder": "Storage folder",
"Storage and Export": "Storage and export", "Storage and Export": "Storage and export",
"Straight Connector": "Straight connector",
"Strikethrough": "Strikethrough",
"Successfully deleted": "Successfully deleted", "Successfully deleted": "Successfully deleted",
"Successfully enabled AFFiNE Cloud": "Successfully enabled AFFiNE Cloud",
"Successfully joined!": "Successfully joined!", "Successfully joined!": "Successfully joined!",
"Switch": "Switch", "Switch": "Switch",
"Sync": "Sync", "Sync": "Sync",
"Sync across devices with AFFiNE Cloud": "Sync across devices with AFFiNE Cloud",
"Synced with AFFiNE Cloud": "Synced with AFFiNE Cloud", "Synced with AFFiNE Cloud": "Synced with AFFiNE Cloud",
"Tags": "Tags", "Tags": "Tags",
"Terms of Use": "Terms of Use",
"Text": "Text", "Text": "Text",
"Theme": "Theme", "Theme": "Theme",
"Title": "Title", "Title": "Title",
"Trash": "Trash", "Trash": "Trash",
"TrashButtonGroupDescription": "Once deleted, you can't undo this action. Do you confirm?",
"TrashButtonGroupTitle": "Permanently delete",
"UNKNOWN_ERROR": "Unknown error", "UNKNOWN_ERROR": "Unknown error",
"Underline": "Underline",
"Undo": "Undo", "Undo": "Undo",
"Ungroup": "Ungroup",
"Unpin": "Unpin", "Unpin": "Unpin",
"Unpublished hint": "Once published to the web, visitors can view the contents through the provided link.",
"Untitled": "Untitled", "Untitled": "Untitled",
"Untitled Collection": "Untitled collection",
"Update Available": "Update available",
"Update Collection": "Update collection",
"Update workspace name success": "Update workspace name success", "Update workspace name success": "Update workspace name success",
"Updated": "Updated", "Updated": "Updated",
"Upload": "Upload", "Upload": "Upload",
"Use on current device only": "Use on current device only",
"Users": "Users", "Users": "Users",
"Version": "Version", "Version": "Version",
"View Navigation Path": "View navigation path",
"Visit Workspace": "Visit workspace", "Visit Workspace": "Visit workspace",
"Wait for Sync": "Wait for sync",
"Window frame style": "Window frame style",
"Workspace Avatar": "Workspace avatar",
"Workspace Icon": "Workspace icon",
"Workspace Name": "Workspace name", "Workspace Name": "Workspace name",
"Workspace Not Found": "Workspace not found",
"Workspace Owner": "Workspace owner", "Workspace Owner": "Workspace owner",
"Workspace Profile": "Workspace profile", "Workspace Profile": "Workspace profile",
"Workspace Settings": "Workspace settings", "Workspace Settings": "Workspace settings",
"Workspace Settings with name": "{{name}}'s settings", "Workspace Settings with name": "{{name}}'s settings",
"Workspace Type": "Workspace type",
"Workspace database storage description": "Select where you want to create your workspace. The data of workspace is saved locally by default.",
"Workspace description": "A workspace is your virtual space to capture, create and plan as just one person or together as a team.",
"Workspace saved locally": "{{name}} is saved locally", "Workspace saved locally": "{{name}} is saved locally",
"You cannot delete the last workspace": "You cannot delete the last workspace",
"Zoom in": "Zoom in", "Zoom in": "Zoom in",
"Zoom out": "Zoom out", "Zoom out": "Zoom out",
"Zoom to 100%": "Zoom to 100%",
"Zoom to fit": "Zoom to fit",
"all": "all", "all": "all",
"com.affine.aboutAFFiNE.autoCheckUpdate.description": "Automatically check for new updates periodically.", "com.affine.aboutAFFiNE.autoCheckUpdate.description": "Automatically check for new updates periodically.",
"com.affine.aboutAFFiNE.autoCheckUpdate.title": "Check for updates automatically", "com.affine.aboutAFFiNE.autoCheckUpdate.title": "Check for updates automatically",
@ -417,42 +197,27 @@
"com.affine.appearanceSettings.clientBorder.title": "Client border style", "com.affine.appearanceSettings.clientBorder.title": "Client border style",
"com.affine.appearanceSettings.color.description": "Choose your colour mode", "com.affine.appearanceSettings.color.description": "Choose your colour mode",
"com.affine.appearanceSettings.color.title": "Colour mode", "com.affine.appearanceSettings.color.title": "Colour mode",
"com.affine.appearanceSettings.date.title": "Date",
"com.affine.appearanceSettings.dateFormat.description": "Customise your date style.",
"com.affine.appearanceSettings.dateFormat.title": "Date format",
"com.affine.appearanceSettings.font.description": "Choose your font style", "com.affine.appearanceSettings.font.description": "Choose your font style",
"com.affine.appearanceSettings.font.title": "Font style", "com.affine.appearanceSettings.font.title": "Font style",
"com.affine.appearanceSettings.fontStyle.mono": "Mono", "com.affine.appearanceSettings.fontStyle.mono": "Mono",
"com.affine.appearanceSettings.fontStyle.sans": "Sans", "com.affine.appearanceSettings.fontStyle.sans": "Sans",
"com.affine.appearanceSettings.fontStyle.serif": "Serif", "com.affine.appearanceSettings.fontStyle.serif": "Serif",
"com.affine.appearanceSettings.fullWidth.description": "Maximum display of content within a doc.",
"com.affine.appearanceSettings.fullWidth.title": "Full width layout",
"com.affine.appearanceSettings.language.description": "Select the language for the interface.", "com.affine.appearanceSettings.language.description": "Select the language for the interface.",
"com.affine.appearanceSettings.language.title": "Display language", "com.affine.appearanceSettings.language.title": "Display language",
"com.affine.appearanceSettings.noisyBackground.description": "Use background noise effect on the sidebar.", "com.affine.appearanceSettings.noisyBackground.description": "Use background noise effect on the sidebar.",
"com.affine.appearanceSettings.noisyBackground.title": "Noise background on the sidebar", "com.affine.appearanceSettings.noisyBackground.title": "Noise background on the sidebar",
"com.affine.appearanceSettings.sidebar.title": "Sidebar", "com.affine.appearanceSettings.sidebar.title": "Sidebar",
"com.affine.appearanceSettings.startWeek.description": "By default, the week starts on Sunday.",
"com.affine.appearanceSettings.startWeek.title": "Start week on Monday",
"com.affine.appearanceSettings.subtitle": "Customise your AFFiNE appearance", "com.affine.appearanceSettings.subtitle": "Customise your AFFiNE appearance",
"com.affine.appearanceSettings.theme.title": "Theme", "com.affine.appearanceSettings.theme.title": "Theme",
"com.affine.appearanceSettings.title": "Appearance settings", "com.affine.appearanceSettings.title": "Appearance settings",
"com.affine.appearanceSettings.translucentUI.description": "Use transparency effect on the sidebar.", "com.affine.appearanceSettings.translucentUI.description": "Use transparency effect on the sidebar.",
"com.affine.appearanceSettings.translucentUI.title": "Translucent UI on the sidebar", "com.affine.appearanceSettings.translucentUI.title": "Translucent UI on the sidebar",
"com.affine.appearanceSettings.windowFrame.NativeTitleBar": "Native titlebar",
"com.affine.appearanceSettings.windowFrame.description": "Customise appearance of Windows Client.",
"com.affine.appearanceSettings.windowFrame.frameless": "Frameless",
"com.affine.appearanceSettings.windowFrame.title": "Window frame style",
"com.affine.auth.change.email.message": "Your current email is {{email}}. Well send a temporary verification link to this email.", "com.affine.auth.change.email.message": "Your current email is {{email}}. Well send a temporary verification link to this email.",
"com.affine.auth.change.email.page.subtitle": "Please enter your new email address below. We will send a verification link to this email address to complete the process.", "com.affine.auth.change.email.page.subtitle": "Please enter your new email address below. We will send a verification link to this email address to complete the process.",
"com.affine.auth.change.email.page.success.subtitle": "Congratulations! You have successfully updated the email address associated with your AFFiNE Cloud account.", "com.affine.auth.change.email.page.success.subtitle": "Congratulations! You have successfully updated the email address associated with your AFFiNE Cloud account.",
"com.affine.auth.change.email.page.success.title": "Email address updated!", "com.affine.auth.change.email.page.success.title": "Email address updated!",
"com.affine.auth.change.email.page.title": "Change email address", "com.affine.auth.change.email.page.title": "Change email address",
"com.affine.auth.create.count": "Create account",
"com.affine.auth.desktop.signing.in": "Signing in...",
"com.affine.auth.forget": "Forgot password", "com.affine.auth.forget": "Forgot password",
"com.affine.auth.has.signed": "Signed in",
"com.affine.auth.has.signed.message": "You have been signed in, start to sync your data with AFFiNE Cloud!",
"com.affine.auth.later": "Later", "com.affine.auth.later": "Later",
"com.affine.auth.open.affine": "Open AFFiNE", "com.affine.auth.open.affine": "Open AFFiNE",
"com.affine.auth.open.affine.download-app": "Download app", "com.affine.auth.open.affine.download-app": "Download app",
@ -467,7 +232,6 @@
"com.affine.auth.reset.password.message": "You will receive an email with a link to reset your password. Please check your inbox.", "com.affine.auth.reset.password.message": "You will receive an email with a link to reset your password. Please check your inbox.",
"com.affine.auth.reset.password.page.success": "Password reset successful", "com.affine.auth.reset.password.page.success": "Password reset successful",
"com.affine.auth.reset.password.page.title": "Reset your AFFiNE Cloud password", "com.affine.auth.reset.password.page.title": "Reset your AFFiNE Cloud password",
"com.affine.auth.send.change.email.link": "Send verification link",
"com.affine.auth.send.reset.password.link": "Send reset link", "com.affine.auth.send.reset.password.link": "Send reset link",
"com.affine.auth.send.set.password.link": "Send set link", "com.affine.auth.send.set.password.link": "Send set link",
"com.affine.auth.send.verify.email.hint": "Send verification link", "com.affine.auth.send.verify.email.hint": "Send verification link",
@ -493,10 +257,8 @@
"com.affine.auth.sign-out.confirm-modal.confirm": "Sign Out", "com.affine.auth.sign-out.confirm-modal.confirm": "Sign Out",
"com.affine.auth.sign-out.confirm-modal.description": "After signing out, the Cloud Workspaces associated with this account will be removed from the current device, and signing in again will add them back.", "com.affine.auth.sign-out.confirm-modal.description": "After signing out, the Cloud Workspaces associated with this account will be removed from the current device, and signing in again will add them back.",
"com.affine.auth.sign-out.confirm-modal.title": "Sign out?", "com.affine.auth.sign-out.confirm-modal.title": "Sign out?",
"com.affine.auth.sign.auth.code.error.hint": "Wrong code, please try again",
"com.affine.auth.sign.auth.code.message": "If you haven't received the email, please check your spam folder.", "com.affine.auth.sign.auth.code.message": "If you haven't received the email, please check your spam folder.",
"com.affine.auth.sign.auth.code.message.password": "Or <1>sign in with password</1> instead.", "com.affine.auth.sign.auth.code.message.password": "Or <1>sign in with password</1> instead.",
"com.affine.auth.sign.auth.code.on.resend.hint": "Send code again",
"com.affine.auth.sign.auth.code.resend.hint": "Resend link", "com.affine.auth.sign.auth.code.resend.hint": "Resend link",
"com.affine.auth.sign.auth.code.send-email.sign-in": "Sign in with magic link", "com.affine.auth.sign.auth.code.send-email.sign-in": "Sign in with magic link",
"com.affine.auth.sign.condition": "Terms of conditions", "com.affine.auth.sign.condition": "Terms of conditions",
@ -506,9 +268,6 @@
"com.affine.auth.sign.in": "Sign in", "com.affine.auth.sign.in": "Sign in",
"com.affine.auth.sign.in.sent.email.subtitle": "Confirm your email", "com.affine.auth.sign.in.sent.email.subtitle": "Confirm your email",
"com.affine.auth.sign.message": "By clicking “Continue with Google/Email” above, you acknowledge that you agree to AFFiNE's <1>Terms of Conditions</1> and <3>Privacy Policy</3>.", "com.affine.auth.sign.message": "By clicking “Continue with Google/Email” above, you acknowledge that you agree to AFFiNE's <1>Terms of Conditions</1> and <3>Privacy Policy</3>.",
"com.affine.auth.sign.no.access.hint": "AFFiNE Cloud is in early access. Check out this link to learn more about the benefits of becoming an AFFiNE Cloud Early Supporter: ",
"com.affine.auth.sign.no.access.link": "AFFiNE Cloud Early Access",
"com.affine.auth.sign.no.access.wait": "Wait for public release",
"com.affine.auth.sign.policy": "Privacy policy", "com.affine.auth.sign.policy": "Privacy policy",
"com.affine.auth.sign.sent.email.message.end": " You can click the link to create an account automatically.", "com.affine.auth.sign.sent.email.message.end": " You can click the link to create an account automatically.",
"com.affine.auth.sign.sent.email.message.sent-tips": "An email with a magic link has been sent to <a>{{email}}</a>.", "com.affine.auth.sign.sent.email.message.sent-tips": "An email with a magic link has been sent to <a>{{email}}</a>.",
@ -525,8 +284,6 @@
"com.affine.auth.toast.title.failed": "Unable to sign in", "com.affine.auth.toast.title.failed": "Unable to sign in",
"com.affine.auth.toast.title.signed-in": "Signed in", "com.affine.auth.toast.title.signed-in": "Signed in",
"com.affine.auth.verify.email.message": "Your current email is {{email}}. Well send a temporary verification link to this email.", "com.affine.auth.verify.email.message": "Your current email is {{email}}. Well send a temporary verification link to this email.",
"com.affine.auth.verify.email.page.success.subtitle": "Congratulations! You have successfully verified the email address associated with your AFFiNE Cloud account.",
"com.affine.auth.verify.email.page.success.title": "Email address verified!",
"com.affine.backButton": "Back", "com.affine.backButton": "Back",
"com.affine.banner.content": "This demo is limited. <1>Download the AFFiNE Client</1> for the latest features and Performance.", "com.affine.banner.content": "This demo is limited. <1>Download the AFFiNE Client</1> for the latest features and Performance.",
"com.affine.banner.local-warning": "Your local data is stored in the browser and may be lost. Don't risk it - enable cloud now!", "com.affine.banner.local-warning": "Your local data is stored in the browser and may be lost. Don't risk it - enable cloud now!",
@ -534,17 +291,8 @@
"com.affine.calendar-date-picker.month-names": "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", "com.affine.calendar-date-picker.month-names": "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
"com.affine.calendar-date-picker.today": "Today", "com.affine.calendar-date-picker.today": "Today",
"com.affine.calendar-date-picker.week-days": "Su,Mo,Tu,We,Th,Fr,Sa", "com.affine.calendar-date-picker.week-days": "Su,Mo,Tu,We,Th,Fr,Sa",
"com.affine.calendar.weekdays.fri": "Fri",
"com.affine.calendar.weekdays.mon": "Mon",
"com.affine.calendar.weekdays.sat": "Sat",
"com.affine.calendar.weekdays.sun": "Sun",
"com.affine.calendar.weekdays.thu": "Thu",
"com.affine.calendar.weekdays.tue": "Tue",
"com.affine.calendar.weekdays.wed": "Wed",
"com.affine.cloud-scroll-tip.caption": "Host by AFFiNE.Pro, Save, sync, and backup all your data.", "com.affine.cloud-scroll-tip.caption": "Host by AFFiNE.Pro, Save, sync, and backup all your data.",
"com.affine.cloud-scroll-tip.title": "AFFiNE Cloud", "com.affine.cloud-scroll-tip.title": "AFFiNE Cloud",
"com.affine.cloudTempDisable.description": "We are upgrading the AFFiNE Cloud service and it is temporarily unavailable on the client side. If you wish to stay updated on the progress and be notified on availability, you can fill out the <1>AFFiNE Cloud Signup</1>.",
"com.affine.cloudTempDisable.title": "AFFiNE Cloud is upgrading now.",
"com.affine.cmdk.affine.category.affine.collections": "Collections", "com.affine.cmdk.affine.category.affine.collections": "Collections",
"com.affine.cmdk.affine.category.affine.creation": "Create", "com.affine.cmdk.affine.category.affine.creation": "Create",
"com.affine.cmdk.affine.category.affine.edgeless": "Edgeless", "com.affine.cmdk.affine.category.affine.edgeless": "Edgeless",
@ -563,7 +311,6 @@
"com.affine.cmdk.affine.category.results": "Results", "com.affine.cmdk.affine.category.results": "Results",
"com.affine.cmdk.affine.client-border-style.to": "Change client border style to", "com.affine.cmdk.affine.client-border-style.to": "Change client border style to",
"com.affine.cmdk.affine.color-mode.to": "Change colour mode to", "com.affine.cmdk.affine.color-mode.to": "Change colour mode to",
"com.affine.cmdk.affine.color-scheme.to": "Change colour scheme to",
"com.affine.cmdk.affine.contact-us": "Contact us", "com.affine.cmdk.affine.contact-us": "Contact us",
"com.affine.cmdk.affine.create-new-doc-and-insert": "Create \"{{keyWord}}\" doc and insert", "com.affine.cmdk.affine.create-new-doc-and-insert": "Create \"{{keyWord}}\" doc and insert",
"com.affine.cmdk.affine.create-new-edgeless-as": "New \"{{keyWord}}\" edgeless", "com.affine.cmdk.affine.create-new-edgeless-as": "New \"{{keyWord}}\" edgeless",
@ -614,9 +361,7 @@
"com.affine.collection.addPage.alreadyExists": "Doc already exists", "com.affine.collection.addPage.alreadyExists": "Doc already exists",
"com.affine.collection.addPage.success": "Added successfully", "com.affine.collection.addPage.success": "Added successfully",
"com.affine.collection.addPages": "Add docs", "com.affine.collection.addPages": "Add docs",
"com.affine.collection.addPages.tips": "<0>Add docs:</0> You can freely select docs and add them to the collection.",
"com.affine.collection.addRules": "Add rules", "com.affine.collection.addRules": "Add rules",
"com.affine.collection.addRules.tips": "<0>Add rules:</0> Rules are based on filtering. After adding rules, docs that meet the requirements will be automatically added to the current collection.",
"com.affine.collection.allCollections": "All collections", "com.affine.collection.allCollections": "All collections",
"com.affine.collection.emptyCollection": "Empty collection", "com.affine.collection.emptyCollection": "Empty collection",
"com.affine.collection.emptyCollectionDescription": "Collection is a smart folder where you can manually add docs or automatically add docs through rules.", "com.affine.collection.emptyCollectionDescription": "Collection is a smart folder where you can manually add docs or automatically add docs through rules.",
@ -628,7 +373,6 @@
"com.affine.collection.toolbar.selected_one": "<0>{{count}}</0> collection selected", "com.affine.collection.toolbar.selected_one": "<0>{{count}}</0> collection selected",
"com.affine.collection.toolbar.selected_other": "<0>{{count}}</0> collection(s) selected", "com.affine.collection.toolbar.selected_other": "<0>{{count}}</0> collection(s) selected",
"com.affine.collection.toolbar.selected_others": "<0>{{count}}</0> collection(s) selected", "com.affine.collection.toolbar.selected_others": "<0>{{count}}</0> collection(s) selected",
"com.affine.collectionBar.backToAll": "Back to all",
"com.affine.collections.empty.message": "No collections", "com.affine.collections.empty.message": "No collections",
"com.affine.collections.empty.new-collection-button": "New collection", "com.affine.collections.empty.new-collection-button": "New collection",
"com.affine.collections.header": "Collections", "com.affine.collections.header": "Collections",
@ -681,8 +425,6 @@
"com.affine.editCollectionName.createTips": "Collection is a smart folder where you can manually add docs or automatically add docs through rules.", "com.affine.editCollectionName.createTips": "Collection is a smart folder where you can manually add docs or automatically add docs through rules.",
"com.affine.editCollectionName.name": "Name", "com.affine.editCollectionName.name": "Name",
"com.affine.editCollectionName.name.placeholder": "Collection name", "com.affine.editCollectionName.name.placeholder": "Collection name",
"com.affine.editor.reference-not-found": "Linked doc not found",
"com.affine.editorModeSwitch.tooltip": "Switch",
"com.affine.empty.collection-detail.action.add-doc": "Add docs", "com.affine.empty.collection-detail.action.add-doc": "Add docs",
"com.affine.empty.collection-detail.action.add-rule": "Add rules", "com.affine.empty.collection-detail.action.add-rule": "Add rules",
"com.affine.empty.collection-detail.description": "Collection is a smart folder where you can manually add docs or automatically add docs through rules.", "com.affine.empty.collection-detail.description": "Collection is a smart folder where you can manually add docs or automatically add docs through rules.",
@ -697,13 +439,9 @@
"com.affine.empty.tags.description": "Create a new tag for your documents.", "com.affine.empty.tags.description": "Create a new tag for your documents.",
"com.affine.empty.tags.title": "Tag management", "com.affine.empty.tags.title": "Tag management",
"com.affine.emptyDesc": "There's no doc here yet", "com.affine.emptyDesc": "There's no doc here yet",
"com.affine.emptyDesc.collection": "There's no collection here yet",
"com.affine.emptyDesc.tag": "There's no tag here yet",
"com.affine.enableAffineCloudModal.button.cancel": "Cancel", "com.affine.enableAffineCloudModal.button.cancel": "Cancel",
"com.affine.error.contact.description": "If you are still experiencing this issue, please <1>contact us through the community.</1>",
"com.affine.error.hide-error": "Hide error", "com.affine.error.hide-error": "Hide error",
"com.affine.error.no-page-root.title": "Doc content is missing", "com.affine.error.no-page-root.title": "Doc content is missing",
"com.affine.error.page-not-found.title": "Refresh",
"com.affine.error.refetch": "Refetch", "com.affine.error.refetch": "Refetch",
"com.affine.error.reload": "Reload AFFiNE", "com.affine.error.reload": "Reload AFFiNE",
"com.affine.error.retry": "Refresh", "com.affine.error.retry": "Refresh",
@ -772,7 +510,6 @@
"com.affine.issue-feedback.description": "Got feedback? We're all ears! Create an issue on GitHub to let us know your thoughts and suggestions", "com.affine.issue-feedback.description": "Got feedback? We're all ears! Create an issue on GitHub to let us know your thoughts and suggestions",
"com.affine.issue-feedback.title": "Share your feedback on GitHub", "com.affine.issue-feedback.title": "Share your feedback on GitHub",
"com.affine.journal.app-sidebar-title": "Journals", "com.affine.journal.app-sidebar-title": "Journals",
"com.affine.journal.cmdk.append-to-today": "Append to journal",
"com.affine.journal.conflict-show-more": "{{count}} more articles", "com.affine.journal.conflict-show-more": "{{count}} more articles",
"com.affine.journal.created-today": "Created", "com.affine.journal.created-today": "Created",
"com.affine.journal.daily-count-created-empty-tips": "You haven't created anything yet", "com.affine.journal.daily-count-created-empty-tips": "You haven't created anything yet",
@ -871,14 +608,6 @@
"com.affine.nextWeek": "Next week", "com.affine.nextWeek": "Next week",
"com.affine.notFoundPage.backButton": "Back home", "com.affine.notFoundPage.backButton": "Back home",
"com.affine.notFoundPage.title": "Page not found", "com.affine.notFoundPage.title": "Page not found",
"com.affine.onboarding.title1": "Hyper merged whiteboard and docs",
"com.affine.onboarding.title2": "Intuitive & robust block-based editing",
"com.affine.onboarding.videoDescription1": "Easily switch between Page mode for structured document creation and Whiteboard mode for the freeform visual expression of creative ideas.",
"com.affine.onboarding.videoDescription2": "Create structured documents with ease, using a modular interface to drag and drop blocks of text, images, and other content.",
"com.affine.onboarding.workspace-guide.content": "A Workspace is your virtual space to capture, create and plan as just one person or together as a team.",
"com.affine.onboarding.workspace-guide.got-it": "Got it!",
"com.affine.onboarding.workspace-guide.title": "Start AFFiNE by creating your own Workspace here!",
"com.affine.openPageOperation.newTab": "Open in new tab",
"com.affine.other-page.nav.affine-community": "AFFiNE Community", "com.affine.other-page.nav.affine-community": "AFFiNE Community",
"com.affine.other-page.nav.blog": "Blog", "com.affine.other-page.nav.blog": "Blog",
"com.affine.other-page.nav.contact-us": "Contact us", "com.affine.other-page.nav.contact-us": "Contact us",
@ -1077,8 +806,6 @@
"com.affine.payment.cloud.team.title": "Coming soon", "com.affine.payment.cloud.team.title": "Coming soon",
"com.affine.payment.contact-sales": "Contact sales", "com.affine.payment.contact-sales": "Contact sales",
"com.affine.payment.current-plan": "Current plan", "com.affine.payment.current-plan": "Current plan",
"com.affine.payment.disable-payment.description": "This is a special testing(Canary) version of AFFiNE. Account upgrades are not supported in this version. If you want to experience the full service, please download the stable version from our website.",
"com.affine.payment.disable-payment.title": "Account upgrade unavailable",
"com.affine.payment.discount-amount": "{{amount}}% off", "com.affine.payment.discount-amount": "{{amount}}% off",
"com.affine.payment.downgrade": "Downgrade", "com.affine.payment.downgrade": "Downgrade",
"com.affine.payment.downgraded-notify.content": "We'd like to hear more about where we fall short, so that we can make AFFiNE better.", "com.affine.payment.downgraded-notify.content": "We'd like to hear more about where we fall short, so that we can make AFFiNE better.",
@ -1124,7 +851,6 @@
"com.affine.payment.modal.resume.title": "Resume auto-renewal?", "com.affine.payment.modal.resume.title": "Resume auto-renewal?",
"com.affine.payment.plans-error-retry": "Refresh", "com.affine.payment.plans-error-retry": "Refresh",
"com.affine.payment.plans-error-tip": "Unable to load pricing plans, please check your network. ", "com.affine.payment.plans-error-tip": "Unable to load pricing plans, please check your network. ",
"com.affine.payment.price-description.per-month": "per month",
"com.affine.payment.recurring-monthly": "monthly", "com.affine.payment.recurring-monthly": "monthly",
"com.affine.payment.recurring-yearly": "annually", "com.affine.payment.recurring-yearly": "annually",
"com.affine.payment.resume": "Resume", "com.affine.payment.resume": "Resume",
@ -1135,8 +861,6 @@
"com.affine.payment.storage-limit.description.owner": "Cloud storage is insufficient. You can upgrade your account to unlock more cloud storage.", "com.affine.payment.storage-limit.description.owner": "Cloud storage is insufficient. You can upgrade your account to unlock more cloud storage.",
"com.affine.payment.storage-limit.title": "Sync failed", "com.affine.payment.storage-limit.title": "Sync failed",
"com.affine.payment.storage-limit.view": "View", "com.affine.payment.storage-limit.view": "View",
"com.affine.payment.subscription.exist": "You already have a subscription.",
"com.affine.payment.subscription.go-to-subscribe": "Subscribe AFFiNE",
"com.affine.payment.subtitle-active": "You are currently on the {{currentPlan}} plan. If you have any questions, please contact our <3>customer support</3>.", "com.affine.payment.subtitle-active": "You are currently on the {{currentPlan}} plan. If you have any questions, please contact our <3>customer support</3>.",
"com.affine.payment.subtitle-canceled": "You are currently on the {{plan}} plan. After the current billing period ends, your account will automatically switch to the Free plan.", "com.affine.payment.subtitle-canceled": "You are currently on the {{plan}} plan. After the current billing period ends, your account will automatically switch to the Free plan.",
"com.affine.payment.subtitle-not-signed-in": "This is the pricing plans of AFFiNE Cloud. You can sign up or sign in to your account first.", "com.affine.payment.subtitle-not-signed-in": "This is the pricing plans of AFFiNE Cloud. You can sign up or sign in to your account first.",
@ -1144,7 +868,6 @@
"com.affine.payment.tell-us-use-case": "Tell us your use case", "com.affine.payment.tell-us-use-case": "Tell us your use case",
"com.affine.payment.title": "Pricing plans", "com.affine.payment.title": "Pricing plans",
"com.affine.payment.updated-notify-msg": "You have changed your plan to {{plan}} billing.", "com.affine.payment.updated-notify-msg": "You have changed your plan to {{plan}} billing.",
"com.affine.payment.updated-notify-msg.cancel-subscription": "No further charges will be made starting from the next billing cycle.",
"com.affine.payment.updated-notify-title": "Subscription updated", "com.affine.payment.updated-notify-title": "Subscription updated",
"com.affine.payment.upgrade": "Upgrade", "com.affine.payment.upgrade": "Upgrade",
"com.affine.payment.upgrade-success-notify.content": "We'd like to hear more about your use case, so that we can make AFFiNE better.", "com.affine.payment.upgrade-success-notify.content": "We'd like to hear more about your use case, so that we can make AFFiNE better.",
@ -1159,10 +882,6 @@
"com.affine.peek-view-controls.open-doc": "Open this doc", "com.affine.peek-view-controls.open-doc": "Open this doc",
"com.affine.peek-view-controls.open-doc-in-new-tab": "Open in new tab", "com.affine.peek-view-controls.open-doc-in-new-tab": "Open in new tab",
"com.affine.peek-view-controls.open-doc-in-split-view": "Open in split view", "com.affine.peek-view-controls.open-doc-in-split-view": "Open in split view",
"com.affine.publicLinkDisableModal.button.cancel": "Cancel",
"com.affine.publicLinkDisableModal.button.disable": "Disable",
"com.affine.publicLinkDisableModal.description": "Disabling this public link will prevent anyone with the link from accessing this doc.",
"com.affine.publicLinkDisableModal.title": "Disable public link",
"com.affine.quicksearch.group.creation": "New", "com.affine.quicksearch.group.creation": "New",
"com.affine.quicksearch.group.searchfor": "Search for \"{{query}}\"", "com.affine.quicksearch.group.searchfor": "Search for \"{{query}}\"",
"com.affine.resetSyncStatus.button": "Reset sync", "com.affine.resetSyncStatus.button": "Reset sync",
@ -1209,10 +928,6 @@
"com.affine.rootAppSidebar.organize.folder.add-others": "Add others", "com.affine.rootAppSidebar.organize.folder.add-others": "Add others",
"com.affine.rootAppSidebar.organize.folder.add-tags": "Add tags", "com.affine.rootAppSidebar.organize.folder.add-tags": "Add tags",
"com.affine.rootAppSidebar.organize.folder.create-subfolder": "Create a subfolder", "com.affine.rootAppSidebar.organize.folder.create-subfolder": "Create a subfolder",
"com.affine.rootAppSidebar.organize.link.notify-message": "Link {{from}} to {{to}}",
"com.affine.rootAppSidebar.organize.link.notify-title": "Successfully linked to {{to}}",
"com.affine.rootAppSidebar.organize.move.notify-message": "Add {{from}} to {{to}}",
"com.affine.rootAppSidebar.organize.move.notify-title": "Successfully added to {{to}}",
"com.affine.rootAppSidebar.organize.new-folders": "New folder", "com.affine.rootAppSidebar.organize.new-folders": "New folder",
"com.affine.rootAppSidebar.organize.root-folder-only": "Only folder can be placed on here", "com.affine.rootAppSidebar.organize.root-folder-only": "Only folder can be placed on here",
"com.affine.rootAppSidebar.others": "Others", "com.affine.rootAppSidebar.others": "Others",
@ -1228,18 +943,7 @@
"com.affine.selectPage.selected": "Selected", "com.affine.selectPage.selected": "Selected",
"com.affine.selectPage.title": "Add include doc", "com.affine.selectPage.title": "Add include doc",
"com.affine.selector-collection.search.placeholder": "Search collections...", "com.affine.selector-collection.search.placeholder": "Search collections...",
"com.affine.selector-doc.search-placeholder": "Search docs...",
"com.affine.selector-tag.search.placeholder": "Search tags...", "com.affine.selector-tag.search.placeholder": "Search tags...",
"com.affine.setDBLocation.button.customize": "Customise",
"com.affine.setDBLocation.button.defaultLocation": "Default location",
"com.affine.setDBLocation.description": "Select where you want to create your workspace. The data of workspace is saved locally by default.",
"com.affine.setDBLocation.title": "Set database location",
"com.affine.setDBLocation.tooltip.defaultLocation": "By default will be saved to {{location}}",
"com.affine.setSyncingMode.button.continue": "Continue",
"com.affine.setSyncingMode.cloud": "Sync across devices with AFFiNE Cloud",
"com.affine.setSyncingMode.deviceOnly": "Use on current device only",
"com.affine.setSyncingMode.title.added": "Added successfully",
"com.affine.setSyncingMode.title.created": "Created successfully",
"com.affine.setting.account": "Account settings", "com.affine.setting.account": "Account settings",
"com.affine.setting.account.delete": "Delete account", "com.affine.setting.account.delete": "Delete account",
"com.affine.setting.account.delete.message": "Permanently delete this account and the Workspace data backup in AFFiNE Cloud. This action can not be undone.", "com.affine.setting.account.delete.message": "Permanently delete this account and the Workspace data backup in AFFiNE Cloud. This action can not be undone.",
@ -1249,9 +953,6 @@
"com.affine.settingSidebar.settings.general": "General", "com.affine.settingSidebar.settings.general": "General",
"com.affine.settingSidebar.settings.workspace": "Workspace", "com.affine.settingSidebar.settings.workspace": "Workspace",
"com.affine.settingSidebar.title": "Settings", "com.affine.settingSidebar.title": "Settings",
"com.affine.settings.about.message": "Information about AFFiNE",
"com.affine.settings.about.update.check.message": "Automatically check for new updates periodically.",
"com.affine.settings.about.update.download.message": "Automatically download updates (to this device).",
"com.affine.settings.appearance": "Appearance", "com.affine.settings.appearance": "Appearance",
"com.affine.settings.appearance.border-style-description": "Customise the appearance of the client.", "com.affine.settings.appearance.border-style-description": "Customise the appearance of the client.",
"com.affine.settings.appearance.date-format-description": "Customise your date style.", "com.affine.settings.appearance.date-format-description": "Customise your date style.",
@ -1330,9 +1031,6 @@
"com.affine.settings.editorSettings.general.ai.enable.confirm": "Enable AI and Reload", "com.affine.settings.editorSettings.general.ai.enable.confirm": "Enable AI and Reload",
"com.affine.settings.editorSettings.general.ai.enable.description": "Do you want to enable AI? Our AI assistant is ready to enhance your productivity and provide smart assistance. Let's get started! We need reload page to make this change.", "com.affine.settings.editorSettings.general.ai.enable.description": "Do you want to enable AI? Our AI assistant is ready to enhance your productivity and provide smart assistance. Let's get started! We need reload page to make this change.",
"com.affine.settings.editorSettings.general.ai.enable.title": "Enable AI?", "com.affine.settings.editorSettings.general.ai.enable.title": "Enable AI?",
"com.affine.settings.editorSettings.general.ai.reload.confirm": "Reload",
"com.affine.settings.editorSettings.general.ai.reload.description": "AI settings have been updated. Please reload the page to apply the changes.",
"com.affine.settings.editorSettings.general.ai.reload.title": "You need to reload the page",
"com.affine.settings.editorSettings.general.ai.title": "AFFiNE AI", "com.affine.settings.editorSettings.general.ai.title": "AFFiNE AI",
"com.affine.settings.editorSettings.general.default-code-block.language.description": "Set a default programming language.", "com.affine.settings.editorSettings.general.default-code-block.language.description": "Set a default programming language.",
"com.affine.settings.editorSettings.general.default-code-block.language.title": "Code blocks default language", "com.affine.settings.editorSettings.general.default-code-block.language.title": "Code blocks default language",
@ -1344,10 +1042,6 @@
"com.affine.settings.editorSettings.general.font-family.custom.title": "Custom font family", "com.affine.settings.editorSettings.general.font-family.custom.title": "Custom font family",
"com.affine.settings.editorSettings.general.font-family.description": "Choose your editors font family.", "com.affine.settings.editorSettings.general.font-family.description": "Choose your editors font family.",
"com.affine.settings.editorSettings.general.font-family.title": "Font family", "com.affine.settings.editorSettings.general.font-family.title": "Font family",
"com.affine.settings.editorSettings.general.font-size.description": "Choose your editors base font size.",
"com.affine.settings.editorSettings.general.font-size.title": "Font size",
"com.affine.settings.editorSettings.general.font-style.description": "Choose your editors font style.",
"com.affine.settings.editorSettings.general.font-style.title": "Font style",
"com.affine.settings.editorSettings.general.spell-check.description": "Automatically detect and correct spelling errors.", "com.affine.settings.editorSettings.general.spell-check.description": "Automatically detect and correct spelling errors.",
"com.affine.settings.editorSettings.general.spell-check.title": "Spell check", "com.affine.settings.editorSettings.general.spell-check.title": "Spell check",
"com.affine.settings.editorSettings.page": "Page", "com.affine.settings.editorSettings.page": "Page",
@ -1383,9 +1077,6 @@
"com.affine.settings.remove-workspace": "Remove workspace", "com.affine.settings.remove-workspace": "Remove workspace",
"com.affine.settings.remove-workspace-description": "Remove workspace from this device and optionally delete all data.", "com.affine.settings.remove-workspace-description": "Remove workspace from this device and optionally delete all data.",
"com.affine.settings.sign": "Sign in / Sign up", "com.affine.settings.sign": "Sign in / Sign up",
"com.affine.settings.storage.db-location.change-hint": "Click to move storage location.",
"com.affine.settings.storage.description": "Check or change storage location",
"com.affine.settings.storage.description-alt": "Check or change storage location. Click path to edit location.",
"com.affine.settings.suggestion": "Need more customization options? Tell us in the community.", "com.affine.settings.suggestion": "Need more customization options? Tell us in the community.",
"com.affine.settings.suggestion-2": "Love our app? <1>Star us on GitHub</1> and <2>create issues</2> for your valuable feedback!", "com.affine.settings.suggestion-2": "Love our app? <1>Star us on GitHub</1> and <2>create issues</2> for your valuable feedback!",
"com.affine.settings.translucent-style": "Translucent UI on the sidebar", "com.affine.settings.translucent-style": "Translucent UI on the sidebar",
@ -1422,7 +1113,6 @@
"com.affine.settings.workspace.sharing.title": "Sharing", "com.affine.settings.workspace.sharing.title": "Sharing",
"com.affine.settings.workspace.sharing.url-preview.description": "Allow URL unfurling by Slack & other social apps, even if a doc is only accessible by workspace members.", "com.affine.settings.workspace.sharing.url-preview.description": "Allow URL unfurling by Slack & other social apps, even if a doc is only accessible by workspace members.",
"com.affine.settings.workspace.sharing.url-preview.title": "Always enable url preview", "com.affine.settings.workspace.sharing.url-preview.title": "Always enable url preview",
"com.affine.settings.workspace.storage.tip": "Click to move storage location.",
"com.affine.share-menu.EnableCloudDescription": "Sharing doc requires AFFiNE Cloud.", "com.affine.share-menu.EnableCloudDescription": "Sharing doc requires AFFiNE Cloud.",
"com.affine.share-menu.ShareMode": "Share mode", "com.affine.share-menu.ShareMode": "Share mode",
"com.affine.share-menu.SharePage": "Share doc", "com.affine.share-menu.SharePage": "Share doc",
@ -1434,16 +1124,12 @@
"com.affine.share-menu.SharedPage": "Shared doc", "com.affine.share-menu.SharedPage": "Shared doc",
"com.affine.share-menu.confirm-modify-mode.notification.fail.message": "Please try again later.", "com.affine.share-menu.confirm-modify-mode.notification.fail.message": "Please try again later.",
"com.affine.share-menu.confirm-modify-mode.notification.fail.title": "Failed to modify", "com.affine.share-menu.confirm-modify-mode.notification.fail.title": "Failed to modify",
"com.affine.share-menu.confirm-modify-mode.notification.success.message": "You have changed the public link from {{preMode}} Mode to {{currentMode}} Mode.",
"com.affine.share-menu.confirm-modify-mode.notification.success.title": "Modified successfully",
"com.affine.share-menu.copy": "Copy Link", "com.affine.share-menu.copy": "Copy Link",
"com.affine.share-menu.copy-private-link": "Copy private link", "com.affine.share-menu.copy-private-link": "Copy private link",
"com.affine.share-menu.copy.block": "Copy Link to Selected Block", "com.affine.share-menu.copy.block": "Copy Link to Selected Block",
"com.affine.share-menu.copy.edgeless": "Copy Link to Edgeless Mode", "com.affine.share-menu.copy.edgeless": "Copy Link to Edgeless Mode",
"com.affine.share-menu.copy.frame": "Copy Link to Selected Frame", "com.affine.share-menu.copy.frame": "Copy Link to Selected Frame",
"com.affine.share-menu.copy.page": "Copy Link to Page Mode", "com.affine.share-menu.copy.page": "Copy Link to Page Mode",
"com.affine.share-menu.create-public-link.notification.fail.message": "Please try again later.",
"com.affine.share-menu.create-public-link.notification.fail.title": "Failed to create public link",
"com.affine.share-menu.create-public-link.notification.success.message": "You can share this document with link.", "com.affine.share-menu.create-public-link.notification.success.message": "You can share this document with link.",
"com.affine.share-menu.create-public-link.notification.success.title": "Public link created", "com.affine.share-menu.create-public-link.notification.success.title": "Public link created",
"com.affine.share-menu.disable-publish-link.notification.fail.message": "Please try again later.", "com.affine.share-menu.disable-publish-link.notification.fail.message": "Please try again later.",
@ -1459,9 +1145,7 @@
"com.affine.share-menu.option.permission.can-edit": "Can Edit", "com.affine.share-menu.option.permission.can-edit": "Can Edit",
"com.affine.share-menu.option.permission.label": "Members in workspace", "com.affine.share-menu.option.permission.label": "Members in workspace",
"com.affine.share-menu.publish-to-web": "Publish to web", "com.affine.share-menu.publish-to-web": "Publish to web",
"com.affine.share-menu.publish-to-web.description": "Let anyone with a link view a read-only version of this doc.",
"com.affine.share-menu.share-privately": "Share privately", "com.affine.share-menu.share-privately": "Share privately",
"com.affine.share-menu.share-privately.description": "Only members of this workspace can open this link.",
"com.affine.share-menu.shareButton": "Share", "com.affine.share-menu.shareButton": "Share",
"com.affine.share-menu.sharedButton": "Shared", "com.affine.share-menu.sharedButton": "Shared",
"com.affine.share-page.footer.built-with": "Built with", "com.affine.share-page.footer.built-with": "Built with",
@ -1482,9 +1166,6 @@
"com.affine.star-affine.description": "Are you finding our app useful and enjoyable? We'd love your support to keep improving! A great way to help us out is by giving us a star on GitHub. This simple action can make a big difference and helps us continue to deliver the best experience for you.", "com.affine.star-affine.description": "Are you finding our app useful and enjoyable? We'd love your support to keep improving! A great way to help us out is by giving us a star on GitHub. This simple action can make a big difference and helps us continue to deliver the best experience for you.",
"com.affine.star-affine.title": "Star us on GitHub", "com.affine.star-affine.title": "Star us on GitHub",
"com.affine.storage.change-plan": "Change plan", "com.affine.storage.change-plan": "Change plan",
"com.affine.storage.disabled.hint": "AFFiNE Cloud is currently in early access phase and is not supported for upgrading, please be patient and wait for our pricing plan.",
"com.affine.storage.extend.hint": "The usage has reached its maximum capacity, AFFiNE Cloud is currently in early access phase and is not supported for upgrading, please be patient and wait for our pricing plan. ",
"com.affine.storage.extend.link": "To get more information click here.",
"com.affine.storage.maximum-tips": "You have reached the maximum capacity limit for your current account", "com.affine.storage.maximum-tips": "You have reached the maximum capacity limit for your current account",
"com.affine.storage.maximum-tips.pro": "Pro users will have unlimited storage capacity during the alpha test period of the team version", "com.affine.storage.maximum-tips.pro": "Pro users will have unlimited storage capacity during the alpha test period of the team version",
"com.affine.storage.plan": "Plan", "com.affine.storage.plan": "Plan",
@ -1535,10 +1216,6 @@
"com.affine.trashOperation.deleteDescription": "Once deleted, you can't undo this action. Do you confirm?", "com.affine.trashOperation.deleteDescription": "Once deleted, you can't undo this action. Do you confirm?",
"com.affine.trashOperation.deletePermanently": "Delete permanently", "com.affine.trashOperation.deletePermanently": "Delete permanently",
"com.affine.trashOperation.restoreIt": "Restore it", "com.affine.trashOperation.restoreIt": "Restore it",
"com.affine.updater.downloading": "Downloading",
"com.affine.updater.open-download-page": "Open download page",
"com.affine.updater.restart-to-update": "Restart to install update",
"com.affine.updater.update-available": "Update available",
"com.affine.upgrade.button-text.done": "Refresh current page", "com.affine.upgrade.button-text.done": "Refresh current page",
"com.affine.upgrade.button-text.error": "Data upgrade error", "com.affine.upgrade.button-text.error": "Data upgrade error",
"com.affine.upgrade.button-text.pending": "Upgrade workspace data", "com.affine.upgrade.button-text.pending": "Upgrade workspace data",
@ -1572,9 +1249,6 @@
"com.affine.workspaceDelete.description2": "Deleting <1>{{workspace}}</1> will delete both local and cloud data, this operation cannot be undone, please proceed with caution.", "com.affine.workspaceDelete.description2": "Deleting <1>{{workspace}}</1> will delete both local and cloud data, this operation cannot be undone, please proceed with caution.",
"com.affine.workspaceDelete.placeholder": "Please type workspace name to confirm", "com.affine.workspaceDelete.placeholder": "Please type workspace name to confirm",
"com.affine.workspaceDelete.title": "Delete workspace", "com.affine.workspaceDelete.title": "Delete workspace",
"com.affine.workspaceLeave.button.cancel": "Cancel",
"com.affine.workspaceLeave.button.leave": "Leave",
"com.affine.workspaceLeave.description": "After you leave, you will no longer be able to access the contents of this workspace.",
"com.affine.workspaceList.addWorkspace.create": "Create workspace", "com.affine.workspaceList.addWorkspace.create": "Create workspace",
"com.affine.workspaceList.addWorkspace.create-cloud": "Create cloud workspace", "com.affine.workspaceList.addWorkspace.create-cloud": "Create cloud workspace",
"com.affine.workspaceList.workspaceListType.cloud": "Cloud sync", "com.affine.workspaceList.workspaceListType.cloud": "Cloud sync",
@ -1582,34 +1256,15 @@
"com.affine.workspaceSubPath.all": "All docs", "com.affine.workspaceSubPath.all": "All docs",
"com.affine.workspaceSubPath.trash": "Trash", "com.affine.workspaceSubPath.trash": "Trash",
"com.affine.workspaceSubPath.trash.empty-description": "Deleted docs will appear here.", "com.affine.workspaceSubPath.trash.empty-description": "Deleted docs will appear here.",
"com.affine.workspaceType.cloud": "Cloud workspace",
"com.affine.workspaceType.joined": "Joined workspace",
"com.affine.workspaceType.local": "Local workspace",
"com.affine.workspaceType.offline": "Available offline",
"com.affine.write_with_a_blank_page": "Write with a blank page", "com.affine.write_with_a_blank_page": "Write with a blank page",
"com.affine.yesterday": "Yesterday", "com.affine.yesterday": "Yesterday",
"core": "core", "core": "core",
"dark": "Dark", "dark": "Dark",
"emptyAllPages": "Click on the <1></1> button to create your first doc.",
"emptyAllPagesClient": "Click on the <1></1> button Or press <3>{{shortcut}}</3> to create your first doc.",
"emptyFavorite": "Click Add to favorites and the doc will appear here.",
"emptySharedPages": "Shared docs will appear here.",
"emptyTrash": "Click Add to trash and the doc will appear here.",
"frameless": "Frameless",
"invited you to join": "invited you to join", "invited you to join": "invited you to join",
"is a Cloud Workspace": "is a cloud workspace.",
"is a Local Workspace": "is a local workspace.",
"light": "Light", "light": "Light",
"login success": "Login success",
"mobile device": "Looks like you are browsing on a mobile device.",
"mobile device description": "We are still working on mobile support and recommend you use a desktop device.",
"others": "Others", "others": "Others",
"recommendBrowser": " We recommend the <1>Chrome</1> browser for optimal experience.", "recommendBrowser": " We recommend the <1>Chrome</1> browser for optimal experience.",
"restored": "{{title}} restored",
"still designed": "(This page is still being designed.)",
"system": "System", "system": "System",
"unnamed": "unnamed", "unnamed": "unnamed",
"upgradeBrowser": "Please upgrade to the latest version of Chrome for the best experience.", "upgradeBrowser": "Please upgrade to the latest version of Chrome for the best experience."
"will be moved to Trash": "{{title}} will be moved to trash",
"will delete member": "will delete member"
} }

View File

@ -1,12 +1,8 @@
// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
// Run `yarn run download-resources` to regenerate.
// If you need to update the code, please edit `i18n/src/scripts/download.ts` inside your project.
import ar from './ar.json'; import ar from './ar.json';
import ca from './ca.json'; import ca from './ca.json';
import da from './da.json'; import da from './da.json';
import de from './de.json'; import de from './de.json';
import en from './en.json'; import en from './en.json';
import en_US from './en-US.json';
import es from './es.json'; import es from './es.json';
import es_AR from './es-AR.json'; import es_AR from './es-AR.json';
import es_CL from './es-CL.json'; import es_CL from './es-CL.json';
@ -24,203 +20,155 @@ import zh_Hant from './zh-Hant.json';
export const LOCALES = [ export const LOCALES = [
{ {
id: 1000040010,
name: 'Korean (South Korea)', name: 'Korean (South Korea)',
tag: 'ko', tag: 'ko',
originalName: '한국어(대한민국)', originalName: '한국어(대한민국)',
flagEmoji: '🇰🇷', flagEmoji: '🇰🇷',
base: false, base: false,
completeRate: 0.7,
res: ko, res: ko,
}, },
{ {
id: 1000040021,
name: 'Portuguese (Brazil)', name: 'Portuguese (Brazil)',
tag: 'pt-BR', tag: 'pt-BR',
originalName: 'português (Brasil)', originalName: 'português (Brasil)',
flagEmoji: '🇧🇷', flagEmoji: '🇧🇷',
base: false, base: false,
completeRate: 0.956,
res: pt_BR, res: pt_BR,
}, },
{ {
id: 1000040001,
name: 'English', name: 'English',
tag: 'en', tag: 'en',
originalName: 'English', originalName: 'English',
flagEmoji: '🇬🇧', flagEmoji: '🇬🇧',
base: true, base: true,
completeRate: 1,
res: en, res: en,
}, },
{ {
id: 1000040003,
name: 'Traditional Chinese', name: 'Traditional Chinese',
tag: 'zh-Hant', tag: 'zh-Hant',
originalName: '繁體中文', originalName: '繁體中文',
flagEmoji: '🇭🇰', flagEmoji: '🇭🇰',
base: false, base: false,
completeRate: 0.304,
res: zh_Hant, res: zh_Hant,
}, },
{ {
id: 1000040004,
name: 'Simplified Chinese', name: 'Simplified Chinese',
tag: 'zh-Hans', tag: 'zh-Hans',
originalName: '简体中文', originalName: '简体中文',
flagEmoji: '🇨🇳', flagEmoji: '🇨🇳',
base: false, base: false,
completeRate: 0.966,
res: zh_Hans, res: zh_Hans,
}, },
{ {
id: 1000040006,
name: 'French', name: 'French',
tag: 'fr', tag: 'fr',
originalName: 'français', originalName: 'français',
flagEmoji: '🇫🇷', flagEmoji: '🇫🇷',
base: false, base: false,
completeRate: 0.789,
res: fr, res: fr,
}, },
{ {
id: 1000040008,
name: 'Spanish', name: 'Spanish',
tag: 'es', tag: 'es',
originalName: 'español', originalName: 'español',
flagEmoji: '🇪🇸', flagEmoji: '🇪🇸',
base: false, base: false,
completeRate: 0.244,
res: es, res: es,
}, },
{ {
id: 1000040009,
name: 'German', name: 'German',
tag: 'de', tag: 'de',
originalName: 'Deutsch', originalName: 'Deutsch',
flagEmoji: '🇩🇪', flagEmoji: '🇩🇪',
base: false, base: false,
completeRate: 0.247,
res: de, res: de,
}, },
{ {
id: 1000040011,
name: 'Russian', name: 'Russian',
tag: 'ru', tag: 'ru',
originalName: 'русский', originalName: 'русский',
flagEmoji: '🇷🇺', flagEmoji: '🇷🇺',
base: false, base: false,
completeRate: 0.855,
res: ru, res: ru,
}, },
{ {
id: 1000040014,
name: 'Japanese', name: 'Japanese',
tag: 'ja', tag: 'ja',
originalName: '日本語', originalName: '日本語',
flagEmoji: '🇯🇵', flagEmoji: '🇯🇵',
base: false, base: false,
completeRate: 0.37,
res: ja, res: ja,
}, },
{ {
id: 1000040023,
name: 'Italian', name: 'Italian',
tag: 'it', tag: 'it',
originalName: 'italiano', originalName: 'italiano',
flagEmoji: '🇮🇹', flagEmoji: '🇮🇹',
base: false, base: false,
completeRate: 0.001,
res: it, res: it,
}, },
{ {
id: 1000070001,
name: 'Catalan', name: 'Catalan',
tag: 'ca', tag: 'ca',
originalName: 'català', originalName: 'català',
flagEmoji: '🇦🇩', flagEmoji: '🇦🇩',
base: false, base: false,
completeRate: 0.09,
res: ca, res: ca,
}, },
{ {
id: 1000074001,
name: 'Danish', name: 'Danish',
tag: 'da', tag: 'da',
originalName: 'dansk', originalName: 'dansk',
flagEmoji: '🇩🇰', flagEmoji: '🇩🇰',
base: false, base: false,
completeRate: 0.086,
res: da, res: da,
}, },
{ {
id: 1000074002,
name: 'English (United States)',
tag: 'en-US',
originalName: 'English (United States)',
flagEmoji: '🇺🇸',
base: false,
completeRate: 0.009,
res: en_US,
},
{
id: 1000074003,
name: 'Spanish (Chile)', name: 'Spanish (Chile)',
tag: 'es-CL', tag: 'es-CL',
originalName: 'español (Chile)', originalName: 'español (Chile)',
flagEmoji: '🇨🇱', flagEmoji: '🇨🇱',
base: false, base: false,
completeRate: 0.023,
res: es_CL, res: es_CL,
}, },
{ {
id: 1000074004,
name: 'Hindi', name: 'Hindi',
tag: 'hi', tag: 'hi',
originalName: 'हिन्दी', originalName: 'हिन्दी',
flagEmoji: '🇮🇳', flagEmoji: '🇮🇳',
base: false, base: false,
completeRate: 0.014,
res: hi, res: hi,
}, },
{ {
id: 1000134010,
name: 'Swedish (Sweden)', name: 'Swedish (Sweden)',
tag: 'sv-SE', tag: 'sv-SE',
originalName: 'svenska (Sverige)', originalName: 'svenska (Sverige)',
flagEmoji: '🇸🇪', flagEmoji: '🇸🇪',
base: false, base: false,
completeRate: 0.053,
res: sv_SE, res: sv_SE,
}, },
{ {
id: 1000134011,
name: 'Spanish (Argentina)', name: 'Spanish (Argentina)',
tag: 'es-AR', tag: 'es-AR',
originalName: 'español (Argentina)', originalName: 'español (Argentina)',
flagEmoji: '🇦🇷', flagEmoji: '🇦🇷',
base: false, base: false,
completeRate: 0.084,
res: es_AR, res: es_AR,
}, },
{ {
id: 1000134012,
name: 'Urdu', name: 'Urdu',
tag: 'ur', tag: 'ur',
originalName: 'اردو', originalName: 'اردو',
flagEmoji: '🇵🇰', flagEmoji: '🇵🇰',
base: false, base: false,
completeRate: 0.019,
res: ur, res: ur,
}, },
{ {
id: 1000134005,
name: 'Arabic', name: 'Arabic',
tag: 'ar', tag: 'ar',
originalName: 'العربية', originalName: 'العربية',
flagEmoji: '🇸🇦', flagEmoji: '🇸🇦',
base: false, base: false,
completeRate: 0.87,
res: ar, res: ar,
}, },
] as const; ] as const;

View File

@ -74,8 +74,7 @@ test('allow creation of filters by favorite', async ({ page }) => {
await openHomePage(page); await openHomePage(page);
await waitForEditorLoad(page); await waitForEditorLoad(page);
await clickSideBarAllPageButton(page); await clickSideBarAllPageButton(page);
// playwright first language is en-US await createFirstFilter(page, 'Favourited');
await createFirstFilter(page, 'Favorited');
await page await page
.locator('[data-testid="filter-arg"]', { hasText: 'true' }) .locator('[data-testid="filter-arg"]', { hasText: 'true' })
.locator('div') .locator('div')

View File

@ -563,14 +563,11 @@ __metadata:
resolution: "@affine/i18n@workspace:packages/frontend/i18n" resolution: "@affine/i18n@workspace:packages/frontend/i18n"
dependencies: dependencies:
"@magic-works/i18n-codegen": "npm:^0.6.0" "@magic-works/i18n-codegen": "npm:^0.6.0"
"@types/prettier": "npm:^3.0.0"
dayjs: "npm:^1.11.11" dayjs: "npm:^1.11.11"
glob: "npm:^11.0.0"
i18next: "npm:^23.11.1" i18next: "npm:^23.11.1"
prettier: "npm:^3.2.5"
react: "npm:^18.2.0" react: "npm:^18.2.0"
react-i18next: "npm:^15.0.0" react-i18next: "npm:^15.0.0"
ts-node: "npm:^10.9.2"
typescript: "npm:^5.4.5"
undici: "npm:^6.12.0" undici: "npm:^6.12.0"
vitest: "npm:2.1.1" vitest: "npm:2.1.1"
languageName: unknown languageName: unknown
@ -12655,7 +12652,6 @@ __metadata:
peerDependencies: peerDependencies:
"@affine/templates": "*" "@affine/templates": "*"
"@blocksuite/presets": "*" "@blocksuite/presets": "*"
async-call-rpc: "*"
electron: "*" electron: "*"
react: "*" react: "*"
yjs: ^13 yjs: ^13
@ -12664,8 +12660,6 @@ __metadata:
optional: true optional: true
"@blocksuite/presets": "@blocksuite/presets":
optional: true optional: true
async-call-rpc:
optional: true
electron: electron:
optional: true optional: true
react: react:
@ -13494,15 +13488,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/prettier@npm:^3.0.0":
version: 3.0.0
resolution: "@types/prettier@npm:3.0.0"
dependencies:
prettier: "npm:*"
checksum: 10/a2a512d304e5bcf78f38089dc88ad19215e6ab871d435a17aef3ce538a63b07c0e359c18db23989dc1ed9fff96d99eee1f680416080184df5c7e0e3bf767e165
languageName: node
linkType: hard
"@types/prop-types@npm:*": "@types/prop-types@npm:*":
version: 15.7.13 version: 15.7.13
resolution: "@types/prop-types@npm:15.7.13" resolution: "@types/prop-types@npm:15.7.13"
@ -27759,7 +27744,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"prettier@npm:*, prettier@npm:^3.2.5, prettier@npm:^3.3.3": "prettier@npm:^3.2.5, prettier@npm:^3.3.3":
version: 3.3.3 version: 3.3.3
resolution: "prettier@npm:3.3.3" resolution: "prettier@npm:3.3.3"
bin: bin: