Implementation:Langgenius Dify I18n Common Translations
| Knowledge Sources | |
|---|---|
| Domains | Internationalization, Frontend |
| Last Updated | 2026-02-08 00:00 GMT |
Overview
Concrete i18n translation bundle providing localized UI strings for the common section of the Dify frontend.
Description
This translation namespace contains all shared, cross-cutting user-facing strings used throughout the Dify web application, including account management, action messages, API status messages, API-based extensions, application menus, app mode labels, avatar management, chat UI, compliance labels, data source configuration (Notion, website), dataset menus, dynamic selects, environment badges, error messages, feedback forms, file/image uploaders, integrations, language/timezone settings, license labels, member management, navigation menus, model configuration and provider settings, general operations (CRUD, clipboard, search), pagination, placeholder text, plugin configuration, prompt editor, provider authentication, application settings, tags, theme preferences, voice language labels, and voice input controls. The bundle is a flat JSON key-value map where keys use dot-delimited hierarchical naming (e.g., "account.email") and values are the translated strings, optionally containing Template:Interpolation placeholders.
The canonical (source-of-truth) locale is en-US. All other locales mirror the same key structure with translated values.
Usage
Import translation keys from this namespace via the i18next hook:
import { useTranslation } from 'react-i18next'
const { t } = useTranslation()
t('common.operation.save') // Returns localized string
Code Reference
Source Location
- Repository: Langgenius_Dify
- Canonical File: web/i18n/en-US/common.json
Locale Variants
| Locale | File | Lines |
|---|---|---|
| en-US | web/i18n/en-US/common.json | 629 |
| fa-IR | web/i18n/fa-IR/common.json | 629 |
| fr-FR | web/i18n/fr-FR/common.json | 629 |
| ro-RO | web/i18n/ro-RO/common.json | 629 |
| vi-VN | web/i18n/vi-VN/common.json | 629 |
| zh-Hant | web/i18n/zh-Hant/common.json | 629 |
Key Structure
The canonical en-US file contains 627 translation keys organized under the following top-level prefixes:
| Prefix | Description | Example Key |
|---|---|---|
| about | Application version and update info | "about.changeLog", "about.updateNow" |
| account | User account management | "account.email", "account.password", "account.changeEmail.title" |
| actionMsg | Action result messages | "actionMsg.copySuccessfully", "actionMsg.modifiedSuccessfully" |
| api | API action status messages | "api.actionFailed", "api.saved" |
| apiBasedExtension | API extension configuration | "apiBasedExtension.add", "apiBasedExtension.modal.title" |
| appMenus | Application navigation menus | "appMenus.overview", "appMenus.promptEng" |
| appModes | Application mode labels | "appModes.chatApp", "appModes.completionApp" |
| avatar | Avatar management | "avatar.deleteTitle", "avatar.deleteDescription" |
| chat | Chat interface strings | "chat.citation.title", "chat.thinking", "chat.resend" |
| compliance | Compliance certification labels | "compliance.gdpr", "compliance.soc2Type2" |
| dataSource | Data source configuration | "dataSource.notion.title", "dataSource.website.title" |
| datasetMenus | Knowledge base navigation menus | "datasetMenus.documents", "datasetMenus.settings" |
| dynamicSelect | Dynamic select component | "dynamicSelect.loading", "dynamicSelect.noData" |
| environment | Environment badge labels | "environment.development", "environment.testing" |
| error | Generic error label | "error" |
| errorMsg | Validation error messages | "errorMsg.fieldRequired", "errorMsg.urlError" |
| feedback | Feedback form strings | "feedback.title", "feedback.placeholder" |
| fileUploader | File upload component | "fileUploader.uploadFromComputer", "fileUploader.pasteFileLink" |
| imageInput | Image input component | "imageInput.browse", "imageInput.supportedFormats" |
| imageUploader | Image upload component | "imageUploader.imageUpload", "imageUploader.pasteImageLink" |
| integrations | Third-party integrations | "integrations.github", "integrations.google" |
| label | Generic label helpers | "label.optional" |
| language | Language and timezone settings | "language.displayLanguage", "language.timezone" |
| license | License status labels | "license.expiring", "license.unlimited" |
| loading | Loading indicator | "loading" |
| members | Team member management | "members.invite", "members.role", "members.transferOwnership" |
| menus | Main navigation menus | "menus.apps", "menus.datasets", "menus.plugins" |
| model | Model configuration and parameters | "model.params.temperature", "model.tone.Creative" |
| modelName | Model display names | "modelName.gpt-4", "modelName.claude-2" |
| modelProvider | Model provider management | "modelProvider.addModel", "modelProvider.loadBalancing" |
| noData | Empty state label | "noData" |
| operation | Common operations (CRUD, clipboard) | "operation.save", "operation.delete", "operation.copy" |
| pagination | Pagination controls | "pagination.perPage" |
| placeholder | Generic placeholder text | "placeholder.input", "placeholder.search" |
| plugin | Plugin configuration | "plugin.serpapi.apiKey" |
| promptEditor | Prompt editor components | "promptEditor.context.item.title", "promptEditor.variable.modal.add" |
| provider | Provider authentication | "provider.addKey", "provider.invalidKey" |
| settings | Application settings navigation | "settings.account", "settings.members", "settings.provider" |
| tag | Tag management | "tag.addTag", "tag.manageTags" |
| theme | Theme preference labels | "theme.light", "theme.dark", "theme.auto" |
| unit | Unit labels | "unit.char" |
| userProfile | User profile menu items | "userProfile.settings", "userProfile.logout" |
| voice | Voice language labels | "voice.language.enUS", "voice.language.zhHans" |
| voiceInput | Voice input controls | "voiceInput.speaking", "voiceInput.converting" |
| you | Current user label | "you" |
{
"about.changeLog": "Changelog",
"account.email": "Email",
"actionMsg.copySuccessfully": "Copied successfully",
"api.saved": "Saved",
"apiBasedExtension.add": "Add API Extension",
"appMenus.overview": "Monitoring",
"appModes.chatApp": "Chat App",
"avatar.deleteTitle": "Remove Avatar",
"chat.thinking": "Thinking...",
"compliance.gdpr": "GDPR DPA",
"dataSource.notion.title": "Notion",
"datasetMenus.documents": "Documents",
"dynamicSelect.loading": "Loading options...",
"environment.development": "DEVELOPMENT",
"error": "Error",
"errorMsg.fieldRequired": "{{field}} is required",
"feedback.title": "Provide Feedback",
"fileUploader.uploadFromComputer": "Local upload",
"imageInput.browse": "browse",
"imageUploader.imageUpload": "Image Upload",
"integrations.github": "GitHub",
"label.optional": "(optional)",
"language.displayLanguage": "Display Language",
"license.unlimited": "Unlimited",
"loading": "Loading",
"members.invite": "Add",
"menus.apps": "Studio",
"model.params.temperature": "Temperature",
"modelName.gpt-4": "GPT-4",
"modelProvider.addModel": "Add Model",
"noData": "No data",
"operation.save": "Save",
"pagination.perPage": "Items per page",
"placeholder.search": "Search...",
"plugin.serpapi.apiKey": "API Key",
"promptEditor.context.item.title": "Context",
"provider.addKey": "Add Key",
"settings.account": "My account",
"tag.addTag": "Add tags",
"theme.light": "light",
"unit.char": "chars",
"userProfile.settings": "Settings",
"voice.language.enUS": "English",
"voiceInput.speaking": "Speak now...",
"you": "You"
}
Import
// Keys from this namespace are accessed via useTranslation
import { useTranslation } from 'react-i18next'
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| key | string | Yes | Dot-delimited translation key (e.g., "operation.save") |
| interpolation | Record<string, string> | No | Values for Template:Placeholder replacements (e.g., Template:Field, Template:Count, Template:Size) |
Outputs
| Name | Type | Description |
|---|---|---|
| translated string | string | The localized string for the current locale |
Usage Examples
import { useTranslation } from 'react-i18next'
function MyComponent() {
const { t } = useTranslation()
return <span>{t('common.operation.save')}</span>
}
// With interpolation
function UploadLimit({ size }: { size: string }) {
const { t } = useTranslation()
return <span>{t('common.imageUploader.uploadFromComputerLimit', { size })}</span>
}