From 3b8fc9c9b685129946f4c1694ddf60f521cefd8e Mon Sep 17 00:00:00 2001 From: yyh <92089059+lyzno1@users.noreply.github.com> Date: Fri, 18 Sep 2026 04:13:14 +0000 Subject: [PATCH] refactor(i18n): colocate runtime and locale resources (#42482) --- .github/scripts/generate-i18n-changes.mjs | 5 +- .github/workflows/post-merge.yml | 4 +- .github/workflows/translate-i18n-claude.yml | 22 ++-- .github/workflows/trigger-i18n-sync.yml | 6 +- README.md | 2 +- docs/ar-SA/README.md | 2 +- docs/bn-BD/README.md | 2 +- docs/de-DE/README.md | 2 +- docs/es-ES/README.md | 2 +- docs/fr-FR/README.md | 2 +- docs/hi-IN/README.md | 2 +- docs/it-IT/README.md | 2 +- docs/ja-JP/README.md | 2 +- docs/ko-KR/README.md | 2 +- docs/pt-BR/README.md | 2 +- docs/sl-SI/README.md | 2 +- docs/tlh/README.md | 2 +- docs/tr-TR/README.md | 2 +- docs/vi-VN/README.md | 2 +- docs/zh-CN/README.md | 2 +- docs/zh-TW/README.md | 2 +- eslint.config.mjs | 2 +- knip.config.ts | 2 +- oxlint-suppressions.json | 2 +- web/.storybook/preview.tsx | 2 +- web/AGENTS.md | 2 +- web/__tests__/app-star-i18n.test.ts | 2 +- web/__tests__/i18n-upload-features.test.ts | 2 +- .../[appId]/access-config/page.tsx | 2 +- .../__tests__/document-title.spec.tsx | 4 +- .../[[...slug]]/__tests__/metadata.spec.ts | 4 +- .../integrations/[[...slug]]/layout.tsx | 2 +- .../creator/[uniqueHandle]/page.tsx | 2 +- .../skills/__tests__/metadata.spec.ts | 4 +- .../[[...category]]/__tests__/page.spec.tsx | 2 +- .../templates/[[...category]]/page.tsx | 2 +- web/app/__tests__/layout.spec.tsx | 2 +- web/app/__tests__/route-metadata.spec.ts | 4 +- .../components/app/access-config/index.tsx | 2 +- .../__tests__/csv-downloader.spec.tsx | 4 +- .../csv-downloader.tsx | 2 +- .../header-opts/__tests__/index.spec.tsx | 4 +- .../app/annotation/header-opts/index.tsx | 2 +- .../publish-with-multiple-model.tsx | 2 +- .../agent-tools/setting-built-in-tool.tsx | 2 +- .../generator-reflow.browser.spec.tsx | 4 +- .../select-dataset/__tests__/index.spec.tsx | 10 -- .../external-data-tool-modal-utils.spec.ts | 4 +- .../tools/external-data-tool-modal-utils.ts | 2 +- web/app/components/app/deploy/index.tsx | 2 +- .../app/overview/settings/index.tsx | 2 +- .../__tests__/hooks.spec.tsx | 2 +- .../base/chat/chat-with-history/hooks.tsx | 2 +- .../answer/agent-roster-response-content.tsx | 4 +- .../__tests__/utils.spec.ts | 2 +- .../chat/answer/human-input-content/utils.ts | 2 +- .../embedded-chatbot/__tests__/hooks.spec.tsx | 8 +- .../base/chat/embedded-chatbot/hooks.tsx | 4 +- .../__tests__/form-generation.spec.tsx | 2 +- .../moderation/moderation-setting-modal.tsx | 2 +- .../text-to-speech/__tests__/index.spec.tsx | 2 +- .../__tests__/param-config-content.spec.tsx | 2 +- .../text-to-speech/index.tsx | 2 +- .../text-to-speech/param-config-content.tsx | 2 +- web/app/components/base/form/types.ts | 2 +- .../new-audio-button/__tests__/index.spec.tsx | 2 +- .../resize-handle/__tests__/index.spec.tsx | 2 +- .../billing/pricing/__tests__/footer.spec.tsx | 2 +- web/app/components/billing/pricing/footer.tsx | 2 +- .../datasets/access-config/index.tsx | 2 +- .../list/built-in-pipeline-list.tsx | 2 +- .../file-uploader/__tests__/index.spec.tsx | 2 +- .../hooks/__tests__/use-file-upload.spec.tsx | 2 +- .../file-uploader/hooks/use-file-upload.ts | 2 +- .../datasets/create/step-two/index.tsx | 2 +- .../language-select/__tests__/index.spec.tsx | 2 +- .../create/step-two/language-select/index.tsx | 2 +- .../__tests__/use-local-file-upload.spec.tsx | 2 +- .../__tests__/csv-downloader.spec.tsx | 2 +- .../detail/batch-modal/csv-downloader.tsx | 2 +- web/app/components/explore/category.tsx | 2 +- .../actions/__tests__/plugin.spec.ts | 4 +- .../commands/__tests__/language.spec.ts | 2 +- .../actions/commands/__tests__/slash.spec.tsx | 2 +- .../actions/commands/language.tsx | 2 +- .../actions/commands/slash-provider.tsx | 2 +- .../goto-anything/actions/plugin.tsx | 2 +- .../permission-set-modal/index.tsx | 2 +- .../resource-access-rule-section.tsx | 2 +- .../account-setting/members-page/index.tsx | 2 +- .../invite-modal/role-selector.tsx | 2 +- .../member-details-modal/index.tsx | 2 +- .../model-provider-page/hooks.ts | 2 +- .../model-provider-page/model-icon/index.tsx | 2 +- .../model-provider-page/model-name/index.tsx | 2 +- .../model-selector/popup-item.tsx | 2 +- .../model-selector/popup.tsx | 2 +- .../provider-added-card/index.tsx | 2 +- .../provider-icon/index.tsx | 2 +- .../permissions-page/index.tsx | 2 +- .../permissions-page/role-modal/index.tsx | 2 +- .../preference-page/__tests__/index.spec.tsx | 4 +- .../account-setting/preference-page/index.tsx | 6 +- .../workspace-role-checkbox-list.tsx | 2 +- .../integrations/tool-provider-card.tsx | 2 +- .../plugins/card/__tests__/index.spec.tsx | 4 +- web/app/components/plugins/card/index.tsx | 2 +- .../__tests__/server-entry.spec.tsx | 2 +- .../plugins/marketplace/home/home-guide.tsx | 2 +- .../home/marketplace-search-autocomplete.tsx | 2 +- .../components/plugins/marketplace/index.tsx | 2 +- ...st-with-collection-layout.browser.spec.tsx | 4 +- .../__tests__/list-with-collection.spec.tsx | 4 +- .../plugins/marketplace/list/card-wrapper.tsx | 2 +- .../marketplace/list/list-with-collection.tsx | 2 +- .../plugins/marketplace/templates/index.tsx | 4 +- .../__tests__/tts-params-panel.spec.tsx | 2 +- .../model-selector/tts-params-panel.tsx | 2 +- .../plugin-detail-panel/strategy-detail.tsx | 4 +- .../plugin-detail-panel/strategy-item.tsx | 4 +- .../__tests__/index.spec.tsx | 4 +- .../__tests__/plugins-panel.spec.tsx | 4 +- .../components/error-plugin-item.tsx | 2 +- .../plugin-tasks/components/plugin-item.tsx | 2 +- .../components/plugin-section.tsx | 2 +- .../plugin-page/plugins-panel-utils.ts | 2 +- .../plugins/plugin-page/plugins-panel.tsx | 2 +- .../__tests__/tool-item.spec.tsx | 4 +- .../auto-update-setting/tool-item.tsx | 2 +- web/app/components/plugins/types.ts | 4 +- web/app/components/provider/i18n-server.tsx | 2 +- web/app/components/provider/i18n.tsx | 4 +- .../use-text-generation-app-state.spec.ts | 2 +- .../hooks/use-text-generation-app-state.ts | 2 +- .../edit-custom-collection-modal/test-api.tsx | 2 +- .../components/tools/mcp/detail/tool-item.tsx | 2 +- .../__tests__/custom-create-card.spec.tsx | 4 +- .../tools/provider/__tests__/detail.spec.tsx | 4 +- .../provider/__tests__/tool-item.spec.tsx | 4 +- web/app/components/tools/provider/detail.tsx | 2 +- .../components/tools/provider/tool-item.tsx | 2 +- .../block-selector/featured-tools.tsx | 2 +- .../block-selector/featured-triggers.tsx | 2 +- .../workflow/nodes/agent/default.ts | 2 +- .../__tests__/integration.spec.tsx | 2 +- .../__tests__/panel.spec.tsx | 2 +- .../nodes/document-extractor/panel.tsx | 2 +- .../workflow/nodes/knowledge-base/node.tsx | 2 +- web/app/device/_header.tsx | 4 +- web/app/device/utils/error-copy.ts | 2 +- web/app/layout.tsx | 2 +- web/app/route-metadata.ts | 4 +- web/app/signin/__tests__/_header.spec.tsx | 4 +- web/app/signin/_header.tsx | 4 +- .../invite-settings/__tests__/page.spec.tsx | 4 +- web/app/signin/invite-settings/page.tsx | 8 +- web/app/signin/one-more-step.tsx | 2 +- web/context/i18n.spec.ts | 8 +- web/context/i18n.ts | 6 +- .../agent-detail/access-config/page.tsx | 2 +- .../__tests__/delete-agent-dialog.spec.tsx | 2 +- web/features/home/page.tsx | 2 +- .../__tests__/crawl-selection-form.spec.tsx | 4 +- .../new-rag/__tests__/sources-page.spec.tsx | 2 +- web/hooks/use-format-time-from-now.ts | 2 +- web/hooks/use-i18n.ts | 2 +- web/{i18n-config => i18n}/README.md | 8 +- .../__tests__/client-locale.spec.ts | 0 .../__tests__/load-resource.spec.ts | 0 .../__tests__/metadata.spec.ts | 0 .../__tests__/plural-selector.spec.ts | 2 +- .../__tests__/server.spec.ts | 0 web/{i18n-config => i18n}/client.ts | 0 web/{i18n-config => i18n}/index.ts | 0 web/{i18n-config => i18n}/language.ts | 0 web/{i18n-config => i18n}/languages.ts | 0 web/{i18n-config => i18n}/lib.client.ts | 0 web/{i18n-config => i18n}/lib.server.ts | 0 web/{i18n-config => i18n}/load-resource.ts | 0 .../locale-resources/ar-TN.ts | 2 +- .../locale-resources/az-AZ.ts | 2 +- .../locale-resources/de-DE.ts | 2 +- .../locale-resources/en-US.ts | 2 +- .../locale-resources/es-ES.ts | 2 +- .../locale-resources/fa-IR.ts | 2 +- .../locale-resources/fr-FR.ts | 2 +- .../locale-resources/hi-IN.ts | 2 +- .../locale-resources/id-ID.ts | 2 +- .../locale-resources/it-IT.ts | 2 +- .../locale-resources/ja-JP.ts | 2 +- .../locale-resources/ko-KR.ts | 2 +- .../locale-resources/lo-LA.ts | 2 +- .../locale-resources/nl-NL.ts | 2 +- .../locale-resources/pl-PL.ts | 2 +- .../locale-resources/pt-BR.ts | 2 +- .../locale-resources/ro-RO.ts | 2 +- .../locale-resources/ru-RU.ts | 2 +- .../locale-resources/sl-SI.ts | 2 +- .../locale-resources/th-TH.ts | 2 +- .../locale-resources/tr-TR.ts | 2 +- .../locale-resources/uk-UA.ts | 2 +- .../locale-resources/vi-VN.ts | 2 +- .../locale-resources/zh-Hans.ts | 2 +- .../locale-resources/zh-Hant.ts | 2 +- web/{i18n-config => i18n}/locale.ts | 0 web/i18n/{ => locales}/ar-TN/agent-v-2.json | 0 .../{ => locales}/ar-TN/app-annotation.json | 0 web/i18n/{ => locales}/ar-TN/app-api.json | 0 web/i18n/{ => locales}/ar-TN/app-debug.json | 0 web/i18n/{ => locales}/ar-TN/app-log.json | 0 .../{ => locales}/ar-TN/app-overview.json | 0 web/i18n/{ => locales}/ar-TN/app.json | 0 web/i18n/{ => locales}/ar-TN/billing.json | 0 web/i18n/{ => locales}/ar-TN/common.json | 0 web/i18n/{ => locales}/ar-TN/custom.json | 0 .../{ => locales}/ar-TN/dataset-creation.json | 0 .../ar-TN/dataset-documents.json | 0 .../ar-TN/dataset-hit-testing.json | 0 .../{ => locales}/ar-TN/dataset-pipeline.json | 0 .../{ => locales}/ar-TN/dataset-settings.json | 0 web/i18n/{ => locales}/ar-TN/dataset.json | 0 web/i18n/{ => locales}/ar-TN/deployments.json | 0 web/i18n/{ => locales}/ar-TN/device-flow.json | 0 web/i18n/{ => locales}/ar-TN/education.json | 0 web/i18n/{ => locales}/ar-TN/explore.json | 0 web/i18n/{ => locales}/ar-TN/layout.json | 0 web/i18n/{ => locales}/ar-TN/login.json | 0 web/i18n/{ => locales}/ar-TN/oauth.json | 0 .../{ => locales}/ar-TN/permission-keys.json | 0 web/i18n/{ => locales}/ar-TN/permission.json | 0 web/i18n/{ => locales}/ar-TN/pipeline.json | 0 web/i18n/{ => locales}/ar-TN/plugin-tags.json | 0 .../{ => locales}/ar-TN/plugin-trigger.json | 0 web/i18n/{ => locales}/ar-TN/plugin.json | 0 web/i18n/{ => locales}/ar-TN/register.json | 0 web/i18n/{ => locales}/ar-TN/run-log.json | 0 web/i18n/{ => locales}/ar-TN/share.json | 0 web/i18n/{ => locales}/ar-TN/skill.json | 0 web/i18n/{ => locales}/ar-TN/snippet.json | 0 web/i18n/{ => locales}/ar-TN/time.json | 0 web/i18n/{ => locales}/ar-TN/tools.json | 0 web/i18n/{ => locales}/ar-TN/workflow.json | 0 web/i18n/{ => locales}/az-AZ/agent-v-2.json | 0 .../{ => locales}/az-AZ/app-annotation.json | 0 web/i18n/{ => locales}/az-AZ/app-api.json | 0 web/i18n/{ => locales}/az-AZ/app-debug.json | 0 web/i18n/{ => locales}/az-AZ/app-log.json | 0 .../{ => locales}/az-AZ/app-overview.json | 0 web/i18n/{ => locales}/az-AZ/app.json | 0 web/i18n/{ => locales}/az-AZ/billing.json | 0 web/i18n/{ => locales}/az-AZ/common.json | 0 web/i18n/{ => locales}/az-AZ/custom.json | 0 .../{ => locales}/az-AZ/dataset-creation.json | 0 .../az-AZ/dataset-documents.json | 0 .../az-AZ/dataset-hit-testing.json | 0 .../{ => locales}/az-AZ/dataset-pipeline.json | 0 .../{ => locales}/az-AZ/dataset-settings.json | 0 web/i18n/{ => locales}/az-AZ/dataset.json | 0 web/i18n/{ => locales}/az-AZ/deployments.json | 0 web/i18n/{ => locales}/az-AZ/device-flow.json | 0 web/i18n/{ => locales}/az-AZ/education.json | 0 web/i18n/{ => locales}/az-AZ/explore.json | 0 web/i18n/{ => locales}/az-AZ/layout.json | 0 web/i18n/{ => locales}/az-AZ/login.json | 0 web/i18n/{ => locales}/az-AZ/oauth.json | 0 .../{ => locales}/az-AZ/permission-keys.json | 0 web/i18n/{ => locales}/az-AZ/permission.json | 0 web/i18n/{ => locales}/az-AZ/pipeline.json | 0 web/i18n/{ => locales}/az-AZ/plugin-tags.json | 0 .../{ => locales}/az-AZ/plugin-trigger.json | 0 web/i18n/{ => locales}/az-AZ/plugin.json | 0 web/i18n/{ => locales}/az-AZ/register.json | 0 web/i18n/{ => locales}/az-AZ/run-log.json | 0 web/i18n/{ => locales}/az-AZ/share.json | 0 web/i18n/{ => locales}/az-AZ/skill.json | 0 web/i18n/{ => locales}/az-AZ/snippet.json | 0 web/i18n/{ => locales}/az-AZ/time.json | 0 web/i18n/{ => locales}/az-AZ/tools.json | 0 web/i18n/{ => locales}/az-AZ/workflow.json | 0 web/i18n/{ => locales}/de-DE/agent-v-2.json | 0 .../{ => locales}/de-DE/app-annotation.json | 0 web/i18n/{ => locales}/de-DE/app-api.json | 0 web/i18n/{ => locales}/de-DE/app-debug.json | 0 web/i18n/{ => locales}/de-DE/app-log.json | 0 .../{ => locales}/de-DE/app-overview.json | 0 web/i18n/{ => locales}/de-DE/app.json | 0 web/i18n/{ => locales}/de-DE/billing.json | 0 web/i18n/{ => locales}/de-DE/common.json | 0 web/i18n/{ => locales}/de-DE/custom.json | 0 .../{ => locales}/de-DE/dataset-creation.json | 0 .../de-DE/dataset-documents.json | 0 .../de-DE/dataset-hit-testing.json | 0 .../{ => locales}/de-DE/dataset-pipeline.json | 0 .../{ => locales}/de-DE/dataset-settings.json | 0 web/i18n/{ => locales}/de-DE/dataset.json | 0 web/i18n/{ => locales}/de-DE/deployments.json | 0 web/i18n/{ => locales}/de-DE/device-flow.json | 0 web/i18n/{ => locales}/de-DE/education.json | 0 web/i18n/{ => locales}/de-DE/explore.json | 0 web/i18n/{ => locales}/de-DE/layout.json | 0 web/i18n/{ => locales}/de-DE/login.json | 0 web/i18n/{ => locales}/de-DE/oauth.json | 0 .../{ => locales}/de-DE/permission-keys.json | 0 web/i18n/{ => locales}/de-DE/permission.json | 0 web/i18n/{ => locales}/de-DE/pipeline.json | 0 web/i18n/{ => locales}/de-DE/plugin-tags.json | 0 .../{ => locales}/de-DE/plugin-trigger.json | 0 web/i18n/{ => locales}/de-DE/plugin.json | 0 web/i18n/{ => locales}/de-DE/register.json | 0 web/i18n/{ => locales}/de-DE/run-log.json | 0 web/i18n/{ => locales}/de-DE/share.json | 0 web/i18n/{ => locales}/de-DE/skill.json | 0 web/i18n/{ => locales}/de-DE/snippet.json | 0 web/i18n/{ => locales}/de-DE/time.json | 0 web/i18n/{ => locales}/de-DE/tools.json | 0 web/i18n/{ => locales}/de-DE/workflow.json | 0 web/i18n/{ => locales}/en-US/agent-v-2.json | 0 .../{ => locales}/en-US/app-annotation.json | 0 web/i18n/{ => locales}/en-US/app-api.json | 0 web/i18n/{ => locales}/en-US/app-debug.json | 0 web/i18n/{ => locales}/en-US/app-log.json | 0 .../{ => locales}/en-US/app-overview.json | 0 web/i18n/{ => locales}/en-US/app.json | 0 web/i18n/{ => locales}/en-US/billing.json | 0 web/i18n/{ => locales}/en-US/common.json | 0 web/i18n/{ => locales}/en-US/custom.json | 0 .../{ => locales}/en-US/dataset-creation.json | 0 .../en-US/dataset-documents.json | 0 .../en-US/dataset-hit-testing.json | 0 .../{ => locales}/en-US/dataset-pipeline.json | 0 .../{ => locales}/en-US/dataset-settings.json | 0 web/i18n/{ => locales}/en-US/dataset.json | 0 web/i18n/{ => locales}/en-US/deployments.json | 0 web/i18n/{ => locales}/en-US/device-flow.json | 0 web/i18n/{ => locales}/en-US/education.json | 0 web/i18n/{ => locales}/en-US/explore.json | 0 web/i18n/{ => locales}/en-US/layout.json | 0 web/i18n/{ => locales}/en-US/login.json | 0 web/i18n/{ => locales}/en-US/oauth.json | 0 .../{ => locales}/en-US/permission-keys.json | 0 web/i18n/{ => locales}/en-US/permission.json | 0 web/i18n/{ => locales}/en-US/pipeline.json | 0 web/i18n/{ => locales}/en-US/plugin-tags.json | 0 .../{ => locales}/en-US/plugin-trigger.json | 0 web/i18n/{ => locales}/en-US/plugin.json | 0 web/i18n/{ => locales}/en-US/register.json | 0 web/i18n/{ => locales}/en-US/run-log.json | 0 web/i18n/{ => locales}/en-US/share.json | 0 web/i18n/{ => locales}/en-US/skill.json | 0 web/i18n/{ => locales}/en-US/snippet.json | 0 web/i18n/{ => locales}/en-US/time.json | 0 web/i18n/{ => locales}/en-US/tools.json | 0 web/i18n/{ => locales}/en-US/workflow.json | 0 web/i18n/{ => locales}/es-ES/agent-v-2.json | 0 .../{ => locales}/es-ES/app-annotation.json | 0 web/i18n/{ => locales}/es-ES/app-api.json | 0 web/i18n/{ => locales}/es-ES/app-debug.json | 0 web/i18n/{ => locales}/es-ES/app-log.json | 0 .../{ => locales}/es-ES/app-overview.json | 0 web/i18n/{ => locales}/es-ES/app.json | 0 web/i18n/{ => locales}/es-ES/billing.json | 0 web/i18n/{ => locales}/es-ES/common.json | 0 web/i18n/{ => locales}/es-ES/custom.json | 0 .../{ => locales}/es-ES/dataset-creation.json | 0 .../es-ES/dataset-documents.json | 0 .../es-ES/dataset-hit-testing.json | 0 .../{ => locales}/es-ES/dataset-pipeline.json | 0 .../{ => locales}/es-ES/dataset-settings.json | 0 web/i18n/{ => locales}/es-ES/dataset.json | 0 web/i18n/{ => locales}/es-ES/deployments.json | 0 web/i18n/{ => locales}/es-ES/device-flow.json | 0 web/i18n/{ => locales}/es-ES/education.json | 0 web/i18n/{ => locales}/es-ES/explore.json | 0 web/i18n/{ => locales}/es-ES/layout.json | 0 web/i18n/{ => locales}/es-ES/login.json | 0 web/i18n/{ => locales}/es-ES/oauth.json | 0 .../{ => locales}/es-ES/permission-keys.json | 0 web/i18n/{ => locales}/es-ES/permission.json | 0 web/i18n/{ => locales}/es-ES/pipeline.json | 0 web/i18n/{ => locales}/es-ES/plugin-tags.json | 0 .../{ => locales}/es-ES/plugin-trigger.json | 0 web/i18n/{ => locales}/es-ES/plugin.json | 0 web/i18n/{ => locales}/es-ES/register.json | 0 web/i18n/{ => locales}/es-ES/run-log.json | 0 web/i18n/{ => locales}/es-ES/share.json | 0 web/i18n/{ => locales}/es-ES/skill.json | 0 web/i18n/{ => locales}/es-ES/snippet.json | 0 web/i18n/{ => locales}/es-ES/time.json | 0 web/i18n/{ => locales}/es-ES/tools.json | 0 web/i18n/{ => locales}/es-ES/workflow.json | 0 web/i18n/{ => locales}/fa-IR/agent-v-2.json | 0 .../{ => locales}/fa-IR/app-annotation.json | 0 web/i18n/{ => locales}/fa-IR/app-api.json | 0 web/i18n/{ => locales}/fa-IR/app-debug.json | 0 web/i18n/{ => locales}/fa-IR/app-log.json | 0 .../{ => locales}/fa-IR/app-overview.json | 0 web/i18n/{ => locales}/fa-IR/app.json | 0 web/i18n/{ => locales}/fa-IR/billing.json | 0 web/i18n/{ => locales}/fa-IR/common.json | 0 web/i18n/{ => locales}/fa-IR/custom.json | 0 .../{ => locales}/fa-IR/dataset-creation.json | 0 .../fa-IR/dataset-documents.json | 0 .../fa-IR/dataset-hit-testing.json | 0 .../{ => locales}/fa-IR/dataset-pipeline.json | 0 .../{ => locales}/fa-IR/dataset-settings.json | 0 web/i18n/{ => locales}/fa-IR/dataset.json | 0 web/i18n/{ => locales}/fa-IR/deployments.json | 0 web/i18n/{ => locales}/fa-IR/device-flow.json | 0 web/i18n/{ => locales}/fa-IR/education.json | 0 web/i18n/{ => locales}/fa-IR/explore.json | 0 web/i18n/{ => locales}/fa-IR/layout.json | 0 web/i18n/{ => locales}/fa-IR/login.json | 0 web/i18n/{ => locales}/fa-IR/oauth.json | 0 .../{ => locales}/fa-IR/permission-keys.json | 0 web/i18n/{ => locales}/fa-IR/permission.json | 0 web/i18n/{ => locales}/fa-IR/pipeline.json | 0 web/i18n/{ => locales}/fa-IR/plugin-tags.json | 0 .../{ => locales}/fa-IR/plugin-trigger.json | 0 web/i18n/{ => locales}/fa-IR/plugin.json | 0 web/i18n/{ => locales}/fa-IR/register.json | 0 web/i18n/{ => locales}/fa-IR/run-log.json | 0 web/i18n/{ => locales}/fa-IR/share.json | 0 web/i18n/{ => locales}/fa-IR/skill.json | 0 web/i18n/{ => locales}/fa-IR/snippet.json | 0 web/i18n/{ => locales}/fa-IR/time.json | 0 web/i18n/{ => locales}/fa-IR/tools.json | 0 web/i18n/{ => locales}/fa-IR/workflow.json | 0 web/i18n/{ => locales}/fr-FR/agent-v-2.json | 0 .../{ => locales}/fr-FR/app-annotation.json | 0 web/i18n/{ => locales}/fr-FR/app-api.json | 0 web/i18n/{ => locales}/fr-FR/app-debug.json | 0 web/i18n/{ => locales}/fr-FR/app-log.json | 0 .../{ => locales}/fr-FR/app-overview.json | 0 web/i18n/{ => locales}/fr-FR/app.json | 0 web/i18n/{ => locales}/fr-FR/billing.json | 0 web/i18n/{ => locales}/fr-FR/common.json | 0 web/i18n/{ => locales}/fr-FR/custom.json | 0 .../{ => locales}/fr-FR/dataset-creation.json | 0 .../fr-FR/dataset-documents.json | 0 .../fr-FR/dataset-hit-testing.json | 0 .../{ => locales}/fr-FR/dataset-pipeline.json | 0 .../{ => locales}/fr-FR/dataset-settings.json | 0 web/i18n/{ => locales}/fr-FR/dataset.json | 0 web/i18n/{ => locales}/fr-FR/deployments.json | 0 web/i18n/{ => locales}/fr-FR/device-flow.json | 0 web/i18n/{ => locales}/fr-FR/education.json | 0 web/i18n/{ => locales}/fr-FR/explore.json | 0 web/i18n/{ => locales}/fr-FR/layout.json | 0 web/i18n/{ => locales}/fr-FR/login.json | 0 web/i18n/{ => locales}/fr-FR/oauth.json | 0 .../{ => locales}/fr-FR/permission-keys.json | 0 web/i18n/{ => locales}/fr-FR/permission.json | 0 web/i18n/{ => locales}/fr-FR/pipeline.json | 0 web/i18n/{ => locales}/fr-FR/plugin-tags.json | 0 .../{ => locales}/fr-FR/plugin-trigger.json | 0 web/i18n/{ => locales}/fr-FR/plugin.json | 0 web/i18n/{ => locales}/fr-FR/register.json | 0 web/i18n/{ => locales}/fr-FR/run-log.json | 0 web/i18n/{ => locales}/fr-FR/share.json | 0 web/i18n/{ => locales}/fr-FR/skill.json | 0 web/i18n/{ => locales}/fr-FR/snippet.json | 0 web/i18n/{ => locales}/fr-FR/time.json | 0 web/i18n/{ => locales}/fr-FR/tools.json | 0 web/i18n/{ => locales}/fr-FR/workflow.json | 0 web/i18n/{ => locales}/hi-IN/agent-v-2.json | 0 .../{ => locales}/hi-IN/app-annotation.json | 0 web/i18n/{ => locales}/hi-IN/app-api.json | 0 web/i18n/{ => locales}/hi-IN/app-debug.json | 0 web/i18n/{ => locales}/hi-IN/app-log.json | 0 .../{ => locales}/hi-IN/app-overview.json | 0 web/i18n/{ => locales}/hi-IN/app.json | 0 web/i18n/{ => locales}/hi-IN/billing.json | 0 web/i18n/{ => locales}/hi-IN/common.json | 0 web/i18n/{ => locales}/hi-IN/custom.json | 0 .../{ => locales}/hi-IN/dataset-creation.json | 0 .../hi-IN/dataset-documents.json | 0 .../hi-IN/dataset-hit-testing.json | 0 .../{ => locales}/hi-IN/dataset-pipeline.json | 0 .../{ => locales}/hi-IN/dataset-settings.json | 0 web/i18n/{ => locales}/hi-IN/dataset.json | 0 web/i18n/{ => locales}/hi-IN/deployments.json | 0 web/i18n/{ => locales}/hi-IN/device-flow.json | 0 web/i18n/{ => locales}/hi-IN/education.json | 0 web/i18n/{ => locales}/hi-IN/explore.json | 0 web/i18n/{ => locales}/hi-IN/layout.json | 0 web/i18n/{ => locales}/hi-IN/login.json | 0 web/i18n/{ => locales}/hi-IN/oauth.json | 0 .../{ => locales}/hi-IN/permission-keys.json | 0 web/i18n/{ => locales}/hi-IN/permission.json | 0 web/i18n/{ => locales}/hi-IN/pipeline.json | 0 web/i18n/{ => locales}/hi-IN/plugin-tags.json | 0 .../{ => locales}/hi-IN/plugin-trigger.json | 0 web/i18n/{ => locales}/hi-IN/plugin.json | 0 web/i18n/{ => locales}/hi-IN/register.json | 0 web/i18n/{ => locales}/hi-IN/run-log.json | 0 web/i18n/{ => locales}/hi-IN/share.json | 0 web/i18n/{ => locales}/hi-IN/skill.json | 0 web/i18n/{ => locales}/hi-IN/snippet.json | 0 web/i18n/{ => locales}/hi-IN/time.json | 0 web/i18n/{ => locales}/hi-IN/tools.json | 0 web/i18n/{ => locales}/hi-IN/workflow.json | 0 web/i18n/{ => locales}/id-ID/agent-v-2.json | 0 .../{ => locales}/id-ID/app-annotation.json | 0 web/i18n/{ => locales}/id-ID/app-api.json | 0 web/i18n/{ => locales}/id-ID/app-debug.json | 0 web/i18n/{ => locales}/id-ID/app-log.json | 0 .../{ => locales}/id-ID/app-overview.json | 0 web/i18n/{ => locales}/id-ID/app.json | 0 web/i18n/{ => locales}/id-ID/billing.json | 0 web/i18n/{ => locales}/id-ID/common.json | 0 web/i18n/{ => locales}/id-ID/custom.json | 0 .../{ => locales}/id-ID/dataset-creation.json | 0 .../id-ID/dataset-documents.json | 0 .../id-ID/dataset-hit-testing.json | 0 .../{ => locales}/id-ID/dataset-pipeline.json | 0 .../{ => locales}/id-ID/dataset-settings.json | 0 web/i18n/{ => locales}/id-ID/dataset.json | 0 web/i18n/{ => locales}/id-ID/deployments.json | 0 web/i18n/{ => locales}/id-ID/device-flow.json | 0 web/i18n/{ => locales}/id-ID/education.json | 0 web/i18n/{ => locales}/id-ID/explore.json | 0 web/i18n/{ => locales}/id-ID/layout.json | 0 web/i18n/{ => locales}/id-ID/login.json | 0 web/i18n/{ => locales}/id-ID/oauth.json | 0 .../{ => locales}/id-ID/permission-keys.json | 0 web/i18n/{ => locales}/id-ID/permission.json | 0 web/i18n/{ => locales}/id-ID/pipeline.json | 0 web/i18n/{ => locales}/id-ID/plugin-tags.json | 0 .../{ => locales}/id-ID/plugin-trigger.json | 0 web/i18n/{ => locales}/id-ID/plugin.json | 0 web/i18n/{ => locales}/id-ID/register.json | 0 web/i18n/{ => locales}/id-ID/run-log.json | 0 web/i18n/{ => locales}/id-ID/share.json | 0 web/i18n/{ => locales}/id-ID/skill.json | 0 web/i18n/{ => locales}/id-ID/snippet.json | 0 web/i18n/{ => locales}/id-ID/time.json | 0 web/i18n/{ => locales}/id-ID/tools.json | 0 web/i18n/{ => locales}/id-ID/workflow.json | 0 web/i18n/{ => locales}/it-IT/agent-v-2.json | 0 .../{ => locales}/it-IT/app-annotation.json | 0 web/i18n/{ => locales}/it-IT/app-api.json | 0 web/i18n/{ => locales}/it-IT/app-debug.json | 0 web/i18n/{ => locales}/it-IT/app-log.json | 0 .../{ => locales}/it-IT/app-overview.json | 0 web/i18n/{ => locales}/it-IT/app.json | 0 web/i18n/{ => locales}/it-IT/billing.json | 0 web/i18n/{ => locales}/it-IT/common.json | 0 web/i18n/{ => locales}/it-IT/custom.json | 0 .../{ => locales}/it-IT/dataset-creation.json | 0 .../it-IT/dataset-documents.json | 0 .../it-IT/dataset-hit-testing.json | 0 .../{ => locales}/it-IT/dataset-pipeline.json | 0 .../{ => locales}/it-IT/dataset-settings.json | 0 web/i18n/{ => locales}/it-IT/dataset.json | 0 web/i18n/{ => locales}/it-IT/deployments.json | 0 web/i18n/{ => locales}/it-IT/device-flow.json | 0 web/i18n/{ => locales}/it-IT/education.json | 0 web/i18n/{ => locales}/it-IT/explore.json | 0 web/i18n/{ => locales}/it-IT/layout.json | 0 web/i18n/{ => locales}/it-IT/login.json | 0 web/i18n/{ => locales}/it-IT/oauth.json | 0 .../{ => locales}/it-IT/permission-keys.json | 0 web/i18n/{ => locales}/it-IT/permission.json | 0 web/i18n/{ => locales}/it-IT/pipeline.json | 0 web/i18n/{ => locales}/it-IT/plugin-tags.json | 0 .../{ => locales}/it-IT/plugin-trigger.json | 0 web/i18n/{ => locales}/it-IT/plugin.json | 0 web/i18n/{ => locales}/it-IT/register.json | 0 web/i18n/{ => locales}/it-IT/run-log.json | 0 web/i18n/{ => locales}/it-IT/share.json | 0 web/i18n/{ => locales}/it-IT/skill.json | 0 web/i18n/{ => locales}/it-IT/snippet.json | 0 web/i18n/{ => locales}/it-IT/time.json | 0 web/i18n/{ => locales}/it-IT/tools.json | 0 web/i18n/{ => locales}/it-IT/workflow.json | 0 web/i18n/{ => locales}/ja-JP/agent-v-2.json | 0 .../{ => locales}/ja-JP/app-annotation.json | 0 web/i18n/{ => locales}/ja-JP/app-api.json | 0 web/i18n/{ => locales}/ja-JP/app-debug.json | 0 web/i18n/{ => locales}/ja-JP/app-log.json | 0 .../{ => locales}/ja-JP/app-overview.json | 0 web/i18n/{ => locales}/ja-JP/app.json | 0 web/i18n/{ => locales}/ja-JP/billing.json | 0 web/i18n/{ => locales}/ja-JP/common.json | 0 web/i18n/{ => locales}/ja-JP/custom.json | 0 .../{ => locales}/ja-JP/dataset-creation.json | 0 .../ja-JP/dataset-documents.json | 0 .../ja-JP/dataset-hit-testing.json | 0 .../{ => locales}/ja-JP/dataset-pipeline.json | 0 .../{ => locales}/ja-JP/dataset-settings.json | 0 web/i18n/{ => locales}/ja-JP/dataset.json | 0 web/i18n/{ => locales}/ja-JP/deployments.json | 0 web/i18n/{ => locales}/ja-JP/device-flow.json | 0 web/i18n/{ => locales}/ja-JP/education.json | 0 web/i18n/{ => locales}/ja-JP/explore.json | 0 web/i18n/{ => locales}/ja-JP/layout.json | 0 web/i18n/{ => locales}/ja-JP/login.json | 0 web/i18n/{ => locales}/ja-JP/oauth.json | 0 .../{ => locales}/ja-JP/permission-keys.json | 0 web/i18n/{ => locales}/ja-JP/permission.json | 0 web/i18n/{ => locales}/ja-JP/pipeline.json | 0 web/i18n/{ => locales}/ja-JP/plugin-tags.json | 0 .../{ => locales}/ja-JP/plugin-trigger.json | 0 web/i18n/{ => locales}/ja-JP/plugin.json | 0 web/i18n/{ => locales}/ja-JP/register.json | 0 web/i18n/{ => locales}/ja-JP/run-log.json | 0 web/i18n/{ => locales}/ja-JP/share.json | 0 web/i18n/{ => locales}/ja-JP/skill.json | 0 web/i18n/{ => locales}/ja-JP/snippet.json | 0 web/i18n/{ => locales}/ja-JP/time.json | 0 web/i18n/{ => locales}/ja-JP/tools.json | 0 web/i18n/{ => locales}/ja-JP/workflow.json | 0 web/i18n/{ => locales}/ko-KR/agent-v-2.json | 0 .../{ => locales}/ko-KR/app-annotation.json | 0 web/i18n/{ => locales}/ko-KR/app-api.json | 0 web/i18n/{ => locales}/ko-KR/app-debug.json | 0 web/i18n/{ => locales}/ko-KR/app-log.json | 0 .../{ => locales}/ko-KR/app-overview.json | 0 web/i18n/{ => locales}/ko-KR/app.json | 0 web/i18n/{ => locales}/ko-KR/billing.json | 0 web/i18n/{ => locales}/ko-KR/common.json | 0 web/i18n/{ => locales}/ko-KR/custom.json | 0 .../{ => locales}/ko-KR/dataset-creation.json | 0 .../ko-KR/dataset-documents.json | 0 .../ko-KR/dataset-hit-testing.json | 0 .../{ => locales}/ko-KR/dataset-pipeline.json | 0 .../{ => locales}/ko-KR/dataset-settings.json | 0 web/i18n/{ => locales}/ko-KR/dataset.json | 0 web/i18n/{ => locales}/ko-KR/deployments.json | 0 web/i18n/{ => locales}/ko-KR/device-flow.json | 0 web/i18n/{ => locales}/ko-KR/education.json | 0 web/i18n/{ => locales}/ko-KR/explore.json | 0 web/i18n/{ => locales}/ko-KR/layout.json | 0 web/i18n/{ => locales}/ko-KR/login.json | 0 web/i18n/{ => locales}/ko-KR/oauth.json | 0 .../{ => locales}/ko-KR/permission-keys.json | 0 web/i18n/{ => locales}/ko-KR/permission.json | 0 web/i18n/{ => locales}/ko-KR/pipeline.json | 0 web/i18n/{ => locales}/ko-KR/plugin-tags.json | 0 .../{ => locales}/ko-KR/plugin-trigger.json | 0 web/i18n/{ => locales}/ko-KR/plugin.json | 0 web/i18n/{ => locales}/ko-KR/register.json | 0 web/i18n/{ => locales}/ko-KR/run-log.json | 0 web/i18n/{ => locales}/ko-KR/share.json | 0 web/i18n/{ => locales}/ko-KR/skill.json | 0 web/i18n/{ => locales}/ko-KR/snippet.json | 0 web/i18n/{ => locales}/ko-KR/time.json | 0 web/i18n/{ => locales}/ko-KR/tools.json | 0 web/i18n/{ => locales}/ko-KR/workflow.json | 0 web/i18n/{ => locales}/lo-LA/agent-v-2.json | 0 .../{ => locales}/lo-LA/app-annotation.json | 0 web/i18n/{ => locales}/lo-LA/app-api.json | 0 web/i18n/{ => locales}/lo-LA/app-debug.json | 0 web/i18n/{ => locales}/lo-LA/app-log.json | 0 .../{ => locales}/lo-LA/app-overview.json | 0 web/i18n/{ => locales}/lo-LA/app.json | 0 web/i18n/{ => locales}/lo-LA/billing.json | 0 web/i18n/{ => locales}/lo-LA/common.json | 0 web/i18n/{ => locales}/lo-LA/custom.json | 0 .../{ => locales}/lo-LA/dataset-creation.json | 0 .../lo-LA/dataset-documents.json | 0 .../lo-LA/dataset-hit-testing.json | 0 .../{ => locales}/lo-LA/dataset-pipeline.json | 0 .../{ => locales}/lo-LA/dataset-settings.json | 0 web/i18n/{ => locales}/lo-LA/dataset.json | 0 web/i18n/{ => locales}/lo-LA/deployments.json | 0 web/i18n/{ => locales}/lo-LA/device-flow.json | 0 web/i18n/{ => locales}/lo-LA/education.json | 0 web/i18n/{ => locales}/lo-LA/explore.json | 0 web/i18n/{ => locales}/lo-LA/layout.json | 0 web/i18n/{ => locales}/lo-LA/login.json | 0 web/i18n/{ => locales}/lo-LA/oauth.json | 0 .../{ => locales}/lo-LA/permission-keys.json | 0 web/i18n/{ => locales}/lo-LA/permission.json | 0 web/i18n/{ => locales}/lo-LA/pipeline.json | 0 web/i18n/{ => locales}/lo-LA/plugin-tags.json | 0 .../{ => locales}/lo-LA/plugin-trigger.json | 0 web/i18n/{ => locales}/lo-LA/plugin.json | 0 web/i18n/{ => locales}/lo-LA/register.json | 0 web/i18n/{ => locales}/lo-LA/run-log.json | 0 web/i18n/{ => locales}/lo-LA/share.json | 0 web/i18n/{ => locales}/lo-LA/skill.json | 0 web/i18n/{ => locales}/lo-LA/snippet.json | 0 web/i18n/{ => locales}/lo-LA/time.json | 0 web/i18n/{ => locales}/lo-LA/tools.json | 0 web/i18n/{ => locales}/lo-LA/workflow.json | 0 web/i18n/{ => locales}/nl-NL/agent-v-2.json | 0 .../{ => locales}/nl-NL/app-annotation.json | 0 web/i18n/{ => locales}/nl-NL/app-api.json | 0 web/i18n/{ => locales}/nl-NL/app-debug.json | 0 web/i18n/{ => locales}/nl-NL/app-log.json | 0 .../{ => locales}/nl-NL/app-overview.json | 0 web/i18n/{ => locales}/nl-NL/app.json | 0 web/i18n/{ => locales}/nl-NL/billing.json | 0 web/i18n/{ => locales}/nl-NL/common.json | 0 web/i18n/{ => locales}/nl-NL/custom.json | 0 .../{ => locales}/nl-NL/dataset-creation.json | 0 .../nl-NL/dataset-documents.json | 0 .../nl-NL/dataset-hit-testing.json | 0 .../{ => locales}/nl-NL/dataset-pipeline.json | 0 .../{ => locales}/nl-NL/dataset-settings.json | 0 web/i18n/{ => locales}/nl-NL/dataset.json | 0 web/i18n/{ => locales}/nl-NL/deployments.json | 0 web/i18n/{ => locales}/nl-NL/device-flow.json | 0 web/i18n/{ => locales}/nl-NL/education.json | 0 web/i18n/{ => locales}/nl-NL/explore.json | 0 web/i18n/{ => locales}/nl-NL/layout.json | 0 web/i18n/{ => locales}/nl-NL/login.json | 0 web/i18n/{ => locales}/nl-NL/oauth.json | 0 .../{ => locales}/nl-NL/permission-keys.json | 0 web/i18n/{ => locales}/nl-NL/permission.json | 0 web/i18n/{ => locales}/nl-NL/pipeline.json | 0 web/i18n/{ => locales}/nl-NL/plugin-tags.json | 0 .../{ => locales}/nl-NL/plugin-trigger.json | 0 web/i18n/{ => locales}/nl-NL/plugin.json | 0 web/i18n/{ => locales}/nl-NL/register.json | 0 web/i18n/{ => locales}/nl-NL/run-log.json | 0 web/i18n/{ => locales}/nl-NL/share.json | 0 web/i18n/{ => locales}/nl-NL/skill.json | 0 web/i18n/{ => locales}/nl-NL/snippet.json | 0 web/i18n/{ => locales}/nl-NL/time.json | 0 web/i18n/{ => locales}/nl-NL/tools.json | 0 web/i18n/{ => locales}/nl-NL/workflow.json | 0 web/i18n/{ => locales}/pl-PL/agent-v-2.json | 0 .../{ => locales}/pl-PL/app-annotation.json | 0 web/i18n/{ => locales}/pl-PL/app-api.json | 0 web/i18n/{ => locales}/pl-PL/app-debug.json | 0 web/i18n/{ => locales}/pl-PL/app-log.json | 0 .../{ => locales}/pl-PL/app-overview.json | 0 web/i18n/{ => locales}/pl-PL/app.json | 0 web/i18n/{ => locales}/pl-PL/billing.json | 0 web/i18n/{ => locales}/pl-PL/common.json | 0 web/i18n/{ => locales}/pl-PL/custom.json | 0 .../{ => locales}/pl-PL/dataset-creation.json | 0 .../pl-PL/dataset-documents.json | 0 .../pl-PL/dataset-hit-testing.json | 0 .../{ => locales}/pl-PL/dataset-pipeline.json | 0 .../{ => locales}/pl-PL/dataset-settings.json | 0 web/i18n/{ => locales}/pl-PL/dataset.json | 0 web/i18n/{ => locales}/pl-PL/deployments.json | 0 web/i18n/{ => locales}/pl-PL/device-flow.json | 0 web/i18n/{ => locales}/pl-PL/education.json | 0 web/i18n/{ => locales}/pl-PL/explore.json | 0 web/i18n/{ => locales}/pl-PL/layout.json | 0 web/i18n/{ => locales}/pl-PL/login.json | 0 web/i18n/{ => locales}/pl-PL/oauth.json | 0 .../{ => locales}/pl-PL/permission-keys.json | 0 web/i18n/{ => locales}/pl-PL/permission.json | 0 web/i18n/{ => locales}/pl-PL/pipeline.json | 0 web/i18n/{ => locales}/pl-PL/plugin-tags.json | 0 .../{ => locales}/pl-PL/plugin-trigger.json | 0 web/i18n/{ => locales}/pl-PL/plugin.json | 0 web/i18n/{ => locales}/pl-PL/register.json | 0 web/i18n/{ => locales}/pl-PL/run-log.json | 0 web/i18n/{ => locales}/pl-PL/share.json | 0 web/i18n/{ => locales}/pl-PL/skill.json | 0 web/i18n/{ => locales}/pl-PL/snippet.json | 0 web/i18n/{ => locales}/pl-PL/time.json | 0 web/i18n/{ => locales}/pl-PL/tools.json | 0 web/i18n/{ => locales}/pl-PL/workflow.json | 0 web/i18n/{ => locales}/pt-BR/agent-v-2.json | 0 .../{ => locales}/pt-BR/app-annotation.json | 0 web/i18n/{ => locales}/pt-BR/app-api.json | 0 web/i18n/{ => locales}/pt-BR/app-debug.json | 0 web/i18n/{ => locales}/pt-BR/app-log.json | 0 .../{ => locales}/pt-BR/app-overview.json | 0 web/i18n/{ => locales}/pt-BR/app.json | 0 web/i18n/{ => locales}/pt-BR/billing.json | 0 web/i18n/{ => locales}/pt-BR/common.json | 0 web/i18n/{ => locales}/pt-BR/custom.json | 0 .../{ => locales}/pt-BR/dataset-creation.json | 0 .../pt-BR/dataset-documents.json | 0 .../pt-BR/dataset-hit-testing.json | 0 .../{ => locales}/pt-BR/dataset-pipeline.json | 0 .../{ => locales}/pt-BR/dataset-settings.json | 0 web/i18n/{ => locales}/pt-BR/dataset.json | 0 web/i18n/{ => locales}/pt-BR/deployments.json | 0 web/i18n/{ => locales}/pt-BR/device-flow.json | 0 web/i18n/{ => locales}/pt-BR/education.json | 0 web/i18n/{ => locales}/pt-BR/explore.json | 0 web/i18n/{ => locales}/pt-BR/layout.json | 0 web/i18n/{ => locales}/pt-BR/login.json | 0 web/i18n/{ => locales}/pt-BR/oauth.json | 0 .../{ => locales}/pt-BR/permission-keys.json | 0 web/i18n/{ => locales}/pt-BR/permission.json | 0 web/i18n/{ => locales}/pt-BR/pipeline.json | 0 web/i18n/{ => locales}/pt-BR/plugin-tags.json | 0 .../{ => locales}/pt-BR/plugin-trigger.json | 0 web/i18n/{ => locales}/pt-BR/plugin.json | 0 web/i18n/{ => locales}/pt-BR/register.json | 0 web/i18n/{ => locales}/pt-BR/run-log.json | 0 web/i18n/{ => locales}/pt-BR/share.json | 0 web/i18n/{ => locales}/pt-BR/skill.json | 0 web/i18n/{ => locales}/pt-BR/snippet.json | 0 web/i18n/{ => locales}/pt-BR/time.json | 0 web/i18n/{ => locales}/pt-BR/tools.json | 0 web/i18n/{ => locales}/pt-BR/workflow.json | 0 web/i18n/{ => locales}/ro-RO/agent-v-2.json | 0 .../{ => locales}/ro-RO/app-annotation.json | 0 web/i18n/{ => locales}/ro-RO/app-api.json | 0 web/i18n/{ => locales}/ro-RO/app-debug.json | 0 web/i18n/{ => locales}/ro-RO/app-log.json | 0 .../{ => locales}/ro-RO/app-overview.json | 0 web/i18n/{ => locales}/ro-RO/app.json | 0 web/i18n/{ => locales}/ro-RO/billing.json | 0 web/i18n/{ => locales}/ro-RO/common.json | 0 web/i18n/{ => locales}/ro-RO/custom.json | 0 .../{ => locales}/ro-RO/dataset-creation.json | 0 .../ro-RO/dataset-documents.json | 0 .../ro-RO/dataset-hit-testing.json | 0 .../{ => locales}/ro-RO/dataset-pipeline.json | 0 .../{ => locales}/ro-RO/dataset-settings.json | 0 web/i18n/{ => locales}/ro-RO/dataset.json | 0 web/i18n/{ => locales}/ro-RO/deployments.json | 0 web/i18n/{ => locales}/ro-RO/device-flow.json | 0 web/i18n/{ => locales}/ro-RO/education.json | 0 web/i18n/{ => locales}/ro-RO/explore.json | 0 web/i18n/{ => locales}/ro-RO/layout.json | 0 web/i18n/{ => locales}/ro-RO/login.json | 0 web/i18n/{ => locales}/ro-RO/oauth.json | 0 .../{ => locales}/ro-RO/permission-keys.json | 0 web/i18n/{ => locales}/ro-RO/permission.json | 0 web/i18n/{ => locales}/ro-RO/pipeline.json | 0 web/i18n/{ => locales}/ro-RO/plugin-tags.json | 0 .../{ => locales}/ro-RO/plugin-trigger.json | 0 web/i18n/{ => locales}/ro-RO/plugin.json | 0 web/i18n/{ => locales}/ro-RO/register.json | 0 web/i18n/{ => locales}/ro-RO/run-log.json | 0 web/i18n/{ => locales}/ro-RO/share.json | 0 web/i18n/{ => locales}/ro-RO/skill.json | 0 web/i18n/{ => locales}/ro-RO/snippet.json | 0 web/i18n/{ => locales}/ro-RO/time.json | 0 web/i18n/{ => locales}/ro-RO/tools.json | 0 web/i18n/{ => locales}/ro-RO/workflow.json | 0 web/i18n/{ => locales}/ru-RU/agent-v-2.json | 0 .../{ => locales}/ru-RU/app-annotation.json | 0 web/i18n/{ => locales}/ru-RU/app-api.json | 0 web/i18n/{ => locales}/ru-RU/app-debug.json | 0 web/i18n/{ => locales}/ru-RU/app-log.json | 0 .../{ => locales}/ru-RU/app-overview.json | 0 web/i18n/{ => locales}/ru-RU/app.json | 0 web/i18n/{ => locales}/ru-RU/billing.json | 0 web/i18n/{ => locales}/ru-RU/common.json | 0 web/i18n/{ => locales}/ru-RU/custom.json | 0 .../{ => locales}/ru-RU/dataset-creation.json | 0 .../ru-RU/dataset-documents.json | 0 .../ru-RU/dataset-hit-testing.json | 0 .../{ => locales}/ru-RU/dataset-pipeline.json | 0 .../{ => locales}/ru-RU/dataset-settings.json | 0 web/i18n/{ => locales}/ru-RU/dataset.json | 0 web/i18n/{ => locales}/ru-RU/deployments.json | 0 web/i18n/{ => locales}/ru-RU/device-flow.json | 0 web/i18n/{ => locales}/ru-RU/education.json | 0 web/i18n/{ => locales}/ru-RU/explore.json | 0 web/i18n/{ => locales}/ru-RU/layout.json | 0 web/i18n/{ => locales}/ru-RU/login.json | 0 web/i18n/{ => locales}/ru-RU/oauth.json | 0 .../{ => locales}/ru-RU/permission-keys.json | 0 web/i18n/{ => locales}/ru-RU/permission.json | 0 web/i18n/{ => locales}/ru-RU/pipeline.json | 0 web/i18n/{ => locales}/ru-RU/plugin-tags.json | 0 .../{ => locales}/ru-RU/plugin-trigger.json | 0 web/i18n/{ => locales}/ru-RU/plugin.json | 0 web/i18n/{ => locales}/ru-RU/register.json | 0 web/i18n/{ => locales}/ru-RU/run-log.json | 0 web/i18n/{ => locales}/ru-RU/share.json | 0 web/i18n/{ => locales}/ru-RU/skill.json | 0 web/i18n/{ => locales}/ru-RU/snippet.json | 0 web/i18n/{ => locales}/ru-RU/time.json | 0 web/i18n/{ => locales}/ru-RU/tools.json | 0 web/i18n/{ => locales}/ru-RU/workflow.json | 0 web/i18n/{ => locales}/sl-SI/agent-v-2.json | 0 .../{ => locales}/sl-SI/app-annotation.json | 0 web/i18n/{ => locales}/sl-SI/app-api.json | 0 web/i18n/{ => locales}/sl-SI/app-debug.json | 0 web/i18n/{ => locales}/sl-SI/app-log.json | 0 .../{ => locales}/sl-SI/app-overview.json | 0 web/i18n/{ => locales}/sl-SI/app.json | 0 web/i18n/{ => locales}/sl-SI/billing.json | 0 web/i18n/{ => locales}/sl-SI/common.json | 0 web/i18n/{ => locales}/sl-SI/custom.json | 0 .../{ => locales}/sl-SI/dataset-creation.json | 0 .../sl-SI/dataset-documents.json | 0 .../sl-SI/dataset-hit-testing.json | 0 .../{ => locales}/sl-SI/dataset-pipeline.json | 0 .../{ => locales}/sl-SI/dataset-settings.json | 0 web/i18n/{ => locales}/sl-SI/dataset.json | 0 web/i18n/{ => locales}/sl-SI/deployments.json | 0 web/i18n/{ => locales}/sl-SI/device-flow.json | 0 web/i18n/{ => locales}/sl-SI/education.json | 0 web/i18n/{ => locales}/sl-SI/explore.json | 0 web/i18n/{ => locales}/sl-SI/layout.json | 0 web/i18n/{ => locales}/sl-SI/login.json | 0 web/i18n/{ => locales}/sl-SI/oauth.json | 0 .../{ => locales}/sl-SI/permission-keys.json | 0 web/i18n/{ => locales}/sl-SI/permission.json | 0 web/i18n/{ => locales}/sl-SI/pipeline.json | 0 web/i18n/{ => locales}/sl-SI/plugin-tags.json | 0 .../{ => locales}/sl-SI/plugin-trigger.json | 0 web/i18n/{ => locales}/sl-SI/plugin.json | 0 web/i18n/{ => locales}/sl-SI/register.json | 0 web/i18n/{ => locales}/sl-SI/run-log.json | 0 web/i18n/{ => locales}/sl-SI/share.json | 0 web/i18n/{ => locales}/sl-SI/skill.json | 0 web/i18n/{ => locales}/sl-SI/snippet.json | 0 web/i18n/{ => locales}/sl-SI/time.json | 0 web/i18n/{ => locales}/sl-SI/tools.json | 0 web/i18n/{ => locales}/sl-SI/workflow.json | 0 web/i18n/{ => locales}/th-TH/agent-v-2.json | 0 .../{ => locales}/th-TH/app-annotation.json | 0 web/i18n/{ => locales}/th-TH/app-api.json | 0 web/i18n/{ => locales}/th-TH/app-debug.json | 0 web/i18n/{ => locales}/th-TH/app-log.json | 0 .../{ => locales}/th-TH/app-overview.json | 0 web/i18n/{ => locales}/th-TH/app.json | 0 web/i18n/{ => locales}/th-TH/billing.json | 0 web/i18n/{ => locales}/th-TH/common.json | 0 web/i18n/{ => locales}/th-TH/custom.json | 0 .../{ => locales}/th-TH/dataset-creation.json | 0 .../th-TH/dataset-documents.json | 0 .../th-TH/dataset-hit-testing.json | 0 .../{ => locales}/th-TH/dataset-pipeline.json | 0 .../{ => locales}/th-TH/dataset-settings.json | 0 web/i18n/{ => locales}/th-TH/dataset.json | 0 web/i18n/{ => locales}/th-TH/deployments.json | 0 web/i18n/{ => locales}/th-TH/device-flow.json | 0 web/i18n/{ => locales}/th-TH/education.json | 0 web/i18n/{ => locales}/th-TH/explore.json | 0 web/i18n/{ => locales}/th-TH/layout.json | 0 web/i18n/{ => locales}/th-TH/login.json | 0 web/i18n/{ => locales}/th-TH/oauth.json | 0 .../{ => locales}/th-TH/permission-keys.json | 0 web/i18n/{ => locales}/th-TH/permission.json | 0 web/i18n/{ => locales}/th-TH/pipeline.json | 0 web/i18n/{ => locales}/th-TH/plugin-tags.json | 0 .../{ => locales}/th-TH/plugin-trigger.json | 0 web/i18n/{ => locales}/th-TH/plugin.json | 0 web/i18n/{ => locales}/th-TH/register.json | 0 web/i18n/{ => locales}/th-TH/run-log.json | 0 web/i18n/{ => locales}/th-TH/share.json | 0 web/i18n/{ => locales}/th-TH/skill.json | 0 web/i18n/{ => locales}/th-TH/snippet.json | 0 web/i18n/{ => locales}/th-TH/time.json | 0 web/i18n/{ => locales}/th-TH/tools.json | 0 web/i18n/{ => locales}/th-TH/workflow.json | 0 web/i18n/{ => locales}/tr-TR/agent-v-2.json | 0 .../{ => locales}/tr-TR/app-annotation.json | 0 web/i18n/{ => locales}/tr-TR/app-api.json | 0 web/i18n/{ => locales}/tr-TR/app-debug.json | 0 web/i18n/{ => locales}/tr-TR/app-log.json | 0 .../{ => locales}/tr-TR/app-overview.json | 0 web/i18n/{ => locales}/tr-TR/app.json | 0 web/i18n/{ => locales}/tr-TR/billing.json | 0 web/i18n/{ => locales}/tr-TR/common.json | 0 web/i18n/{ => locales}/tr-TR/custom.json | 0 .../{ => locales}/tr-TR/dataset-creation.json | 0 .../tr-TR/dataset-documents.json | 0 .../tr-TR/dataset-hit-testing.json | 0 .../{ => locales}/tr-TR/dataset-pipeline.json | 0 .../{ => locales}/tr-TR/dataset-settings.json | 0 web/i18n/{ => locales}/tr-TR/dataset.json | 0 web/i18n/{ => locales}/tr-TR/deployments.json | 0 web/i18n/{ => locales}/tr-TR/device-flow.json | 0 web/i18n/{ => locales}/tr-TR/education.json | 0 web/i18n/{ => locales}/tr-TR/explore.json | 0 web/i18n/{ => locales}/tr-TR/layout.json | 0 web/i18n/{ => locales}/tr-TR/login.json | 0 web/i18n/{ => locales}/tr-TR/oauth.json | 0 .../{ => locales}/tr-TR/permission-keys.json | 0 web/i18n/{ => locales}/tr-TR/permission.json | 0 web/i18n/{ => locales}/tr-TR/pipeline.json | 0 web/i18n/{ => locales}/tr-TR/plugin-tags.json | 0 .../{ => locales}/tr-TR/plugin-trigger.json | 0 web/i18n/{ => locales}/tr-TR/plugin.json | 0 web/i18n/{ => locales}/tr-TR/register.json | 0 web/i18n/{ => locales}/tr-TR/run-log.json | 0 web/i18n/{ => locales}/tr-TR/share.json | 0 web/i18n/{ => locales}/tr-TR/skill.json | 0 web/i18n/{ => locales}/tr-TR/snippet.json | 0 web/i18n/{ => locales}/tr-TR/time.json | 0 web/i18n/{ => locales}/tr-TR/tools.json | 0 web/i18n/{ => locales}/tr-TR/workflow.json | 0 web/i18n/{ => locales}/uk-UA/agent-v-2.json | 0 .../{ => locales}/uk-UA/app-annotation.json | 0 web/i18n/{ => locales}/uk-UA/app-api.json | 0 web/i18n/{ => locales}/uk-UA/app-debug.json | 0 web/i18n/{ => locales}/uk-UA/app-log.json | 0 .../{ => locales}/uk-UA/app-overview.json | 0 web/i18n/{ => locales}/uk-UA/app.json | 0 web/i18n/{ => locales}/uk-UA/billing.json | 0 web/i18n/{ => locales}/uk-UA/common.json | 0 web/i18n/{ => locales}/uk-UA/custom.json | 0 .../{ => locales}/uk-UA/dataset-creation.json | 0 .../uk-UA/dataset-documents.json | 0 .../uk-UA/dataset-hit-testing.json | 0 .../{ => locales}/uk-UA/dataset-pipeline.json | 0 .../{ => locales}/uk-UA/dataset-settings.json | 0 web/i18n/{ => locales}/uk-UA/dataset.json | 0 web/i18n/{ => locales}/uk-UA/deployments.json | 0 web/i18n/{ => locales}/uk-UA/device-flow.json | 0 web/i18n/{ => locales}/uk-UA/education.json | 0 web/i18n/{ => locales}/uk-UA/explore.json | 0 web/i18n/{ => locales}/uk-UA/layout.json | 0 web/i18n/{ => locales}/uk-UA/login.json | 0 web/i18n/{ => locales}/uk-UA/oauth.json | 0 .../{ => locales}/uk-UA/permission-keys.json | 0 web/i18n/{ => locales}/uk-UA/permission.json | 0 web/i18n/{ => locales}/uk-UA/pipeline.json | 0 web/i18n/{ => locales}/uk-UA/plugin-tags.json | 0 .../{ => locales}/uk-UA/plugin-trigger.json | 0 web/i18n/{ => locales}/uk-UA/plugin.json | 0 web/i18n/{ => locales}/uk-UA/register.json | 0 web/i18n/{ => locales}/uk-UA/run-log.json | 0 web/i18n/{ => locales}/uk-UA/share.json | 0 web/i18n/{ => locales}/uk-UA/skill.json | 0 web/i18n/{ => locales}/uk-UA/snippet.json | 0 web/i18n/{ => locales}/uk-UA/time.json | 0 web/i18n/{ => locales}/uk-UA/tools.json | 0 web/i18n/{ => locales}/uk-UA/workflow.json | 0 web/i18n/{ => locales}/vi-VN/agent-v-2.json | 0 .../{ => locales}/vi-VN/app-annotation.json | 0 web/i18n/{ => locales}/vi-VN/app-api.json | 0 web/i18n/{ => locales}/vi-VN/app-debug.json | 0 web/i18n/{ => locales}/vi-VN/app-log.json | 0 .../{ => locales}/vi-VN/app-overview.json | 0 web/i18n/{ => locales}/vi-VN/app.json | 0 web/i18n/{ => locales}/vi-VN/billing.json | 0 web/i18n/{ => locales}/vi-VN/common.json | 0 web/i18n/{ => locales}/vi-VN/custom.json | 0 .../{ => locales}/vi-VN/dataset-creation.json | 0 .../vi-VN/dataset-documents.json | 0 .../vi-VN/dataset-hit-testing.json | 0 .../{ => locales}/vi-VN/dataset-pipeline.json | 0 .../{ => locales}/vi-VN/dataset-settings.json | 0 web/i18n/{ => locales}/vi-VN/dataset.json | 0 web/i18n/{ => locales}/vi-VN/deployments.json | 0 web/i18n/{ => locales}/vi-VN/device-flow.json | 0 web/i18n/{ => locales}/vi-VN/education.json | 0 web/i18n/{ => locales}/vi-VN/explore.json | 0 web/i18n/{ => locales}/vi-VN/layout.json | 0 web/i18n/{ => locales}/vi-VN/login.json | 0 web/i18n/{ => locales}/vi-VN/oauth.json | 0 .../{ => locales}/vi-VN/permission-keys.json | 0 web/i18n/{ => locales}/vi-VN/permission.json | 0 web/i18n/{ => locales}/vi-VN/pipeline.json | 0 web/i18n/{ => locales}/vi-VN/plugin-tags.json | 0 .../{ => locales}/vi-VN/plugin-trigger.json | 0 web/i18n/{ => locales}/vi-VN/plugin.json | 0 web/i18n/{ => locales}/vi-VN/register.json | 0 web/i18n/{ => locales}/vi-VN/run-log.json | 0 web/i18n/{ => locales}/vi-VN/share.json | 0 web/i18n/{ => locales}/vi-VN/skill.json | 0 web/i18n/{ => locales}/vi-VN/snippet.json | 0 web/i18n/{ => locales}/vi-VN/time.json | 0 web/i18n/{ => locales}/vi-VN/tools.json | 0 web/i18n/{ => locales}/vi-VN/workflow.json | 0 web/i18n/{ => locales}/zh-Hans/agent-v-2.json | 0 .../{ => locales}/zh-Hans/app-annotation.json | 0 web/i18n/{ => locales}/zh-Hans/app-api.json | 0 web/i18n/{ => locales}/zh-Hans/app-debug.json | 0 web/i18n/{ => locales}/zh-Hans/app-log.json | 0 .../{ => locales}/zh-Hans/app-overview.json | 0 web/i18n/{ => locales}/zh-Hans/app.json | 0 web/i18n/{ => locales}/zh-Hans/billing.json | 0 web/i18n/{ => locales}/zh-Hans/common.json | 0 web/i18n/{ => locales}/zh-Hans/custom.json | 0 .../zh-Hans/dataset-creation.json | 0 .../zh-Hans/dataset-documents.json | 0 .../zh-Hans/dataset-hit-testing.json | 0 .../zh-Hans/dataset-pipeline.json | 0 .../zh-Hans/dataset-settings.json | 0 web/i18n/{ => locales}/zh-Hans/dataset.json | 0 .../{ => locales}/zh-Hans/deployments.json | 0 .../{ => locales}/zh-Hans/device-flow.json | 0 web/i18n/{ => locales}/zh-Hans/education.json | 0 web/i18n/{ => locales}/zh-Hans/explore.json | 0 web/i18n/{ => locales}/zh-Hans/layout.json | 0 web/i18n/{ => locales}/zh-Hans/login.json | 0 web/i18n/{ => locales}/zh-Hans/oauth.json | 0 .../zh-Hans/permission-keys.json | 0 .../{ => locales}/zh-Hans/permission.json | 0 web/i18n/{ => locales}/zh-Hans/pipeline.json | 0 .../{ => locales}/zh-Hans/plugin-tags.json | 0 .../{ => locales}/zh-Hans/plugin-trigger.json | 0 web/i18n/{ => locales}/zh-Hans/plugin.json | 0 web/i18n/{ => locales}/zh-Hans/register.json | 0 web/i18n/{ => locales}/zh-Hans/run-log.json | 0 web/i18n/{ => locales}/zh-Hans/share.json | 0 web/i18n/{ => locales}/zh-Hans/skill.json | 0 web/i18n/{ => locales}/zh-Hans/snippet.json | 0 web/i18n/{ => locales}/zh-Hans/time.json | 0 web/i18n/{ => locales}/zh-Hans/tools.json | 0 web/i18n/{ => locales}/zh-Hans/workflow.json | 0 web/i18n/{ => locales}/zh-Hant/agent-v-2.json | 0 .../{ => locales}/zh-Hant/app-annotation.json | 0 web/i18n/{ => locales}/zh-Hant/app-api.json | 0 web/i18n/{ => locales}/zh-Hant/app-debug.json | 0 web/i18n/{ => locales}/zh-Hant/app-log.json | 0 .../{ => locales}/zh-Hant/app-overview.json | 0 web/i18n/{ => locales}/zh-Hant/app.json | 0 web/i18n/{ => locales}/zh-Hant/billing.json | 0 web/i18n/{ => locales}/zh-Hant/common.json | 0 web/i18n/{ => locales}/zh-Hant/custom.json | 0 .../zh-Hant/dataset-creation.json | 0 .../zh-Hant/dataset-documents.json | 0 .../zh-Hant/dataset-hit-testing.json | 0 .../zh-Hant/dataset-pipeline.json | 0 .../zh-Hant/dataset-settings.json | 0 web/i18n/{ => locales}/zh-Hant/dataset.json | 0 .../{ => locales}/zh-Hant/deployments.json | 0 .../{ => locales}/zh-Hant/device-flow.json | 0 web/i18n/{ => locales}/zh-Hant/education.json | 0 web/i18n/{ => locales}/zh-Hant/explore.json | 0 web/i18n/{ => locales}/zh-Hant/layout.json | 0 web/i18n/{ => locales}/zh-Hant/login.json | 0 web/i18n/{ => locales}/zh-Hant/oauth.json | 0 .../zh-Hant/permission-keys.json | 0 .../{ => locales}/zh-Hant/permission.json | 0 web/i18n/{ => locales}/zh-Hant/pipeline.json | 0 .../{ => locales}/zh-Hant/plugin-tags.json | 0 .../{ => locales}/zh-Hant/plugin-trigger.json | 0 web/i18n/{ => locales}/zh-Hant/plugin.json | 0 web/i18n/{ => locales}/zh-Hant/register.json | 0 web/i18n/{ => locales}/zh-Hant/run-log.json | 0 web/i18n/{ => locales}/zh-Hant/share.json | 0 web/i18n/{ => locales}/zh-Hant/skill.json | 0 web/i18n/{ => locales}/zh-Hant/snippet.json | 0 web/i18n/{ => locales}/zh-Hant/time.json | 0 web/i18n/{ => locales}/zh-Hant/tools.json | 0 web/i18n/{ => locales}/zh-Hant/workflow.json | 0 web/{i18n-config => i18n}/metadata.ts | 0 web/{i18n-config => i18n}/resources.ts | 74 ++++++------ web/{i18n-config => i18n}/server.ts | 0 web/{i18n-config => i18n}/settings.ts | 0 web/models/access-control.ts | 2 +- web/models/common.ts | 2 +- web/models/share.ts | 2 +- web/package.json | 4 +- web/plugins/eslint/rules/no-extra-keys.js | 4 +- web/plugins/vite/__tests__/i18n-graph.spec.ts | 111 +++++++++--------- web/plugins/vite/__tests__/i18n-prune.spec.ts | 4 +- web/plugins/vite/custom-i18n-hmr.ts | 4 +- web/plugins/vite/i18n-prune.ts | 2 +- web/plugins/vite/i18n-prune/graph.ts | 2 +- .../__tests__/migrate-i18n-selectors.spec.ts | 4 +- web/scripts/analyze-i18n-diff.ts | 6 +- web/scripts/check-i18n.js | 8 +- web/scripts/migrate-i18n-selectors.ts | 2 +- .../access-control/use-app-access-config.ts | 2 +- .../use-dataset-access-config.ts | 2 +- .../access-control/use-member-roles.ts | 2 +- web/service/use-common.ts | 2 +- web/types/app.ts | 2 +- web/types/i18n.d.ts | 2 +- web/utils/format.ts | 4 +- 1155 files changed, 381 insertions(+), 385 deletions(-) rename web/{i18n-config => i18n}/README.md (80%) rename web/{i18n-config => i18n}/__tests__/client-locale.spec.ts (100%) rename web/{i18n-config => i18n}/__tests__/load-resource.spec.ts (100%) rename web/{i18n-config => i18n}/__tests__/metadata.spec.ts (100%) rename web/{i18n-config => i18n}/__tests__/plural-selector.spec.ts (97%) rename web/{i18n-config => i18n}/__tests__/server.spec.ts (100%) rename web/{i18n-config => i18n}/client.ts (100%) rename web/{i18n-config => i18n}/index.ts (100%) rename web/{i18n-config => i18n}/language.ts (100%) rename web/{i18n-config => i18n}/languages.ts (100%) rename web/{i18n-config => i18n}/lib.client.ts (100%) rename web/{i18n-config => i18n}/lib.server.ts (100%) rename web/{i18n-config => i18n}/load-resource.ts (100%) rename web/{i18n-config => i18n}/locale-resources/ar-TN.ts (51%) rename web/{i18n-config => i18n}/locale-resources/az-AZ.ts (51%) rename web/{i18n-config => i18n}/locale-resources/de-DE.ts (51%) rename web/{i18n-config => i18n}/locale-resources/en-US.ts (51%) rename web/{i18n-config => i18n}/locale-resources/es-ES.ts (51%) rename web/{i18n-config => i18n}/locale-resources/fa-IR.ts (51%) rename web/{i18n-config => i18n}/locale-resources/fr-FR.ts (51%) rename web/{i18n-config => i18n}/locale-resources/hi-IN.ts (51%) rename web/{i18n-config => i18n}/locale-resources/id-ID.ts (51%) rename web/{i18n-config => i18n}/locale-resources/it-IT.ts (51%) rename web/{i18n-config => i18n}/locale-resources/ja-JP.ts (51%) rename web/{i18n-config => i18n}/locale-resources/ko-KR.ts (51%) rename web/{i18n-config => i18n}/locale-resources/lo-LA.ts (51%) rename web/{i18n-config => i18n}/locale-resources/nl-NL.ts (51%) rename web/{i18n-config => i18n}/locale-resources/pl-PL.ts (51%) rename web/{i18n-config => i18n}/locale-resources/pt-BR.ts (51%) rename web/{i18n-config => i18n}/locale-resources/ro-RO.ts (51%) rename web/{i18n-config => i18n}/locale-resources/ru-RU.ts (51%) rename web/{i18n-config => i18n}/locale-resources/sl-SI.ts (51%) rename web/{i18n-config => i18n}/locale-resources/th-TH.ts (51%) rename web/{i18n-config => i18n}/locale-resources/tr-TR.ts (51%) rename web/{i18n-config => i18n}/locale-resources/uk-UA.ts (51%) rename web/{i18n-config => i18n}/locale-resources/vi-VN.ts (51%) rename web/{i18n-config => i18n}/locale-resources/zh-Hans.ts (50%) rename web/{i18n-config => i18n}/locale-resources/zh-Hant.ts (50%) rename web/{i18n-config => i18n}/locale.ts (100%) rename web/i18n/{ => locales}/ar-TN/agent-v-2.json (100%) rename web/i18n/{ => locales}/ar-TN/app-annotation.json (100%) rename web/i18n/{ => locales}/ar-TN/app-api.json (100%) rename web/i18n/{ => locales}/ar-TN/app-debug.json (100%) rename web/i18n/{ => locales}/ar-TN/app-log.json (100%) rename web/i18n/{ => locales}/ar-TN/app-overview.json (100%) rename web/i18n/{ => locales}/ar-TN/app.json (100%) rename web/i18n/{ => locales}/ar-TN/billing.json (100%) rename web/i18n/{ => locales}/ar-TN/common.json (100%) rename web/i18n/{ => locales}/ar-TN/custom.json (100%) rename web/i18n/{ => locales}/ar-TN/dataset-creation.json (100%) rename web/i18n/{ => locales}/ar-TN/dataset-documents.json (100%) rename web/i18n/{ => locales}/ar-TN/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/ar-TN/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/ar-TN/dataset-settings.json (100%) rename web/i18n/{ => locales}/ar-TN/dataset.json (100%) rename web/i18n/{ => locales}/ar-TN/deployments.json (100%) rename web/i18n/{ => locales}/ar-TN/device-flow.json (100%) rename web/i18n/{ => locales}/ar-TN/education.json (100%) rename web/i18n/{ => locales}/ar-TN/explore.json (100%) rename web/i18n/{ => locales}/ar-TN/layout.json (100%) rename web/i18n/{ => locales}/ar-TN/login.json (100%) rename web/i18n/{ => locales}/ar-TN/oauth.json (100%) rename web/i18n/{ => locales}/ar-TN/permission-keys.json (100%) rename web/i18n/{ => locales}/ar-TN/permission.json (100%) rename web/i18n/{ => locales}/ar-TN/pipeline.json (100%) rename web/i18n/{ => locales}/ar-TN/plugin-tags.json (100%) rename web/i18n/{ => locales}/ar-TN/plugin-trigger.json (100%) rename web/i18n/{ => locales}/ar-TN/plugin.json (100%) rename web/i18n/{ => locales}/ar-TN/register.json (100%) rename web/i18n/{ => locales}/ar-TN/run-log.json (100%) rename web/i18n/{ => locales}/ar-TN/share.json (100%) rename web/i18n/{ => locales}/ar-TN/skill.json (100%) rename web/i18n/{ => locales}/ar-TN/snippet.json (100%) rename web/i18n/{ => locales}/ar-TN/time.json (100%) rename web/i18n/{ => locales}/ar-TN/tools.json (100%) rename web/i18n/{ => locales}/ar-TN/workflow.json (100%) rename web/i18n/{ => locales}/az-AZ/agent-v-2.json (100%) rename web/i18n/{ => locales}/az-AZ/app-annotation.json (100%) rename web/i18n/{ => locales}/az-AZ/app-api.json (100%) rename web/i18n/{ => locales}/az-AZ/app-debug.json (100%) rename web/i18n/{ => locales}/az-AZ/app-log.json (100%) rename web/i18n/{ => locales}/az-AZ/app-overview.json (100%) rename web/i18n/{ => locales}/az-AZ/app.json (100%) rename web/i18n/{ => locales}/az-AZ/billing.json (100%) rename web/i18n/{ => locales}/az-AZ/common.json (100%) rename web/i18n/{ => locales}/az-AZ/custom.json (100%) rename web/i18n/{ => locales}/az-AZ/dataset-creation.json (100%) rename web/i18n/{ => locales}/az-AZ/dataset-documents.json (100%) rename web/i18n/{ => locales}/az-AZ/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/az-AZ/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/az-AZ/dataset-settings.json (100%) rename web/i18n/{ => locales}/az-AZ/dataset.json (100%) rename web/i18n/{ => locales}/az-AZ/deployments.json (100%) rename web/i18n/{ => locales}/az-AZ/device-flow.json (100%) rename web/i18n/{ => locales}/az-AZ/education.json (100%) rename web/i18n/{ => locales}/az-AZ/explore.json (100%) rename web/i18n/{ => locales}/az-AZ/layout.json (100%) rename web/i18n/{ => locales}/az-AZ/login.json (100%) rename web/i18n/{ => locales}/az-AZ/oauth.json (100%) rename web/i18n/{ => locales}/az-AZ/permission-keys.json (100%) rename web/i18n/{ => locales}/az-AZ/permission.json (100%) rename web/i18n/{ => locales}/az-AZ/pipeline.json (100%) rename web/i18n/{ => locales}/az-AZ/plugin-tags.json (100%) rename web/i18n/{ => locales}/az-AZ/plugin-trigger.json (100%) rename web/i18n/{ => locales}/az-AZ/plugin.json (100%) rename web/i18n/{ => locales}/az-AZ/register.json (100%) rename web/i18n/{ => locales}/az-AZ/run-log.json (100%) rename web/i18n/{ => locales}/az-AZ/share.json (100%) rename web/i18n/{ => locales}/az-AZ/skill.json (100%) rename web/i18n/{ => locales}/az-AZ/snippet.json (100%) rename web/i18n/{ => locales}/az-AZ/time.json (100%) rename web/i18n/{ => locales}/az-AZ/tools.json (100%) rename web/i18n/{ => locales}/az-AZ/workflow.json (100%) rename web/i18n/{ => locales}/de-DE/agent-v-2.json (100%) rename web/i18n/{ => locales}/de-DE/app-annotation.json (100%) rename web/i18n/{ => locales}/de-DE/app-api.json (100%) rename web/i18n/{ => locales}/de-DE/app-debug.json (100%) rename web/i18n/{ => locales}/de-DE/app-log.json (100%) rename web/i18n/{ => locales}/de-DE/app-overview.json (100%) rename web/i18n/{ => locales}/de-DE/app.json (100%) rename web/i18n/{ => locales}/de-DE/billing.json (100%) rename web/i18n/{ => locales}/de-DE/common.json (100%) rename web/i18n/{ => locales}/de-DE/custom.json (100%) rename web/i18n/{ => locales}/de-DE/dataset-creation.json (100%) rename web/i18n/{ => locales}/de-DE/dataset-documents.json (100%) rename web/i18n/{ => locales}/de-DE/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/de-DE/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/de-DE/dataset-settings.json (100%) rename web/i18n/{ => locales}/de-DE/dataset.json (100%) rename web/i18n/{ => locales}/de-DE/deployments.json (100%) rename web/i18n/{ => locales}/de-DE/device-flow.json (100%) rename web/i18n/{ => locales}/de-DE/education.json (100%) rename web/i18n/{ => locales}/de-DE/explore.json (100%) rename web/i18n/{ => locales}/de-DE/layout.json (100%) rename web/i18n/{ => locales}/de-DE/login.json (100%) rename web/i18n/{ => locales}/de-DE/oauth.json (100%) rename web/i18n/{ => locales}/de-DE/permission-keys.json (100%) rename web/i18n/{ => locales}/de-DE/permission.json (100%) rename web/i18n/{ => locales}/de-DE/pipeline.json (100%) rename web/i18n/{ => locales}/de-DE/plugin-tags.json (100%) rename web/i18n/{ => locales}/de-DE/plugin-trigger.json (100%) rename web/i18n/{ => locales}/de-DE/plugin.json (100%) rename web/i18n/{ => locales}/de-DE/register.json (100%) rename web/i18n/{ => locales}/de-DE/run-log.json (100%) rename web/i18n/{ => locales}/de-DE/share.json (100%) rename web/i18n/{ => locales}/de-DE/skill.json (100%) rename web/i18n/{ => locales}/de-DE/snippet.json (100%) rename web/i18n/{ => locales}/de-DE/time.json (100%) rename web/i18n/{ => locales}/de-DE/tools.json (100%) rename web/i18n/{ => locales}/de-DE/workflow.json (100%) rename web/i18n/{ => locales}/en-US/agent-v-2.json (100%) rename web/i18n/{ => locales}/en-US/app-annotation.json (100%) rename web/i18n/{ => locales}/en-US/app-api.json (100%) rename web/i18n/{ => locales}/en-US/app-debug.json (100%) rename web/i18n/{ => locales}/en-US/app-log.json (100%) rename web/i18n/{ => locales}/en-US/app-overview.json (100%) rename web/i18n/{ => locales}/en-US/app.json (100%) rename web/i18n/{ => locales}/en-US/billing.json (100%) rename web/i18n/{ => locales}/en-US/common.json (100%) rename web/i18n/{ => locales}/en-US/custom.json (100%) rename web/i18n/{ => locales}/en-US/dataset-creation.json (100%) rename web/i18n/{ => locales}/en-US/dataset-documents.json (100%) rename web/i18n/{ => locales}/en-US/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/en-US/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/en-US/dataset-settings.json (100%) rename web/i18n/{ => locales}/en-US/dataset.json (100%) rename web/i18n/{ => locales}/en-US/deployments.json (100%) rename web/i18n/{ => locales}/en-US/device-flow.json (100%) rename web/i18n/{ => locales}/en-US/education.json (100%) rename web/i18n/{ => locales}/en-US/explore.json (100%) rename web/i18n/{ => locales}/en-US/layout.json (100%) rename web/i18n/{ => locales}/en-US/login.json (100%) rename web/i18n/{ => locales}/en-US/oauth.json (100%) rename web/i18n/{ => locales}/en-US/permission-keys.json (100%) rename web/i18n/{ => locales}/en-US/permission.json (100%) rename web/i18n/{ => locales}/en-US/pipeline.json (100%) rename web/i18n/{ => locales}/en-US/plugin-tags.json (100%) rename web/i18n/{ => locales}/en-US/plugin-trigger.json (100%) rename web/i18n/{ => locales}/en-US/plugin.json (100%) rename web/i18n/{ => locales}/en-US/register.json (100%) rename web/i18n/{ => locales}/en-US/run-log.json (100%) rename web/i18n/{ => locales}/en-US/share.json (100%) rename web/i18n/{ => locales}/en-US/skill.json (100%) rename web/i18n/{ => locales}/en-US/snippet.json (100%) rename web/i18n/{ => locales}/en-US/time.json (100%) rename web/i18n/{ => locales}/en-US/tools.json (100%) rename web/i18n/{ => locales}/en-US/workflow.json (100%) rename web/i18n/{ => locales}/es-ES/agent-v-2.json (100%) rename web/i18n/{ => locales}/es-ES/app-annotation.json (100%) rename web/i18n/{ => locales}/es-ES/app-api.json (100%) rename web/i18n/{ => locales}/es-ES/app-debug.json (100%) rename web/i18n/{ => locales}/es-ES/app-log.json (100%) rename web/i18n/{ => locales}/es-ES/app-overview.json (100%) rename web/i18n/{ => locales}/es-ES/app.json (100%) rename web/i18n/{ => locales}/es-ES/billing.json (100%) rename web/i18n/{ => locales}/es-ES/common.json (100%) rename web/i18n/{ => locales}/es-ES/custom.json (100%) rename web/i18n/{ => locales}/es-ES/dataset-creation.json (100%) rename web/i18n/{ => locales}/es-ES/dataset-documents.json (100%) rename web/i18n/{ => locales}/es-ES/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/es-ES/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/es-ES/dataset-settings.json (100%) rename web/i18n/{ => locales}/es-ES/dataset.json (100%) rename web/i18n/{ => locales}/es-ES/deployments.json (100%) rename web/i18n/{ => locales}/es-ES/device-flow.json (100%) rename web/i18n/{ => locales}/es-ES/education.json (100%) rename web/i18n/{ => locales}/es-ES/explore.json (100%) rename web/i18n/{ => locales}/es-ES/layout.json (100%) rename web/i18n/{ => locales}/es-ES/login.json (100%) rename web/i18n/{ => locales}/es-ES/oauth.json (100%) rename web/i18n/{ => locales}/es-ES/permission-keys.json (100%) rename web/i18n/{ => locales}/es-ES/permission.json (100%) rename web/i18n/{ => locales}/es-ES/pipeline.json (100%) rename web/i18n/{ => locales}/es-ES/plugin-tags.json (100%) rename web/i18n/{ => locales}/es-ES/plugin-trigger.json (100%) rename web/i18n/{ => locales}/es-ES/plugin.json (100%) rename web/i18n/{ => locales}/es-ES/register.json (100%) rename web/i18n/{ => locales}/es-ES/run-log.json (100%) rename web/i18n/{ => locales}/es-ES/share.json (100%) rename web/i18n/{ => locales}/es-ES/skill.json (100%) rename web/i18n/{ => locales}/es-ES/snippet.json (100%) rename web/i18n/{ => locales}/es-ES/time.json (100%) rename web/i18n/{ => locales}/es-ES/tools.json (100%) rename web/i18n/{ => locales}/es-ES/workflow.json (100%) rename web/i18n/{ => locales}/fa-IR/agent-v-2.json (100%) rename web/i18n/{ => locales}/fa-IR/app-annotation.json (100%) rename web/i18n/{ => locales}/fa-IR/app-api.json (100%) rename web/i18n/{ => locales}/fa-IR/app-debug.json (100%) rename web/i18n/{ => locales}/fa-IR/app-log.json (100%) rename web/i18n/{ => locales}/fa-IR/app-overview.json (100%) rename web/i18n/{ => locales}/fa-IR/app.json (100%) rename web/i18n/{ => locales}/fa-IR/billing.json (100%) rename web/i18n/{ => locales}/fa-IR/common.json (100%) rename web/i18n/{ => locales}/fa-IR/custom.json (100%) rename web/i18n/{ => locales}/fa-IR/dataset-creation.json (100%) rename web/i18n/{ => locales}/fa-IR/dataset-documents.json (100%) rename web/i18n/{ => locales}/fa-IR/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/fa-IR/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/fa-IR/dataset-settings.json (100%) rename web/i18n/{ => locales}/fa-IR/dataset.json (100%) rename web/i18n/{ => locales}/fa-IR/deployments.json (100%) rename web/i18n/{ => locales}/fa-IR/device-flow.json (100%) rename web/i18n/{ => locales}/fa-IR/education.json (100%) rename web/i18n/{ => locales}/fa-IR/explore.json (100%) rename web/i18n/{ => locales}/fa-IR/layout.json (100%) rename web/i18n/{ => locales}/fa-IR/login.json (100%) rename web/i18n/{ => locales}/fa-IR/oauth.json (100%) rename web/i18n/{ => locales}/fa-IR/permission-keys.json (100%) rename web/i18n/{ => locales}/fa-IR/permission.json (100%) rename web/i18n/{ => locales}/fa-IR/pipeline.json (100%) rename web/i18n/{ => locales}/fa-IR/plugin-tags.json (100%) rename web/i18n/{ => locales}/fa-IR/plugin-trigger.json (100%) rename web/i18n/{ => locales}/fa-IR/plugin.json (100%) rename web/i18n/{ => locales}/fa-IR/register.json (100%) rename web/i18n/{ => locales}/fa-IR/run-log.json (100%) rename web/i18n/{ => locales}/fa-IR/share.json (100%) rename web/i18n/{ => locales}/fa-IR/skill.json (100%) rename web/i18n/{ => locales}/fa-IR/snippet.json (100%) rename web/i18n/{ => locales}/fa-IR/time.json (100%) rename web/i18n/{ => locales}/fa-IR/tools.json (100%) rename web/i18n/{ => locales}/fa-IR/workflow.json (100%) rename web/i18n/{ => locales}/fr-FR/agent-v-2.json (100%) rename web/i18n/{ => locales}/fr-FR/app-annotation.json (100%) rename web/i18n/{ => locales}/fr-FR/app-api.json (100%) rename web/i18n/{ => locales}/fr-FR/app-debug.json (100%) rename web/i18n/{ => locales}/fr-FR/app-log.json (100%) rename web/i18n/{ => locales}/fr-FR/app-overview.json (100%) rename web/i18n/{ => locales}/fr-FR/app.json (100%) rename web/i18n/{ => locales}/fr-FR/billing.json (100%) rename web/i18n/{ => locales}/fr-FR/common.json (100%) rename web/i18n/{ => locales}/fr-FR/custom.json (100%) rename web/i18n/{ => locales}/fr-FR/dataset-creation.json (100%) rename web/i18n/{ => locales}/fr-FR/dataset-documents.json (100%) rename web/i18n/{ => locales}/fr-FR/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/fr-FR/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/fr-FR/dataset-settings.json (100%) rename web/i18n/{ => locales}/fr-FR/dataset.json (100%) rename web/i18n/{ => locales}/fr-FR/deployments.json (100%) rename web/i18n/{ => locales}/fr-FR/device-flow.json (100%) rename web/i18n/{ => locales}/fr-FR/education.json (100%) rename web/i18n/{ => locales}/fr-FR/explore.json (100%) rename web/i18n/{ => locales}/fr-FR/layout.json (100%) rename web/i18n/{ => locales}/fr-FR/login.json (100%) rename web/i18n/{ => locales}/fr-FR/oauth.json (100%) rename web/i18n/{ => locales}/fr-FR/permission-keys.json (100%) rename web/i18n/{ => locales}/fr-FR/permission.json (100%) rename web/i18n/{ => locales}/fr-FR/pipeline.json (100%) rename web/i18n/{ => locales}/fr-FR/plugin-tags.json (100%) rename web/i18n/{ => locales}/fr-FR/plugin-trigger.json (100%) rename web/i18n/{ => locales}/fr-FR/plugin.json (100%) rename web/i18n/{ => locales}/fr-FR/register.json (100%) rename web/i18n/{ => locales}/fr-FR/run-log.json (100%) rename web/i18n/{ => locales}/fr-FR/share.json (100%) rename web/i18n/{ => locales}/fr-FR/skill.json (100%) rename web/i18n/{ => locales}/fr-FR/snippet.json (100%) rename web/i18n/{ => locales}/fr-FR/time.json (100%) rename web/i18n/{ => locales}/fr-FR/tools.json (100%) rename web/i18n/{ => locales}/fr-FR/workflow.json (100%) rename web/i18n/{ => locales}/hi-IN/agent-v-2.json (100%) rename web/i18n/{ => locales}/hi-IN/app-annotation.json (100%) rename web/i18n/{ => locales}/hi-IN/app-api.json (100%) rename web/i18n/{ => locales}/hi-IN/app-debug.json (100%) rename web/i18n/{ => locales}/hi-IN/app-log.json (100%) rename web/i18n/{ => locales}/hi-IN/app-overview.json (100%) rename web/i18n/{ => locales}/hi-IN/app.json (100%) rename web/i18n/{ => locales}/hi-IN/billing.json (100%) rename web/i18n/{ => locales}/hi-IN/common.json (100%) rename web/i18n/{ => locales}/hi-IN/custom.json (100%) rename web/i18n/{ => locales}/hi-IN/dataset-creation.json (100%) rename web/i18n/{ => locales}/hi-IN/dataset-documents.json (100%) rename web/i18n/{ => locales}/hi-IN/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/hi-IN/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/hi-IN/dataset-settings.json (100%) rename web/i18n/{ => locales}/hi-IN/dataset.json (100%) rename web/i18n/{ => locales}/hi-IN/deployments.json (100%) rename web/i18n/{ => locales}/hi-IN/device-flow.json (100%) rename web/i18n/{ => locales}/hi-IN/education.json (100%) rename web/i18n/{ => locales}/hi-IN/explore.json (100%) rename web/i18n/{ => locales}/hi-IN/layout.json (100%) rename web/i18n/{ => locales}/hi-IN/login.json (100%) rename web/i18n/{ => locales}/hi-IN/oauth.json (100%) rename web/i18n/{ => locales}/hi-IN/permission-keys.json (100%) rename web/i18n/{ => locales}/hi-IN/permission.json (100%) rename web/i18n/{ => locales}/hi-IN/pipeline.json (100%) rename web/i18n/{ => locales}/hi-IN/plugin-tags.json (100%) rename web/i18n/{ => locales}/hi-IN/plugin-trigger.json (100%) rename web/i18n/{ => locales}/hi-IN/plugin.json (100%) rename web/i18n/{ => locales}/hi-IN/register.json (100%) rename web/i18n/{ => locales}/hi-IN/run-log.json (100%) rename web/i18n/{ => locales}/hi-IN/share.json (100%) rename web/i18n/{ => locales}/hi-IN/skill.json (100%) rename web/i18n/{ => locales}/hi-IN/snippet.json (100%) rename web/i18n/{ => locales}/hi-IN/time.json (100%) rename web/i18n/{ => locales}/hi-IN/tools.json (100%) rename web/i18n/{ => locales}/hi-IN/workflow.json (100%) rename web/i18n/{ => locales}/id-ID/agent-v-2.json (100%) rename web/i18n/{ => locales}/id-ID/app-annotation.json (100%) rename web/i18n/{ => locales}/id-ID/app-api.json (100%) rename web/i18n/{ => locales}/id-ID/app-debug.json (100%) rename web/i18n/{ => locales}/id-ID/app-log.json (100%) rename web/i18n/{ => locales}/id-ID/app-overview.json (100%) rename web/i18n/{ => locales}/id-ID/app.json (100%) rename web/i18n/{ => locales}/id-ID/billing.json (100%) rename web/i18n/{ => locales}/id-ID/common.json (100%) rename web/i18n/{ => locales}/id-ID/custom.json (100%) rename web/i18n/{ => locales}/id-ID/dataset-creation.json (100%) rename web/i18n/{ => locales}/id-ID/dataset-documents.json (100%) rename web/i18n/{ => locales}/id-ID/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/id-ID/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/id-ID/dataset-settings.json (100%) rename web/i18n/{ => locales}/id-ID/dataset.json (100%) rename web/i18n/{ => locales}/id-ID/deployments.json (100%) rename web/i18n/{ => locales}/id-ID/device-flow.json (100%) rename web/i18n/{ => locales}/id-ID/education.json (100%) rename web/i18n/{ => locales}/id-ID/explore.json (100%) rename web/i18n/{ => locales}/id-ID/layout.json (100%) rename web/i18n/{ => locales}/id-ID/login.json (100%) rename web/i18n/{ => locales}/id-ID/oauth.json (100%) rename web/i18n/{ => locales}/id-ID/permission-keys.json (100%) rename web/i18n/{ => locales}/id-ID/permission.json (100%) rename web/i18n/{ => locales}/id-ID/pipeline.json (100%) rename web/i18n/{ => locales}/id-ID/plugin-tags.json (100%) rename web/i18n/{ => locales}/id-ID/plugin-trigger.json (100%) rename web/i18n/{ => locales}/id-ID/plugin.json (100%) rename web/i18n/{ => locales}/id-ID/register.json (100%) rename web/i18n/{ => locales}/id-ID/run-log.json (100%) rename web/i18n/{ => locales}/id-ID/share.json (100%) rename web/i18n/{ => locales}/id-ID/skill.json (100%) rename web/i18n/{ => locales}/id-ID/snippet.json (100%) rename web/i18n/{ => locales}/id-ID/time.json (100%) rename web/i18n/{ => locales}/id-ID/tools.json (100%) rename web/i18n/{ => locales}/id-ID/workflow.json (100%) rename web/i18n/{ => locales}/it-IT/agent-v-2.json (100%) rename web/i18n/{ => locales}/it-IT/app-annotation.json (100%) rename web/i18n/{ => locales}/it-IT/app-api.json (100%) rename web/i18n/{ => locales}/it-IT/app-debug.json (100%) rename web/i18n/{ => locales}/it-IT/app-log.json (100%) rename web/i18n/{ => locales}/it-IT/app-overview.json (100%) rename web/i18n/{ => locales}/it-IT/app.json (100%) rename web/i18n/{ => locales}/it-IT/billing.json (100%) rename web/i18n/{ => locales}/it-IT/common.json (100%) rename web/i18n/{ => locales}/it-IT/custom.json (100%) rename web/i18n/{ => locales}/it-IT/dataset-creation.json (100%) rename web/i18n/{ => locales}/it-IT/dataset-documents.json (100%) rename web/i18n/{ => locales}/it-IT/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/it-IT/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/it-IT/dataset-settings.json (100%) rename web/i18n/{ => locales}/it-IT/dataset.json (100%) rename web/i18n/{ => locales}/it-IT/deployments.json (100%) rename web/i18n/{ => locales}/it-IT/device-flow.json (100%) rename web/i18n/{ => locales}/it-IT/education.json (100%) rename web/i18n/{ => locales}/it-IT/explore.json (100%) rename web/i18n/{ => locales}/it-IT/layout.json (100%) rename web/i18n/{ => locales}/it-IT/login.json (100%) rename web/i18n/{ => locales}/it-IT/oauth.json (100%) rename web/i18n/{ => locales}/it-IT/permission-keys.json (100%) rename web/i18n/{ => locales}/it-IT/permission.json (100%) rename web/i18n/{ => locales}/it-IT/pipeline.json (100%) rename web/i18n/{ => locales}/it-IT/plugin-tags.json (100%) rename web/i18n/{ => locales}/it-IT/plugin-trigger.json (100%) rename web/i18n/{ => locales}/it-IT/plugin.json (100%) rename web/i18n/{ => locales}/it-IT/register.json (100%) rename web/i18n/{ => locales}/it-IT/run-log.json (100%) rename web/i18n/{ => locales}/it-IT/share.json (100%) rename web/i18n/{ => locales}/it-IT/skill.json (100%) rename web/i18n/{ => locales}/it-IT/snippet.json (100%) rename web/i18n/{ => locales}/it-IT/time.json (100%) rename web/i18n/{ => locales}/it-IT/tools.json (100%) rename web/i18n/{ => locales}/it-IT/workflow.json (100%) rename web/i18n/{ => locales}/ja-JP/agent-v-2.json (100%) rename web/i18n/{ => locales}/ja-JP/app-annotation.json (100%) rename web/i18n/{ => locales}/ja-JP/app-api.json (100%) rename web/i18n/{ => locales}/ja-JP/app-debug.json (100%) rename web/i18n/{ => locales}/ja-JP/app-log.json (100%) rename web/i18n/{ => locales}/ja-JP/app-overview.json (100%) rename web/i18n/{ => locales}/ja-JP/app.json (100%) rename web/i18n/{ => locales}/ja-JP/billing.json (100%) rename web/i18n/{ => locales}/ja-JP/common.json (100%) rename web/i18n/{ => locales}/ja-JP/custom.json (100%) rename web/i18n/{ => locales}/ja-JP/dataset-creation.json (100%) rename web/i18n/{ => locales}/ja-JP/dataset-documents.json (100%) rename web/i18n/{ => locales}/ja-JP/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/ja-JP/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/ja-JP/dataset-settings.json (100%) rename web/i18n/{ => locales}/ja-JP/dataset.json (100%) rename web/i18n/{ => locales}/ja-JP/deployments.json (100%) rename web/i18n/{ => locales}/ja-JP/device-flow.json (100%) rename web/i18n/{ => locales}/ja-JP/education.json (100%) rename web/i18n/{ => locales}/ja-JP/explore.json (100%) rename web/i18n/{ => locales}/ja-JP/layout.json (100%) rename web/i18n/{ => locales}/ja-JP/login.json (100%) rename web/i18n/{ => locales}/ja-JP/oauth.json (100%) rename web/i18n/{ => locales}/ja-JP/permission-keys.json (100%) rename web/i18n/{ => locales}/ja-JP/permission.json (100%) rename web/i18n/{ => locales}/ja-JP/pipeline.json (100%) rename web/i18n/{ => locales}/ja-JP/plugin-tags.json (100%) rename web/i18n/{ => locales}/ja-JP/plugin-trigger.json (100%) rename web/i18n/{ => locales}/ja-JP/plugin.json (100%) rename web/i18n/{ => locales}/ja-JP/register.json (100%) rename web/i18n/{ => locales}/ja-JP/run-log.json (100%) rename web/i18n/{ => locales}/ja-JP/share.json (100%) rename web/i18n/{ => locales}/ja-JP/skill.json (100%) rename web/i18n/{ => locales}/ja-JP/snippet.json (100%) rename web/i18n/{ => locales}/ja-JP/time.json (100%) rename web/i18n/{ => locales}/ja-JP/tools.json (100%) rename web/i18n/{ => locales}/ja-JP/workflow.json (100%) rename web/i18n/{ => locales}/ko-KR/agent-v-2.json (100%) rename web/i18n/{ => locales}/ko-KR/app-annotation.json (100%) rename web/i18n/{ => locales}/ko-KR/app-api.json (100%) rename web/i18n/{ => locales}/ko-KR/app-debug.json (100%) rename web/i18n/{ => locales}/ko-KR/app-log.json (100%) rename web/i18n/{ => locales}/ko-KR/app-overview.json (100%) rename web/i18n/{ => locales}/ko-KR/app.json (100%) rename web/i18n/{ => locales}/ko-KR/billing.json (100%) rename web/i18n/{ => locales}/ko-KR/common.json (100%) rename web/i18n/{ => locales}/ko-KR/custom.json (100%) rename web/i18n/{ => locales}/ko-KR/dataset-creation.json (100%) rename web/i18n/{ => locales}/ko-KR/dataset-documents.json (100%) rename web/i18n/{ => locales}/ko-KR/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/ko-KR/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/ko-KR/dataset-settings.json (100%) rename web/i18n/{ => locales}/ko-KR/dataset.json (100%) rename web/i18n/{ => locales}/ko-KR/deployments.json (100%) rename web/i18n/{ => locales}/ko-KR/device-flow.json (100%) rename web/i18n/{ => locales}/ko-KR/education.json (100%) rename web/i18n/{ => locales}/ko-KR/explore.json (100%) rename web/i18n/{ => locales}/ko-KR/layout.json (100%) rename web/i18n/{ => locales}/ko-KR/login.json (100%) rename web/i18n/{ => locales}/ko-KR/oauth.json (100%) rename web/i18n/{ => locales}/ko-KR/permission-keys.json (100%) rename web/i18n/{ => locales}/ko-KR/permission.json (100%) rename web/i18n/{ => locales}/ko-KR/pipeline.json (100%) rename web/i18n/{ => locales}/ko-KR/plugin-tags.json (100%) rename web/i18n/{ => locales}/ko-KR/plugin-trigger.json (100%) rename web/i18n/{ => locales}/ko-KR/plugin.json (100%) rename web/i18n/{ => locales}/ko-KR/register.json (100%) rename web/i18n/{ => locales}/ko-KR/run-log.json (100%) rename web/i18n/{ => locales}/ko-KR/share.json (100%) rename web/i18n/{ => locales}/ko-KR/skill.json (100%) rename web/i18n/{ => locales}/ko-KR/snippet.json (100%) rename web/i18n/{ => locales}/ko-KR/time.json (100%) rename web/i18n/{ => locales}/ko-KR/tools.json (100%) rename web/i18n/{ => locales}/ko-KR/workflow.json (100%) rename web/i18n/{ => locales}/lo-LA/agent-v-2.json (100%) rename web/i18n/{ => locales}/lo-LA/app-annotation.json (100%) rename web/i18n/{ => locales}/lo-LA/app-api.json (100%) rename web/i18n/{ => locales}/lo-LA/app-debug.json (100%) rename web/i18n/{ => locales}/lo-LA/app-log.json (100%) rename web/i18n/{ => locales}/lo-LA/app-overview.json (100%) rename web/i18n/{ => locales}/lo-LA/app.json (100%) rename web/i18n/{ => locales}/lo-LA/billing.json (100%) rename web/i18n/{ => locales}/lo-LA/common.json (100%) rename web/i18n/{ => locales}/lo-LA/custom.json (100%) rename web/i18n/{ => locales}/lo-LA/dataset-creation.json (100%) rename web/i18n/{ => locales}/lo-LA/dataset-documents.json (100%) rename web/i18n/{ => locales}/lo-LA/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/lo-LA/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/lo-LA/dataset-settings.json (100%) rename web/i18n/{ => locales}/lo-LA/dataset.json (100%) rename web/i18n/{ => locales}/lo-LA/deployments.json (100%) rename web/i18n/{ => locales}/lo-LA/device-flow.json (100%) rename web/i18n/{ => locales}/lo-LA/education.json (100%) rename web/i18n/{ => locales}/lo-LA/explore.json (100%) rename web/i18n/{ => locales}/lo-LA/layout.json (100%) rename web/i18n/{ => locales}/lo-LA/login.json (100%) rename web/i18n/{ => locales}/lo-LA/oauth.json (100%) rename web/i18n/{ => locales}/lo-LA/permission-keys.json (100%) rename web/i18n/{ => locales}/lo-LA/permission.json (100%) rename web/i18n/{ => locales}/lo-LA/pipeline.json (100%) rename web/i18n/{ => locales}/lo-LA/plugin-tags.json (100%) rename web/i18n/{ => locales}/lo-LA/plugin-trigger.json (100%) rename web/i18n/{ => locales}/lo-LA/plugin.json (100%) rename web/i18n/{ => locales}/lo-LA/register.json (100%) rename web/i18n/{ => locales}/lo-LA/run-log.json (100%) rename web/i18n/{ => locales}/lo-LA/share.json (100%) rename web/i18n/{ => locales}/lo-LA/skill.json (100%) rename web/i18n/{ => locales}/lo-LA/snippet.json (100%) rename web/i18n/{ => locales}/lo-LA/time.json (100%) rename web/i18n/{ => locales}/lo-LA/tools.json (100%) rename web/i18n/{ => locales}/lo-LA/workflow.json (100%) rename web/i18n/{ => locales}/nl-NL/agent-v-2.json (100%) rename web/i18n/{ => locales}/nl-NL/app-annotation.json (100%) rename web/i18n/{ => locales}/nl-NL/app-api.json (100%) rename web/i18n/{ => locales}/nl-NL/app-debug.json (100%) rename web/i18n/{ => locales}/nl-NL/app-log.json (100%) rename web/i18n/{ => locales}/nl-NL/app-overview.json (100%) rename web/i18n/{ => locales}/nl-NL/app.json (100%) rename web/i18n/{ => locales}/nl-NL/billing.json (100%) rename web/i18n/{ => locales}/nl-NL/common.json (100%) rename web/i18n/{ => locales}/nl-NL/custom.json (100%) rename web/i18n/{ => locales}/nl-NL/dataset-creation.json (100%) rename web/i18n/{ => locales}/nl-NL/dataset-documents.json (100%) rename web/i18n/{ => locales}/nl-NL/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/nl-NL/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/nl-NL/dataset-settings.json (100%) rename web/i18n/{ => locales}/nl-NL/dataset.json (100%) rename web/i18n/{ => locales}/nl-NL/deployments.json (100%) rename web/i18n/{ => locales}/nl-NL/device-flow.json (100%) rename web/i18n/{ => locales}/nl-NL/education.json (100%) rename web/i18n/{ => locales}/nl-NL/explore.json (100%) rename web/i18n/{ => locales}/nl-NL/layout.json (100%) rename web/i18n/{ => locales}/nl-NL/login.json (100%) rename web/i18n/{ => locales}/nl-NL/oauth.json (100%) rename web/i18n/{ => locales}/nl-NL/permission-keys.json (100%) rename web/i18n/{ => locales}/nl-NL/permission.json (100%) rename web/i18n/{ => locales}/nl-NL/pipeline.json (100%) rename web/i18n/{ => locales}/nl-NL/plugin-tags.json (100%) rename web/i18n/{ => locales}/nl-NL/plugin-trigger.json (100%) rename web/i18n/{ => locales}/nl-NL/plugin.json (100%) rename web/i18n/{ => locales}/nl-NL/register.json (100%) rename web/i18n/{ => locales}/nl-NL/run-log.json (100%) rename web/i18n/{ => locales}/nl-NL/share.json (100%) rename web/i18n/{ => locales}/nl-NL/skill.json (100%) rename web/i18n/{ => locales}/nl-NL/snippet.json (100%) rename web/i18n/{ => locales}/nl-NL/time.json (100%) rename web/i18n/{ => locales}/nl-NL/tools.json (100%) rename web/i18n/{ => locales}/nl-NL/workflow.json (100%) rename web/i18n/{ => locales}/pl-PL/agent-v-2.json (100%) rename web/i18n/{ => locales}/pl-PL/app-annotation.json (100%) rename web/i18n/{ => locales}/pl-PL/app-api.json (100%) rename web/i18n/{ => locales}/pl-PL/app-debug.json (100%) rename web/i18n/{ => locales}/pl-PL/app-log.json (100%) rename web/i18n/{ => locales}/pl-PL/app-overview.json (100%) rename web/i18n/{ => locales}/pl-PL/app.json (100%) rename web/i18n/{ => locales}/pl-PL/billing.json (100%) rename web/i18n/{ => locales}/pl-PL/common.json (100%) rename web/i18n/{ => locales}/pl-PL/custom.json (100%) rename web/i18n/{ => locales}/pl-PL/dataset-creation.json (100%) rename web/i18n/{ => locales}/pl-PL/dataset-documents.json (100%) rename web/i18n/{ => locales}/pl-PL/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/pl-PL/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/pl-PL/dataset-settings.json (100%) rename web/i18n/{ => locales}/pl-PL/dataset.json (100%) rename web/i18n/{ => locales}/pl-PL/deployments.json (100%) rename web/i18n/{ => locales}/pl-PL/device-flow.json (100%) rename web/i18n/{ => locales}/pl-PL/education.json (100%) rename web/i18n/{ => locales}/pl-PL/explore.json (100%) rename web/i18n/{ => locales}/pl-PL/layout.json (100%) rename web/i18n/{ => locales}/pl-PL/login.json (100%) rename web/i18n/{ => locales}/pl-PL/oauth.json (100%) rename web/i18n/{ => locales}/pl-PL/permission-keys.json (100%) rename web/i18n/{ => locales}/pl-PL/permission.json (100%) rename web/i18n/{ => locales}/pl-PL/pipeline.json (100%) rename web/i18n/{ => locales}/pl-PL/plugin-tags.json (100%) rename web/i18n/{ => locales}/pl-PL/plugin-trigger.json (100%) rename web/i18n/{ => locales}/pl-PL/plugin.json (100%) rename web/i18n/{ => locales}/pl-PL/register.json (100%) rename web/i18n/{ => locales}/pl-PL/run-log.json (100%) rename web/i18n/{ => locales}/pl-PL/share.json (100%) rename web/i18n/{ => locales}/pl-PL/skill.json (100%) rename web/i18n/{ => locales}/pl-PL/snippet.json (100%) rename web/i18n/{ => locales}/pl-PL/time.json (100%) rename web/i18n/{ => locales}/pl-PL/tools.json (100%) rename web/i18n/{ => locales}/pl-PL/workflow.json (100%) rename web/i18n/{ => locales}/pt-BR/agent-v-2.json (100%) rename web/i18n/{ => locales}/pt-BR/app-annotation.json (100%) rename web/i18n/{ => locales}/pt-BR/app-api.json (100%) rename web/i18n/{ => locales}/pt-BR/app-debug.json (100%) rename web/i18n/{ => locales}/pt-BR/app-log.json (100%) rename web/i18n/{ => locales}/pt-BR/app-overview.json (100%) rename web/i18n/{ => locales}/pt-BR/app.json (100%) rename web/i18n/{ => locales}/pt-BR/billing.json (100%) rename web/i18n/{ => locales}/pt-BR/common.json (100%) rename web/i18n/{ => locales}/pt-BR/custom.json (100%) rename web/i18n/{ => locales}/pt-BR/dataset-creation.json (100%) rename web/i18n/{ => locales}/pt-BR/dataset-documents.json (100%) rename web/i18n/{ => locales}/pt-BR/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/pt-BR/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/pt-BR/dataset-settings.json (100%) rename web/i18n/{ => locales}/pt-BR/dataset.json (100%) rename web/i18n/{ => locales}/pt-BR/deployments.json (100%) rename web/i18n/{ => locales}/pt-BR/device-flow.json (100%) rename web/i18n/{ => locales}/pt-BR/education.json (100%) rename web/i18n/{ => locales}/pt-BR/explore.json (100%) rename web/i18n/{ => locales}/pt-BR/layout.json (100%) rename web/i18n/{ => locales}/pt-BR/login.json (100%) rename web/i18n/{ => locales}/pt-BR/oauth.json (100%) rename web/i18n/{ => locales}/pt-BR/permission-keys.json (100%) rename web/i18n/{ => locales}/pt-BR/permission.json (100%) rename web/i18n/{ => locales}/pt-BR/pipeline.json (100%) rename web/i18n/{ => locales}/pt-BR/plugin-tags.json (100%) rename web/i18n/{ => locales}/pt-BR/plugin-trigger.json (100%) rename web/i18n/{ => locales}/pt-BR/plugin.json (100%) rename web/i18n/{ => locales}/pt-BR/register.json (100%) rename web/i18n/{ => locales}/pt-BR/run-log.json (100%) rename web/i18n/{ => locales}/pt-BR/share.json (100%) rename web/i18n/{ => locales}/pt-BR/skill.json (100%) rename web/i18n/{ => locales}/pt-BR/snippet.json (100%) rename web/i18n/{ => locales}/pt-BR/time.json (100%) rename web/i18n/{ => locales}/pt-BR/tools.json (100%) rename web/i18n/{ => locales}/pt-BR/workflow.json (100%) rename web/i18n/{ => locales}/ro-RO/agent-v-2.json (100%) rename web/i18n/{ => locales}/ro-RO/app-annotation.json (100%) rename web/i18n/{ => locales}/ro-RO/app-api.json (100%) rename web/i18n/{ => locales}/ro-RO/app-debug.json (100%) rename web/i18n/{ => locales}/ro-RO/app-log.json (100%) rename web/i18n/{ => locales}/ro-RO/app-overview.json (100%) rename web/i18n/{ => locales}/ro-RO/app.json (100%) rename web/i18n/{ => locales}/ro-RO/billing.json (100%) rename web/i18n/{ => locales}/ro-RO/common.json (100%) rename web/i18n/{ => locales}/ro-RO/custom.json (100%) rename web/i18n/{ => locales}/ro-RO/dataset-creation.json (100%) rename web/i18n/{ => locales}/ro-RO/dataset-documents.json (100%) rename web/i18n/{ => locales}/ro-RO/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/ro-RO/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/ro-RO/dataset-settings.json (100%) rename web/i18n/{ => locales}/ro-RO/dataset.json (100%) rename web/i18n/{ => locales}/ro-RO/deployments.json (100%) rename web/i18n/{ => locales}/ro-RO/device-flow.json (100%) rename web/i18n/{ => locales}/ro-RO/education.json (100%) rename web/i18n/{ => locales}/ro-RO/explore.json (100%) rename web/i18n/{ => locales}/ro-RO/layout.json (100%) rename web/i18n/{ => locales}/ro-RO/login.json (100%) rename web/i18n/{ => locales}/ro-RO/oauth.json (100%) rename web/i18n/{ => locales}/ro-RO/permission-keys.json (100%) rename web/i18n/{ => locales}/ro-RO/permission.json (100%) rename web/i18n/{ => locales}/ro-RO/pipeline.json (100%) rename web/i18n/{ => locales}/ro-RO/plugin-tags.json (100%) rename web/i18n/{ => locales}/ro-RO/plugin-trigger.json (100%) rename web/i18n/{ => locales}/ro-RO/plugin.json (100%) rename web/i18n/{ => locales}/ro-RO/register.json (100%) rename web/i18n/{ => locales}/ro-RO/run-log.json (100%) rename web/i18n/{ => locales}/ro-RO/share.json (100%) rename web/i18n/{ => locales}/ro-RO/skill.json (100%) rename web/i18n/{ => locales}/ro-RO/snippet.json (100%) rename web/i18n/{ => locales}/ro-RO/time.json (100%) rename web/i18n/{ => locales}/ro-RO/tools.json (100%) rename web/i18n/{ => locales}/ro-RO/workflow.json (100%) rename web/i18n/{ => locales}/ru-RU/agent-v-2.json (100%) rename web/i18n/{ => locales}/ru-RU/app-annotation.json (100%) rename web/i18n/{ => locales}/ru-RU/app-api.json (100%) rename web/i18n/{ => locales}/ru-RU/app-debug.json (100%) rename web/i18n/{ => locales}/ru-RU/app-log.json (100%) rename web/i18n/{ => locales}/ru-RU/app-overview.json (100%) rename web/i18n/{ => locales}/ru-RU/app.json (100%) rename web/i18n/{ => locales}/ru-RU/billing.json (100%) rename web/i18n/{ => locales}/ru-RU/common.json (100%) rename web/i18n/{ => locales}/ru-RU/custom.json (100%) rename web/i18n/{ => locales}/ru-RU/dataset-creation.json (100%) rename web/i18n/{ => locales}/ru-RU/dataset-documents.json (100%) rename web/i18n/{ => locales}/ru-RU/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/ru-RU/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/ru-RU/dataset-settings.json (100%) rename web/i18n/{ => locales}/ru-RU/dataset.json (100%) rename web/i18n/{ => locales}/ru-RU/deployments.json (100%) rename web/i18n/{ => locales}/ru-RU/device-flow.json (100%) rename web/i18n/{ => locales}/ru-RU/education.json (100%) rename web/i18n/{ => locales}/ru-RU/explore.json (100%) rename web/i18n/{ => locales}/ru-RU/layout.json (100%) rename web/i18n/{ => locales}/ru-RU/login.json (100%) rename web/i18n/{ => locales}/ru-RU/oauth.json (100%) rename web/i18n/{ => locales}/ru-RU/permission-keys.json (100%) rename web/i18n/{ => locales}/ru-RU/permission.json (100%) rename web/i18n/{ => locales}/ru-RU/pipeline.json (100%) rename web/i18n/{ => locales}/ru-RU/plugin-tags.json (100%) rename web/i18n/{ => locales}/ru-RU/plugin-trigger.json (100%) rename web/i18n/{ => locales}/ru-RU/plugin.json (100%) rename web/i18n/{ => locales}/ru-RU/register.json (100%) rename web/i18n/{ => locales}/ru-RU/run-log.json (100%) rename web/i18n/{ => locales}/ru-RU/share.json (100%) rename web/i18n/{ => locales}/ru-RU/skill.json (100%) rename web/i18n/{ => locales}/ru-RU/snippet.json (100%) rename web/i18n/{ => locales}/ru-RU/time.json (100%) rename web/i18n/{ => locales}/ru-RU/tools.json (100%) rename web/i18n/{ => locales}/ru-RU/workflow.json (100%) rename web/i18n/{ => locales}/sl-SI/agent-v-2.json (100%) rename web/i18n/{ => locales}/sl-SI/app-annotation.json (100%) rename web/i18n/{ => locales}/sl-SI/app-api.json (100%) rename web/i18n/{ => locales}/sl-SI/app-debug.json (100%) rename web/i18n/{ => locales}/sl-SI/app-log.json (100%) rename web/i18n/{ => locales}/sl-SI/app-overview.json (100%) rename web/i18n/{ => locales}/sl-SI/app.json (100%) rename web/i18n/{ => locales}/sl-SI/billing.json (100%) rename web/i18n/{ => locales}/sl-SI/common.json (100%) rename web/i18n/{ => locales}/sl-SI/custom.json (100%) rename web/i18n/{ => locales}/sl-SI/dataset-creation.json (100%) rename web/i18n/{ => locales}/sl-SI/dataset-documents.json (100%) rename web/i18n/{ => locales}/sl-SI/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/sl-SI/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/sl-SI/dataset-settings.json (100%) rename web/i18n/{ => locales}/sl-SI/dataset.json (100%) rename web/i18n/{ => locales}/sl-SI/deployments.json (100%) rename web/i18n/{ => locales}/sl-SI/device-flow.json (100%) rename web/i18n/{ => locales}/sl-SI/education.json (100%) rename web/i18n/{ => locales}/sl-SI/explore.json (100%) rename web/i18n/{ => locales}/sl-SI/layout.json (100%) rename web/i18n/{ => locales}/sl-SI/login.json (100%) rename web/i18n/{ => locales}/sl-SI/oauth.json (100%) rename web/i18n/{ => locales}/sl-SI/permission-keys.json (100%) rename web/i18n/{ => locales}/sl-SI/permission.json (100%) rename web/i18n/{ => locales}/sl-SI/pipeline.json (100%) rename web/i18n/{ => locales}/sl-SI/plugin-tags.json (100%) rename web/i18n/{ => locales}/sl-SI/plugin-trigger.json (100%) rename web/i18n/{ => locales}/sl-SI/plugin.json (100%) rename web/i18n/{ => locales}/sl-SI/register.json (100%) rename web/i18n/{ => locales}/sl-SI/run-log.json (100%) rename web/i18n/{ => locales}/sl-SI/share.json (100%) rename web/i18n/{ => locales}/sl-SI/skill.json (100%) rename web/i18n/{ => locales}/sl-SI/snippet.json (100%) rename web/i18n/{ => locales}/sl-SI/time.json (100%) rename web/i18n/{ => locales}/sl-SI/tools.json (100%) rename web/i18n/{ => locales}/sl-SI/workflow.json (100%) rename web/i18n/{ => locales}/th-TH/agent-v-2.json (100%) rename web/i18n/{ => locales}/th-TH/app-annotation.json (100%) rename web/i18n/{ => locales}/th-TH/app-api.json (100%) rename web/i18n/{ => locales}/th-TH/app-debug.json (100%) rename web/i18n/{ => locales}/th-TH/app-log.json (100%) rename web/i18n/{ => locales}/th-TH/app-overview.json (100%) rename web/i18n/{ => locales}/th-TH/app.json (100%) rename web/i18n/{ => locales}/th-TH/billing.json (100%) rename web/i18n/{ => locales}/th-TH/common.json (100%) rename web/i18n/{ => locales}/th-TH/custom.json (100%) rename web/i18n/{ => locales}/th-TH/dataset-creation.json (100%) rename web/i18n/{ => locales}/th-TH/dataset-documents.json (100%) rename web/i18n/{ => locales}/th-TH/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/th-TH/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/th-TH/dataset-settings.json (100%) rename web/i18n/{ => locales}/th-TH/dataset.json (100%) rename web/i18n/{ => locales}/th-TH/deployments.json (100%) rename web/i18n/{ => locales}/th-TH/device-flow.json (100%) rename web/i18n/{ => locales}/th-TH/education.json (100%) rename web/i18n/{ => locales}/th-TH/explore.json (100%) rename web/i18n/{ => locales}/th-TH/layout.json (100%) rename web/i18n/{ => locales}/th-TH/login.json (100%) rename web/i18n/{ => locales}/th-TH/oauth.json (100%) rename web/i18n/{ => locales}/th-TH/permission-keys.json (100%) rename web/i18n/{ => locales}/th-TH/permission.json (100%) rename web/i18n/{ => locales}/th-TH/pipeline.json (100%) rename web/i18n/{ => locales}/th-TH/plugin-tags.json (100%) rename web/i18n/{ => locales}/th-TH/plugin-trigger.json (100%) rename web/i18n/{ => locales}/th-TH/plugin.json (100%) rename web/i18n/{ => locales}/th-TH/register.json (100%) rename web/i18n/{ => locales}/th-TH/run-log.json (100%) rename web/i18n/{ => locales}/th-TH/share.json (100%) rename web/i18n/{ => locales}/th-TH/skill.json (100%) rename web/i18n/{ => locales}/th-TH/snippet.json (100%) rename web/i18n/{ => locales}/th-TH/time.json (100%) rename web/i18n/{ => locales}/th-TH/tools.json (100%) rename web/i18n/{ => locales}/th-TH/workflow.json (100%) rename web/i18n/{ => locales}/tr-TR/agent-v-2.json (100%) rename web/i18n/{ => locales}/tr-TR/app-annotation.json (100%) rename web/i18n/{ => locales}/tr-TR/app-api.json (100%) rename web/i18n/{ => locales}/tr-TR/app-debug.json (100%) rename web/i18n/{ => locales}/tr-TR/app-log.json (100%) rename web/i18n/{ => locales}/tr-TR/app-overview.json (100%) rename web/i18n/{ => locales}/tr-TR/app.json (100%) rename web/i18n/{ => locales}/tr-TR/billing.json (100%) rename web/i18n/{ => locales}/tr-TR/common.json (100%) rename web/i18n/{ => locales}/tr-TR/custom.json (100%) rename web/i18n/{ => locales}/tr-TR/dataset-creation.json (100%) rename web/i18n/{ => locales}/tr-TR/dataset-documents.json (100%) rename web/i18n/{ => locales}/tr-TR/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/tr-TR/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/tr-TR/dataset-settings.json (100%) rename web/i18n/{ => locales}/tr-TR/dataset.json (100%) rename web/i18n/{ => locales}/tr-TR/deployments.json (100%) rename web/i18n/{ => locales}/tr-TR/device-flow.json (100%) rename web/i18n/{ => locales}/tr-TR/education.json (100%) rename web/i18n/{ => locales}/tr-TR/explore.json (100%) rename web/i18n/{ => locales}/tr-TR/layout.json (100%) rename web/i18n/{ => locales}/tr-TR/login.json (100%) rename web/i18n/{ => locales}/tr-TR/oauth.json (100%) rename web/i18n/{ => locales}/tr-TR/permission-keys.json (100%) rename web/i18n/{ => locales}/tr-TR/permission.json (100%) rename web/i18n/{ => locales}/tr-TR/pipeline.json (100%) rename web/i18n/{ => locales}/tr-TR/plugin-tags.json (100%) rename web/i18n/{ => locales}/tr-TR/plugin-trigger.json (100%) rename web/i18n/{ => locales}/tr-TR/plugin.json (100%) rename web/i18n/{ => locales}/tr-TR/register.json (100%) rename web/i18n/{ => locales}/tr-TR/run-log.json (100%) rename web/i18n/{ => locales}/tr-TR/share.json (100%) rename web/i18n/{ => locales}/tr-TR/skill.json (100%) rename web/i18n/{ => locales}/tr-TR/snippet.json (100%) rename web/i18n/{ => locales}/tr-TR/time.json (100%) rename web/i18n/{ => locales}/tr-TR/tools.json (100%) rename web/i18n/{ => locales}/tr-TR/workflow.json (100%) rename web/i18n/{ => locales}/uk-UA/agent-v-2.json (100%) rename web/i18n/{ => locales}/uk-UA/app-annotation.json (100%) rename web/i18n/{ => locales}/uk-UA/app-api.json (100%) rename web/i18n/{ => locales}/uk-UA/app-debug.json (100%) rename web/i18n/{ => locales}/uk-UA/app-log.json (100%) rename web/i18n/{ => locales}/uk-UA/app-overview.json (100%) rename web/i18n/{ => locales}/uk-UA/app.json (100%) rename web/i18n/{ => locales}/uk-UA/billing.json (100%) rename web/i18n/{ => locales}/uk-UA/common.json (100%) rename web/i18n/{ => locales}/uk-UA/custom.json (100%) rename web/i18n/{ => locales}/uk-UA/dataset-creation.json (100%) rename web/i18n/{ => locales}/uk-UA/dataset-documents.json (100%) rename web/i18n/{ => locales}/uk-UA/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/uk-UA/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/uk-UA/dataset-settings.json (100%) rename web/i18n/{ => locales}/uk-UA/dataset.json (100%) rename web/i18n/{ => locales}/uk-UA/deployments.json (100%) rename web/i18n/{ => locales}/uk-UA/device-flow.json (100%) rename web/i18n/{ => locales}/uk-UA/education.json (100%) rename web/i18n/{ => locales}/uk-UA/explore.json (100%) rename web/i18n/{ => locales}/uk-UA/layout.json (100%) rename web/i18n/{ => locales}/uk-UA/login.json (100%) rename web/i18n/{ => locales}/uk-UA/oauth.json (100%) rename web/i18n/{ => locales}/uk-UA/permission-keys.json (100%) rename web/i18n/{ => locales}/uk-UA/permission.json (100%) rename web/i18n/{ => locales}/uk-UA/pipeline.json (100%) rename web/i18n/{ => locales}/uk-UA/plugin-tags.json (100%) rename web/i18n/{ => locales}/uk-UA/plugin-trigger.json (100%) rename web/i18n/{ => locales}/uk-UA/plugin.json (100%) rename web/i18n/{ => locales}/uk-UA/register.json (100%) rename web/i18n/{ => locales}/uk-UA/run-log.json (100%) rename web/i18n/{ => locales}/uk-UA/share.json (100%) rename web/i18n/{ => locales}/uk-UA/skill.json (100%) rename web/i18n/{ => locales}/uk-UA/snippet.json (100%) rename web/i18n/{ => locales}/uk-UA/time.json (100%) rename web/i18n/{ => locales}/uk-UA/tools.json (100%) rename web/i18n/{ => locales}/uk-UA/workflow.json (100%) rename web/i18n/{ => locales}/vi-VN/agent-v-2.json (100%) rename web/i18n/{ => locales}/vi-VN/app-annotation.json (100%) rename web/i18n/{ => locales}/vi-VN/app-api.json (100%) rename web/i18n/{ => locales}/vi-VN/app-debug.json (100%) rename web/i18n/{ => locales}/vi-VN/app-log.json (100%) rename web/i18n/{ => locales}/vi-VN/app-overview.json (100%) rename web/i18n/{ => locales}/vi-VN/app.json (100%) rename web/i18n/{ => locales}/vi-VN/billing.json (100%) rename web/i18n/{ => locales}/vi-VN/common.json (100%) rename web/i18n/{ => locales}/vi-VN/custom.json (100%) rename web/i18n/{ => locales}/vi-VN/dataset-creation.json (100%) rename web/i18n/{ => locales}/vi-VN/dataset-documents.json (100%) rename web/i18n/{ => locales}/vi-VN/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/vi-VN/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/vi-VN/dataset-settings.json (100%) rename web/i18n/{ => locales}/vi-VN/dataset.json (100%) rename web/i18n/{ => locales}/vi-VN/deployments.json (100%) rename web/i18n/{ => locales}/vi-VN/device-flow.json (100%) rename web/i18n/{ => locales}/vi-VN/education.json (100%) rename web/i18n/{ => locales}/vi-VN/explore.json (100%) rename web/i18n/{ => locales}/vi-VN/layout.json (100%) rename web/i18n/{ => locales}/vi-VN/login.json (100%) rename web/i18n/{ => locales}/vi-VN/oauth.json (100%) rename web/i18n/{ => locales}/vi-VN/permission-keys.json (100%) rename web/i18n/{ => locales}/vi-VN/permission.json (100%) rename web/i18n/{ => locales}/vi-VN/pipeline.json (100%) rename web/i18n/{ => locales}/vi-VN/plugin-tags.json (100%) rename web/i18n/{ => locales}/vi-VN/plugin-trigger.json (100%) rename web/i18n/{ => locales}/vi-VN/plugin.json (100%) rename web/i18n/{ => locales}/vi-VN/register.json (100%) rename web/i18n/{ => locales}/vi-VN/run-log.json (100%) rename web/i18n/{ => locales}/vi-VN/share.json (100%) rename web/i18n/{ => locales}/vi-VN/skill.json (100%) rename web/i18n/{ => locales}/vi-VN/snippet.json (100%) rename web/i18n/{ => locales}/vi-VN/time.json (100%) rename web/i18n/{ => locales}/vi-VN/tools.json (100%) rename web/i18n/{ => locales}/vi-VN/workflow.json (100%) rename web/i18n/{ => locales}/zh-Hans/agent-v-2.json (100%) rename web/i18n/{ => locales}/zh-Hans/app-annotation.json (100%) rename web/i18n/{ => locales}/zh-Hans/app-api.json (100%) rename web/i18n/{ => locales}/zh-Hans/app-debug.json (100%) rename web/i18n/{ => locales}/zh-Hans/app-log.json (100%) rename web/i18n/{ => locales}/zh-Hans/app-overview.json (100%) rename web/i18n/{ => locales}/zh-Hans/app.json (100%) rename web/i18n/{ => locales}/zh-Hans/billing.json (100%) rename web/i18n/{ => locales}/zh-Hans/common.json (100%) rename web/i18n/{ => locales}/zh-Hans/custom.json (100%) rename web/i18n/{ => locales}/zh-Hans/dataset-creation.json (100%) rename web/i18n/{ => locales}/zh-Hans/dataset-documents.json (100%) rename web/i18n/{ => locales}/zh-Hans/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/zh-Hans/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/zh-Hans/dataset-settings.json (100%) rename web/i18n/{ => locales}/zh-Hans/dataset.json (100%) rename web/i18n/{ => locales}/zh-Hans/deployments.json (100%) rename web/i18n/{ => locales}/zh-Hans/device-flow.json (100%) rename web/i18n/{ => locales}/zh-Hans/education.json (100%) rename web/i18n/{ => locales}/zh-Hans/explore.json (100%) rename web/i18n/{ => locales}/zh-Hans/layout.json (100%) rename web/i18n/{ => locales}/zh-Hans/login.json (100%) rename web/i18n/{ => locales}/zh-Hans/oauth.json (100%) rename web/i18n/{ => locales}/zh-Hans/permission-keys.json (100%) rename web/i18n/{ => locales}/zh-Hans/permission.json (100%) rename web/i18n/{ => locales}/zh-Hans/pipeline.json (100%) rename web/i18n/{ => locales}/zh-Hans/plugin-tags.json (100%) rename web/i18n/{ => locales}/zh-Hans/plugin-trigger.json (100%) rename web/i18n/{ => locales}/zh-Hans/plugin.json (100%) rename web/i18n/{ => locales}/zh-Hans/register.json (100%) rename web/i18n/{ => locales}/zh-Hans/run-log.json (100%) rename web/i18n/{ => locales}/zh-Hans/share.json (100%) rename web/i18n/{ => locales}/zh-Hans/skill.json (100%) rename web/i18n/{ => locales}/zh-Hans/snippet.json (100%) rename web/i18n/{ => locales}/zh-Hans/time.json (100%) rename web/i18n/{ => locales}/zh-Hans/tools.json (100%) rename web/i18n/{ => locales}/zh-Hans/workflow.json (100%) rename web/i18n/{ => locales}/zh-Hant/agent-v-2.json (100%) rename web/i18n/{ => locales}/zh-Hant/app-annotation.json (100%) rename web/i18n/{ => locales}/zh-Hant/app-api.json (100%) rename web/i18n/{ => locales}/zh-Hant/app-debug.json (100%) rename web/i18n/{ => locales}/zh-Hant/app-log.json (100%) rename web/i18n/{ => locales}/zh-Hant/app-overview.json (100%) rename web/i18n/{ => locales}/zh-Hant/app.json (100%) rename web/i18n/{ => locales}/zh-Hant/billing.json (100%) rename web/i18n/{ => locales}/zh-Hant/common.json (100%) rename web/i18n/{ => locales}/zh-Hant/custom.json (100%) rename web/i18n/{ => locales}/zh-Hant/dataset-creation.json (100%) rename web/i18n/{ => locales}/zh-Hant/dataset-documents.json (100%) rename web/i18n/{ => locales}/zh-Hant/dataset-hit-testing.json (100%) rename web/i18n/{ => locales}/zh-Hant/dataset-pipeline.json (100%) rename web/i18n/{ => locales}/zh-Hant/dataset-settings.json (100%) rename web/i18n/{ => locales}/zh-Hant/dataset.json (100%) rename web/i18n/{ => locales}/zh-Hant/deployments.json (100%) rename web/i18n/{ => locales}/zh-Hant/device-flow.json (100%) rename web/i18n/{ => locales}/zh-Hant/education.json (100%) rename web/i18n/{ => locales}/zh-Hant/explore.json (100%) rename web/i18n/{ => locales}/zh-Hant/layout.json (100%) rename web/i18n/{ => locales}/zh-Hant/login.json (100%) rename web/i18n/{ => locales}/zh-Hant/oauth.json (100%) rename web/i18n/{ => locales}/zh-Hant/permission-keys.json (100%) rename web/i18n/{ => locales}/zh-Hant/permission.json (100%) rename web/i18n/{ => locales}/zh-Hant/pipeline.json (100%) rename web/i18n/{ => locales}/zh-Hant/plugin-tags.json (100%) rename web/i18n/{ => locales}/zh-Hant/plugin-trigger.json (100%) rename web/i18n/{ => locales}/zh-Hant/plugin.json (100%) rename web/i18n/{ => locales}/zh-Hant/register.json (100%) rename web/i18n/{ => locales}/zh-Hant/run-log.json (100%) rename web/i18n/{ => locales}/zh-Hant/share.json (100%) rename web/i18n/{ => locales}/zh-Hant/skill.json (100%) rename web/i18n/{ => locales}/zh-Hant/snippet.json (100%) rename web/i18n/{ => locales}/zh-Hant/time.json (100%) rename web/i18n/{ => locales}/zh-Hant/tools.json (100%) rename web/i18n/{ => locales}/zh-Hant/workflow.json (100%) rename web/{i18n-config => i18n}/metadata.ts (100%) rename web/{i18n-config => i18n}/resources.ts (63%) rename web/{i18n-config => i18n}/server.ts (100%) rename web/{i18n-config => i18n}/settings.ts (100%) diff --git a/.github/scripts/generate-i18n-changes.mjs b/.github/scripts/generate-i18n-changes.mjs index 9fb3f979db9..5bd8eb30c26 100644 --- a/.github/scripts/generate-i18n-changes.mjs +++ b/.github/scripts/generate-i18n-changes.mjs @@ -8,7 +8,8 @@ const headSha = process.env.HEAD_SHA || '' const files = (process.env.CHANGED_FILES || '').split(/\s+/).filter(Boolean) const outputPath = process.env.I18N_CHANGES_OUTPUT_PATH || '/tmp/i18n-changes.json' -const englishPath = (fileStem) => path.join(repoRoot, 'web', 'i18n', 'en-US', `${fileStem}.json`) +const englishPath = (fileStem) => + path.join(repoRoot, 'web', 'i18n', 'locales', 'en-US', `${fileStem}.json`) const readCurrentJson = (fileStem) => { const filePath = englishPath(fileStem) @@ -21,7 +22,7 @@ const readBaseJson = (fileStem) => { if (!baseSha) return null try { - const relativePath = `web/i18n/en-US/${fileStem}.json` + const relativePath = `web/i18n/locales/en-US/${fileStem}.json` const content = execFileSync('git', ['show', `${baseSha}:${relativePath}`], { encoding: 'utf8', }) diff --git a/.github/workflows/post-merge.yml b/.github/workflows/post-merge.yml index 89c06f6e5ed..b84461ce3b4 100644 --- a/.github/workflows/post-merge.yml +++ b/.github/workflows/post-merge.yml @@ -100,8 +100,8 @@ jobs: - 'web/app/components/workflow/hooks/use-nodes-sync-draft.ts' - 'web/app/components/workflow/nodes/_base/**' - 'web/app/components/workflow/nodes/agent-v2/**' - - 'web/i18n/en-US/agent-v-2.json' - - 'web/i18n/en-US/common.json' + - 'web/i18n/locales/en-US/agent-v-2.json' + - 'web/i18n/locales/en-US/common.json' - 'web/service/base.ts' - 'web/service/console/**' - 'web/service/share.ts' diff --git a/.github/workflows/translate-i18n-claude.yml b/.github/workflows/translate-i18n-claude.yml index f2d1114ae17..f9aef3c605a 100644 --- a/.github/workflows/translate-i18n-claude.yml +++ b/.github/workflows/translate-i18n-claude.yml @@ -69,7 +69,7 @@ jobs: /supported: true/ && value != \"en-US\" { printf \"%s \", value } - " web/i18n-config/languages.ts | sed 's/[[:space:]]*$//') + " web/i18n/languages.ts | sed 's/[[:space:]]*$//') generate_changes_json() { node .github/scripts/generate-i18n-changes.mjs @@ -110,9 +110,9 @@ jobs: elif [ "$SYNC_MODE" = "incremental" ]; then BASE_SHA=$(git rev-parse HEAD~1 2>/dev/null || true) if [ -n "$BASE_SHA" ]; then - CHANGED_FILES=$(git diff --name-only "$BASE_SHA" "$HEAD_SHA" -- 'web/i18n/en-US/*.json' 2>/dev/null | sed -n 's@^.*/@@p' | sed 's/\.json$//' | tr '\n' ' ' | sed 's/[[:space:]]*$//') + CHANGED_FILES=$(git diff --name-only --find-renames=100% --diff-filter=AMDT "$BASE_SHA" "$HEAD_SHA" -- 'web/i18n/' 2>/dev/null | sed -n '\@^web/i18n/locales/en-US/[^/]*\.json$@p' | sed -n 's@^.*/@@p' | sed 's/\.json$//' | tr '\n' ' ' | sed 's/[[:space:]]*$//') else - CHANGED_FILES=$(find web/i18n/en-US -maxdepth 1 -type f -name '*.json' -print | sed -n 's@^.*/@@p' | sed 's/\.json$//' | sort | tr '\n' ' ' | sed 's/[[:space:]]*$//') + CHANGED_FILES=$(find web/i18n/locales/en-US -maxdepth 1 -type f -name '*.json' -print | sed -n 's@^.*/@@p' | sed 's/\.json$//' | sort | tr '\n' ' ' | sed 's/[[:space:]]*$//') fi elif [ "$SYNC_MODE" = "full" ]; then echo "workflow_dispatch full mode requires the files input to stay within CI limits." >&2 @@ -170,12 +170,12 @@ jobs: show_full_output: ${{ github.event_name == 'workflow_dispatch' }} prompt: | You are the i18n sync agent for the Dify repository. - Your job is to keep translations synchronized with the English source files under `${{ github.workspace }}/web/i18n/en-US/`. + Your job is to keep translations synchronized with the English source files under `${{ github.workspace }}/web/i18n/locales/en-US/`. Use absolute paths at all times: - Repo root: `${{ github.workspace }}` - Web directory: `${{ github.workspace }}/web` - - Language config: `${{ github.workspace }}/web/i18n-config/languages.ts` + - Language config: `${{ github.workspace }}/web/i18n/languages.ts` Inputs: - Files in scope: `${{ steps.context.outputs.CHANGED_FILES }}` @@ -198,12 +198,12 @@ jobs: Required execution plan: 1. Resolve target languages. - Use the provided `Target languages` value as the source of truth. - - If it is unexpectedly empty, read `${{ github.workspace }}/web/i18n-config/languages.ts` and use every language with `supported: true` except `en-US`. + - If it is unexpectedly empty, read `${{ github.workspace }}/web/i18n/languages.ts` and use every language with `supported: true` except `en-US`. 2. Stay strictly in scope. - Only process the files listed in `Files in scope`. - Only process the resolved target languages, never `en-US`. - Do not touch unrelated i18n files. - - Do not modify `${{ github.workspace }}/web/i18n/en-US/`. + - Do not modify `${{ github.workspace }}/web/i18n/locales/en-US/`. 3. Resolve source changes. - If `Structured change set available` is `true`, read `/tmp/i18n-changes.json` and use it as the source of truth for file-level and key-level changes. - For each file entry: @@ -227,7 +227,7 @@ jobs: - Match the existing terminology and register used by each locale. - Prefer one Edit per file when stable, but prioritize correctness over batching. 6. Verify only the edited files. - - Run `vp fmt ` + - Run `vp fmt ` - Run `vp run dify-web#i18n:check ${{ steps.context.outputs.FILE_ARGS }} ${{ steps.context.outputs.LANG_ARGS }}` - If verification fails, fix the remaining problems before continuing. 7. Stop after the scoped locale files are updated and verification passes. @@ -241,7 +241,7 @@ jobs: if: steps.context.outputs.CHANGED_FILES != '' shell: bash run: | - if [ -z "$(git -C "${{ github.workspace }}" status --porcelain -- web/i18n/)" ]; then + if [ -z "$(git -C "${{ github.workspace }}" status --porcelain -- web/i18n/locales/)" ]; then echo "has_changes=false" >> "$GITHUB_OUTPUT" exit 0 fi @@ -260,7 +260,7 @@ jobs: shell: bash run: | git -C "${{ github.workspace }}" checkout -B "${{ steps.pr_meta.outputs.branch_name }}" - git -C "${{ github.workspace }}" add web/i18n/ + git -C "${{ github.workspace }}" add web/i18n/locales/ git -C "${{ github.workspace }}" commit -m "chore(i18n): sync translations with en-US" - name: Push translation branch @@ -326,7 +326,7 @@ jobs: '## Verification', '', `- \`vp run dify-web#i18n:check --file ${process.env.FILES_IN_SCOPE} --lang ${process.env.TARGET_LANGS}\``, - `- \`vp fmt \``, + `- \`vp fmt \``, '', '## Notes', '', diff --git a/.github/workflows/trigger-i18n-sync.yml b/.github/workflows/trigger-i18n-sync.yml index 6cb096562ff..c576094d3b8 100644 --- a/.github/workflows/trigger-i18n-sync.yml +++ b/.github/workflows/trigger-i18n-sync.yml @@ -4,7 +4,7 @@ on: push: branches: [main] paths: - - 'web/i18n/en-US/*.json' + - 'web/i18n/locales/en-US/*.json' permissions: contents: write @@ -36,9 +36,9 @@ jobs: HEAD_SHA="${{ github.sha }}" if [ -n "$BASE_SHA" ]; then - CHANGED_FILES=$(git diff --name-only "$BASE_SHA" "$HEAD_SHA" -- 'web/i18n/en-US/*.json' 2>/dev/null | sed -n 's@^.*/@@p' | sed 's/\.json$//' | tr '\n' ' ' | sed 's/[[:space:]]*$//') + CHANGED_FILES=$(git diff --name-only --find-renames=100% --diff-filter=AMDT "$BASE_SHA" "$HEAD_SHA" -- 'web/i18n/' 2>/dev/null | sed -n '\@^web/i18n/locales/en-US/[^/]*\.json$@p' | sed -n 's@^.*/@@p' | sed 's/\.json$//' | tr '\n' ' ' | sed 's/[[:space:]]*$//') else - CHANGED_FILES=$(find web/i18n/en-US -maxdepth 1 -type f -name '*.json' -print | sed -n 's@^.*/@@p' | sed 's/\.json$//' | sort | tr '\n' ' ' | sed 's/[[:space:]]*$//') + CHANGED_FILES=$(find web/i18n/locales/en-US -maxdepth 1 -type f -name '*.json' -print | sed -n 's@^.*/@@p' | sed 's/\.json$//' | sort | tr '\n' ' ' | sed 's/[[:space:]]*$//') fi export BASE_SHA HEAD_SHA CHANGED_FILES diff --git a/README.md b/README.md index 410ade141eb..0b4df324ba5 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ Dify welcomes contributions of all kinds: - **Code**: Read the [Contribution Guide](CONTRIBUTING.md), then browse [good first issues](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). - **Ideas and feedback**: Start or join a [GitHub Discussion](https://github.com/langgenius/dify/discussions). -- **Translations**: Follow the [internationalization guide](web/i18n-config/README.md) to add or update a locale. +- **Translations**: Follow the [internationalization guide](web/i18n/README.md) to add or update a locale. - **Community**: Share the apps you build, help other users, and spread the word about Dify. ### Contributors diff --git a/docs/ar-SA/README.md b/docs/ar-SA/README.md index 47ec128c0ac..b095b2d850d 100644 --- a/docs/ar-SA/README.md +++ b/docs/ar-SA/README.md @@ -129,7 +129,7 @@ docker compose up -d - **الشفرة البرمجية**: اقرأ [دليل المساهمة](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md)، ثم تصفح [المشكلات المناسبة للمساهمين الجدد](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). - **الأفكار والملاحظات**: ابدأ أو انضم إلى [مناقشة على GitHub](https://github.com/langgenius/dify/discussions). -- **الترجمات**: اتبع [دليل التدويل](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) لإضافة لغة أو تحديثها. +- **الترجمات**: اتبع [دليل التدويل](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) لإضافة لغة أو تحديثها. - **المجتمع**: شارك التطبيقات التي تبنيها، وساعد المستخدمين الآخرين، وساهم في نشر Dify. ### المساهمون diff --git a/docs/bn-BD/README.md b/docs/bn-BD/README.md index 2e30e5ee25b..91dc71bd034 100644 --- a/docs/bn-BD/README.md +++ b/docs/bn-BD/README.md @@ -145,7 +145,7 @@ Dify সব ধরনের অবদানকে স্বাগত জান - **কোড**: [অবদান নির্দেশিকা](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) পড়ুন, তারপর [নতুন অবদানকারীদের উপযোগী সমস্যাগুলো](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22) দেখুন। - **ধারণা ও প্রতিক্রিয়া**: একটি [GitHub আলোচনা](https://github.com/langgenius/dify/discussions) শুরু করুন বা বিদ্যমান আলোচনায় যোগ দিন। -- **অনুবাদ**: কোনো লোকেল যোগ বা হালনাগাদ করতে [আন্তর্জাতিকীকরণ নির্দেশিকা](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) অনুসরণ করুন। +- **অনুবাদ**: কোনো লোকেল যোগ বা হালনাগাদ করতে [আন্তর্জাতিকীকরণ নির্দেশিকা](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) অনুসরণ করুন। - **কমিউনিটি**: আপনার তৈরি অ্যাপ শেয়ার করুন, অন্য ব্যবহারকারীদের সাহায্য করুন এবং Dify সম্পর্কে সবাইকে জানান। ### অবদানকারীরা diff --git a/docs/de-DE/README.md b/docs/de-DE/README.md index 1608b0106e6..7f295d84534 100644 --- a/docs/de-DE/README.md +++ b/docs/de-DE/README.md @@ -144,7 +144,7 @@ Dify freut sich über Beiträge jeder Art: - **Code**: Lesen Sie den [Contribution Guide](./CONTRIBUTING.md) und stöbern Sie anschließend in den [Good First Issues](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). - **Ideen und Feedback**: Starten Sie eine [GitHub-Diskussion](https://github.com/langgenius/dify/discussions) oder beteiligen Sie sich an einer bestehenden. -- **Übersetzungen**: Folgen Sie dem [Internationalisierungsleitfaden](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md), um eine Sprache hinzuzufügen oder zu aktualisieren. +- **Übersetzungen**: Folgen Sie dem [Internationalisierungsleitfaden](https://github.com/langgenius/dify/blob/main/web/i18n/README.md), um eine Sprache hinzuzufügen oder zu aktualisieren. - **Community**: Teilen Sie Ihre Apps, helfen Sie anderen Nutzern und machen Sie Dify bekannter. ### Mitwirkende diff --git a/docs/es-ES/README.md b/docs/es-ES/README.md index fb914dc1be7..f578318ba65 100644 --- a/docs/es-ES/README.md +++ b/docs/es-ES/README.md @@ -140,7 +140,7 @@ Dify acepta contribuciones de todo tipo: - **Código**: Lee la [Guía de contribución](./CONTRIBUTING.md) y consulta las [incidencias para principiantes](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). - **Ideas y comentarios**: Inicia o únete a una [discusión en GitHub](https://github.com/langgenius/dify/discussions). -- **Traducciones**: Sigue la [guía de internacionalización](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) para añadir o actualizar un idioma. +- **Traducciones**: Sigue la [guía de internacionalización](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) para añadir o actualizar un idioma. - **Comunidad**: Comparte las aplicaciones que crees, ayuda a otros usuarios y da a conocer Dify. ### Contribuidores diff --git a/docs/fr-FR/README.md b/docs/fr-FR/README.md index 8d9f3941f8e..72b4fc3a7d6 100644 --- a/docs/fr-FR/README.md +++ b/docs/fr-FR/README.md @@ -140,7 +140,7 @@ Dify accueille les contributions de toutes sortes : - **Code** : consultez le [guide de contribution](./CONTRIBUTING.md), puis parcourez les [issues accessibles aux nouveaux contributeurs](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). - **Idées et retours** : lancez ou rejoignez une [discussion GitHub](https://github.com/langgenius/dify/discussions). -- **Traductions** : suivez le [guide d’internationalisation](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) pour ajouter ou mettre à jour une langue. +- **Traductions** : suivez le [guide d’internationalisation](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) pour ajouter ou mettre à jour une langue. - **Communauté** : partagez les applications que vous créez, aidez les autres utilisateurs et faites connaître Dify. ### Contributeurs diff --git a/docs/hi-IN/README.md b/docs/hi-IN/README.md index 747987f3a47..0a927af5ecb 100644 --- a/docs/hi-IN/README.md +++ b/docs/hi-IN/README.md @@ -146,7 +146,7 @@ Dify सभी प्रकार के योगदानों का स् - **कोड**: [Contribution Guide](./CONTRIBUTING.md) पढ़ें, फिर [नए योगदानकर्ताओं के लिए उपयुक्त issues](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22) देखें। - **विचार और प्रतिक्रिया**: [GitHub Discussion](https://github.com/langgenius/dify/discussions) शुरू करें या किसी मौजूदा चर्चा में शामिल हों। -- **अनुवाद**: किसी locale को जोड़ने या अपडेट करने के लिए [internationalization guide](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) का पालन करें। +- **अनुवाद**: किसी locale को जोड़ने या अपडेट करने के लिए [internationalization guide](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) का पालन करें। - **समुदाय**: अपने बनाए हुए ऐप साझा करें, अन्य उपयोगकर्ताओं की मदद करें और Dify के बारे में लोगों को बताएं। ### योगदानकर्ता diff --git a/docs/it-IT/README.md b/docs/it-IT/README.md index 0d258a07707..427d3a42382 100644 --- a/docs/it-IT/README.md +++ b/docs/it-IT/README.md @@ -144,7 +144,7 @@ Dify accoglie contributi di ogni tipo: - **Codice**: leggi la [Guida ai contributi](../../CONTRIBUTING.md), quindi consulta le [issue adatte ai nuovi contributori](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). - **Idee e feedback**: avvia o partecipa a una [discussione su GitHub](https://github.com/langgenius/dify/discussions). -- **Traduzioni**: segui la [guida all’internazionalizzazione](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) per aggiungere o aggiornare una lingua. +- **Traduzioni**: segui la [guida all’internazionalizzazione](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) per aggiungere o aggiornare una lingua. - **Community**: condividi le app che crei, aiuta gli altri utenti e fai conoscere Dify. ### Collaboratori diff --git a/docs/ja-JP/README.md b/docs/ja-JP/README.md index fe1ea07c551..10403ad6d6d 100644 --- a/docs/ja-JP/README.md +++ b/docs/ja-JP/README.md @@ -141,7 +141,7 @@ Difyでは、あらゆる形の貢献を歓迎しています。 - **コード**:[コントリビューションガイド](./CONTRIBUTING.md)を読み、[good first issue](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)を確認してください。 - **アイデアとフィードバック**:[GitHub Discussions](https://github.com/langgenius/dify/discussions)で新しい議論を始めるか、既存の議論に参加してください。 -- **翻訳**:言語の追加や更新については、[国際化ガイド](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)に従ってください。 +- **翻訳**:言語の追加や更新については、[国際化ガイド](https://github.com/langgenius/dify/blob/main/web/i18n/README.md)に従ってください。 - **コミュニティ**:作成したアプリを共有し、他のユーザーを支援し、Difyを広めてください。 ### 貢献者 diff --git a/docs/ko-KR/README.md b/docs/ko-KR/README.md index 40638aa2449..f49404c6d7f 100644 --- a/docs/ko-KR/README.md +++ b/docs/ko-KR/README.md @@ -134,7 +134,7 @@ Dify는 모든 형태의 기여를 환영합니다. - **코드**: [기여 가이드](./CONTRIBUTING.md)를 읽고 [good first issue](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)를 살펴보세요. - **아이디어 및 피드백**: [GitHub 토론](https://github.com/langgenius/dify/discussions)을 시작하거나 기존 토론에 참여하세요. -- **번역**: 언어를 추가하거나 업데이트하려면 [국제화 가이드](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)를 따르세요. +- **번역**: 언어를 추가하거나 업데이트하려면 [국제화 가이드](https://github.com/langgenius/dify/blob/main/web/i18n/README.md)를 따르세요. - **커뮤니티**: 만든 앱을 공유하고, 다른 사용자를 돕고, Dify를 널리 알려주세요. ### 기여자 diff --git a/docs/pt-BR/README.md b/docs/pt-BR/README.md index 7dc7026c647..7fd3d738305 100644 --- a/docs/pt-BR/README.md +++ b/docs/pt-BR/README.md @@ -139,7 +139,7 @@ O Dify aceita contribuições de todos os tipos: - **Código**: leia o [Guia de Contribuição](./CONTRIBUTING.md) e consulte as [issues para iniciantes](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). - **Ideias e feedback**: inicie ou participe de uma [discussão no GitHub](https://github.com/langgenius/dify/discussions). -- **Traduções**: siga o [guia de internacionalização](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) para adicionar ou atualizar um idioma. +- **Traduções**: siga o [guia de internacionalização](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) para adicionar ou atualizar um idioma. - **Comunidade**: compartilhe os aplicativos que você criar, ajude outros usuários e divulgue o Dify. ### Contribuidores diff --git a/docs/sl-SI/README.md b/docs/sl-SI/README.md index 680a858634e..38c41317ecf 100644 --- a/docs/sl-SI/README.md +++ b/docs/sl-SI/README.md @@ -141,7 +141,7 @@ Dify pozdravlja vse vrste prispevkov: - **Koda**: preberite [vodnik za prispevke](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md), nato pa preglejte [naloge za nove sodelavce](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). - **Ideje in povratne informacije**: začnite ali se pridružite [razpravi na GitHubu](https://github.com/langgenius/dify/discussions). -- **Prevodi**: sledite [vodniku za internacionalizacijo](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md), da dodate ali posodobite jezik. +- **Prevodi**: sledite [vodniku za internacionalizacijo](https://github.com/langgenius/dify/blob/main/web/i18n/README.md), da dodate ali posodobite jezik. - **Skupnost**: delite ustvarjene aplikacije, pomagajte drugim uporabnikom in razširite glas o Difyju. ### Sodelavci diff --git a/docs/tlh/README.md b/docs/tlh/README.md index df8bfd47b8d..12d639fec38 100644 --- a/docs/tlh/README.md +++ b/docs/tlh/README.md @@ -140,7 +140,7 @@ Dify welcomes contributions of all kinds: - **Code**: Read the [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md), then browse [good first issues](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). - **Ideas and feedback**: Start or join a [GitHub Discussion](https://github.com/langgenius/dify/discussions). -- **Translations**: Follow the [internationalization guide](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) to add or update a locale. +- **Translations**: Follow the [internationalization guide](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) to add or update a locale. - **Community**: Share the apps you build, help other users, and spread the word about Dify. ### Contributors diff --git a/docs/tr-TR/README.md b/docs/tr-TR/README.md index 93ef7013235..d99d0f5c02a 100644 --- a/docs/tr-TR/README.md +++ b/docs/tr-TR/README.md @@ -134,7 +134,7 @@ Dify her türlü katkıyı memnuniyetle karşılar: - **Kod**: [Katkı Kılavuzu'nu](./CONTRIBUTING.md) okuyun, ardından [yeni katkıda bulunanlara uygun sorunlara](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22) göz atın. - **Fikirler ve geri bildirim**: Bir [GitHub tartışması](https://github.com/langgenius/dify/discussions) başlatın veya mevcut bir tartışmaya katılın. -- **Çeviriler**: Bir dil eklemek veya güncellemek için [uluslararasılaştırma kılavuzunu](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) izleyin. +- **Çeviriler**: Bir dil eklemek veya güncellemek için [uluslararasılaştırma kılavuzunu](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) izleyin. - **Topluluk**: Oluşturduğunuz uygulamaları paylaşın, diğer kullanıcılara yardımcı olun ve Dify'ı duyurun. ### Katkıda bulunanlar diff --git a/docs/vi-VN/README.md b/docs/vi-VN/README.md index db8d5904321..de05098833c 100644 --- a/docs/vi-VN/README.md +++ b/docs/vi-VN/README.md @@ -135,7 +135,7 @@ Dify chào đón mọi hình thức đóng góp: - **Mã nguồn**: đọc [Hướng dẫn đóng góp](./CONTRIBUTING.md), sau đó xem các [issue phù hợp cho người mới](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). - **Ý tưởng và phản hồi**: bắt đầu hoặc tham gia một [thảo luận trên GitHub](https://github.com/langgenius/dify/discussions). -- **Bản dịch**: làm theo [hướng dẫn quốc tế hóa](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) để thêm hoặc cập nhật một ngôn ngữ. +- **Bản dịch**: làm theo [hướng dẫn quốc tế hóa](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) để thêm hoặc cập nhật một ngôn ngữ. - **Cộng đồng**: chia sẻ ứng dụng bạn xây dựng, hỗ trợ người dùng khác và giới thiệu Dify đến nhiều người hơn. ### Người đóng góp diff --git a/docs/zh-CN/README.md b/docs/zh-CN/README.md index 5db1ed94a01..a7ef1a3102a 100644 --- a/docs/zh-CN/README.md +++ b/docs/zh-CN/README.md @@ -147,7 +147,7 @@ Dify 欢迎各种形式的贡献: - **代码**:阅读[贡献指南](./CONTRIBUTING.md),然后浏览[适合新手的问题](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)。 - **想法与反馈**:发起或加入 [GitHub Discussions](https://github.com/langgenius/dify/discussions)。 -- **翻译**:按照[国际化指南](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)添加或更新语言。 +- **翻译**:按照[国际化指南](https://github.com/langgenius/dify/blob/main/web/i18n/README.md)添加或更新语言。 - **社区**:分享您构建的应用、帮助其他用户,并向更多人介绍 Dify。 ### 贡献者 diff --git a/docs/zh-TW/README.md b/docs/zh-TW/README.md index b7682b181c6..c1418665269 100644 --- a/docs/zh-TW/README.md +++ b/docs/zh-TW/README.md @@ -145,7 +145,7 @@ Dify 歡迎各種形式的貢獻: - **程式碼**:閱讀[貢獻指南](./CONTRIBUTING.md),再瀏覽[適合新手的議題](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)。 - **想法與意見**:發起或加入 [GitHub Discussions](https://github.com/langgenius/dify/discussions)。 -- **翻譯**:依照[國際化指南](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)新增或更新語言。 +- **翻譯**:依照[國際化指南](https://github.com/langgenius/dify/blob/main/web/i18n/README.md)新增或更新語言。 - **社群**:分享您建立的應用程式、協助其他使用者,並向更多人介紹 Dify。 ### 貢獻者 diff --git a/eslint.config.mjs b/eslint.config.mjs index 9b72b129bd9..001db22be9a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -436,7 +436,7 @@ export default defineConfig([ }, }, { - files: ['web/i18n/**/*.json'], + files: ['web/i18n/locales/**/*.json'], plugins: { dify, }, diff --git a/knip.config.ts b/knip.config.ts index 4cf2444d674..d7bbb3a42d7 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -33,7 +33,7 @@ const config: KnipConfig = { '!vitest.setup.ts!', ], ignore: ['public/**'], - ignoreFiles: ['i18n-config/locale-resources/*.ts'], + ignoreFiles: ['i18n/locale-resources/*.ts'], ignoreDependencies: ['@iconify-json/*', '@storybook/addon-onboarding'], }, }, diff --git a/oxlint-suppressions.json b/oxlint-suppressions.json index 812088ed515..3252fe193fd 100644 --- a/oxlint-suppressions.json +++ b/oxlint-suppressions.json @@ -5163,7 +5163,7 @@ "count": 4 } }, - "web/i18n-config/index.ts": { + "web/i18n/index.ts": { "no-barrel-files/no-barrel-files": { "count": 1 } diff --git a/web/.storybook/preview.tsx b/web/.storybook/preview.tsx index b9da6f7c6af..e1a1638437d 100644 --- a/web/.storybook/preview.tsx +++ b/web/.storybook/preview.tsx @@ -4,7 +4,7 @@ import { ToastHost } from '@langgenius/dify-ui/toast' import { withThemeByDataAttribute } from '@storybook/addon-themes' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { I18nClientProvider as I18N } from '../app/components/provider/i18n' -import commonEnUS from '../i18n/en-US/common.json' +import commonEnUS from '../i18n/locales/en-US/common.json' import '../app/styles/markdown.css' import './storybook.css' diff --git a/web/AGENTS.md b/web/AGENTS.md index dc59e66c9be..c4226a6fdba 100644 --- a/web/AGENTS.md +++ b/web/AGENTS.md @@ -10,7 +10,7 @@ Web owns application-specific requirements and consumes shared architecture guid - For truncated text disclosure and native `title` decisions, follow [Truncated Text Disclosure]. - When adding or changing page layouts, navigation, or landmark elements, follow [Page landmarks] and inspect the composed page, including parent layouts. -- User-facing strings must use `web/i18n/en-US/` keys. When adding or renaming a key, update every supported locale with the correct localized value. +- User-facing strings must use `web/i18n/locales/en-US/` keys. When adding or renaming a key, update every supported locale with the correct localized value. - For new backend calls and migrated surfaces, use generated `consoleQuery` / `consoleClient` APIs from `@/service/console`. Do not add handwritten REST helpers or DTO mirrors, mock-backed app state, or direct edits to generated contracts. - Prefer `@langgenius/dify-ui/*` primitives, data attributes, and design tokens. Use the [Dify UI package index] to find a primitive; read the relevant contract directly when it is already known. Preserve a visible focus indicator on the final focusable element. - Reuse the Web `SearchInput` composite when its search, clear, and IME contract matches the feature; otherwise follow the canonical [Input Group contract]. diff --git a/web/__tests__/app-star-i18n.test.ts b/web/__tests__/app-star-i18n.test.ts index 31d60ce7f7a..93685b27315 100644 --- a/web/__tests__/app-star-i18n.test.ts +++ b/web/__tests__/app-star-i18n.test.ts @@ -1,7 +1,7 @@ import fs from 'node:fs' import path from 'node:path' -const I18N_DIR = path.join(__dirname, '../i18n') +const I18N_DIR = path.join(__dirname, '../i18n/locales') const REQUIRED_APP_STAR_KEYS = [ 'studio.allApps', diff --git a/web/__tests__/i18n-upload-features.test.ts b/web/__tests__/i18n-upload-features.test.ts index 50aef054f0c..bd42227bb52 100644 --- a/web/__tests__/i18n-upload-features.test.ts +++ b/web/__tests__/i18n-upload-features.test.ts @@ -7,7 +7,7 @@ import fs from 'node:fs' import path from 'node:path' // Get all supported locales from the i18n directory -const I18N_DIR = path.join(__dirname, '../i18n') +const I18N_DIR = path.join(__dirname, '../i18n/locales') const getSupportedLocales = (): string[] => { return fs .readdirSync(I18N_DIR) diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/access-config/page.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/access-config/page.tsx index 6a111ee77d1..92dcff4064a 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/access-config/page.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/access-config/page.tsx @@ -1,4 +1,4 @@ -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import AppAccessConfigPage from '@/app/components/app/access-config' export type AccessConfigPageProps = { diff --git a/web/app/(commonLayout)/datasets/__tests__/document-title.spec.tsx b/web/app/(commonLayout)/datasets/__tests__/document-title.spec.tsx index c410961fc21..dd836c082e3 100644 --- a/web/app/(commonLayout)/datasets/__tests__/document-title.spec.tsx +++ b/web/app/(commonLayout)/datasets/__tests__/document-title.spec.tsx @@ -6,8 +6,8 @@ import { generateMetadata as generateNewKnowledgeMetadata } from '../new/create/ vi.mock('server-only', () => ({})) -vi.mock('@/i18n-config/server', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/server', async (importOriginal) => ({ + ...(await importOriginal()), getLocaleOnServer: async () => 'en-US', })) diff --git a/web/app/(commonLayout)/integrations/[[...slug]]/__tests__/metadata.spec.ts b/web/app/(commonLayout)/integrations/[[...slug]]/__tests__/metadata.spec.ts index de7f7a1db59..9ae932f831b 100644 --- a/web/app/(commonLayout)/integrations/[[...slug]]/__tests__/metadata.spec.ts +++ b/web/app/(commonLayout)/integrations/[[...slug]]/__tests__/metadata.spec.ts @@ -6,8 +6,8 @@ vi.mock('@/app/components/integrations', () => ({ default: () => null, })) -vi.mock('@/i18n-config/server', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/server', async (importOriginal) => ({ + ...(await importOriginal()), getLocaleOnServer: async () => 'en-US', })) diff --git a/web/app/(commonLayout)/integrations/[[...slug]]/layout.tsx b/web/app/(commonLayout)/integrations/[[...slug]]/layout.tsx index b584c3e4a03..bf996fa6214 100644 --- a/web/app/(commonLayout)/integrations/[[...slug]]/layout.tsx +++ b/web/app/(commonLayout)/integrations/[[...slug]]/layout.tsx @@ -2,7 +2,7 @@ import type { PropsWithChildren } from 'react' import type { IntegrationSection } from '@/app/components/integrations/routes' import type { Metadata } from '@/next' import { getIntegrationRouteTargetBySlug } from '@/app/components/integrations/routes' -import { getLocaleOnServer, getTranslation } from '@/i18n-config/server' +import { getLocaleOnServer, getTranslation } from '@/i18n/server' type IntegrationsRouteLayoutProps = PropsWithChildren<{ params: Promise<{ diff --git a/web/app/(commonLayout)/marketplace/creator/[uniqueHandle]/page.tsx b/web/app/(commonLayout)/marketplace/creator/[uniqueHandle]/page.tsx index 1c9c5615aa6..6b64be6d96a 100644 --- a/web/app/(commonLayout)/marketplace/creator/[uniqueHandle]/page.tsx +++ b/web/app/(commonLayout)/marketplace/creator/[uniqueHandle]/page.tsx @@ -1,7 +1,7 @@ import { loadCreatorProfile } from '@/app/components/plugins/marketplace/creator-profile/data.server' import DifyCreatorProfile from '@/app/components/plugins/marketplace/creator-profile/dify-profile' import MarketplaceInstallPermissionProvider from '@/app/components/plugins/marketplace/marketplace-install-permission-provider' -import { getLocaleOnServer } from '@/i18n-config/server' +import { getLocaleOnServer } from '@/i18n/server' import { notFound } from '@/next/navigation' type CreatorPageSearchParams = { diff --git a/web/app/(commonLayout)/skills/__tests__/metadata.spec.ts b/web/app/(commonLayout)/skills/__tests__/metadata.spec.ts index 92e3975587c..5a0c1f5f50d 100644 --- a/web/app/(commonLayout)/skills/__tests__/metadata.spec.ts +++ b/web/app/(commonLayout)/skills/__tests__/metadata.spec.ts @@ -3,8 +3,8 @@ import { generateMetadata } from '../page' vi.mock('server-only', () => ({})) -vi.mock('@/i18n-config/server', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/server', async (importOriginal) => ({ + ...(await importOriginal()), getLocaleOnServer: async () => 'en-US', })) diff --git a/web/app/(commonLayout)/templates/[[...category]]/__tests__/page.spec.tsx b/web/app/(commonLayout)/templates/[[...category]]/__tests__/page.spec.tsx index 2f1c403ebb0..242a96a7d43 100644 --- a/web/app/(commonLayout)/templates/[[...category]]/__tests__/page.spec.tsx +++ b/web/app/(commonLayout)/templates/[[...category]]/__tests__/page.spec.tsx @@ -63,7 +63,7 @@ vi.mock('@/app/components/plugins/marketplace/templates', () => ({ ), })) -vi.mock('@/i18n-config/server', () => ({ +vi.mock('@/i18n/server', () => ({ getLocaleOnServer: () => Promise.resolve('en-US'), })) diff --git a/web/app/(commonLayout)/templates/[[...category]]/page.tsx b/web/app/(commonLayout)/templates/[[...category]]/page.tsx index 3a4f554086c..3a2b1e1e8a3 100644 --- a/web/app/(commonLayout)/templates/[[...category]]/page.tsx +++ b/web/app/(commonLayout)/templates/[[...category]]/page.tsx @@ -2,7 +2,7 @@ import { MARKETPLACE_CONTAINER_ID } from '@/app/components/plugins/marketplace/c import { EmbeddedTemplatesMarketplace } from '@/app/components/plugins/marketplace/templates' import { TemplateDetailRouteProvider } from '@/app/components/plugins/marketplace/templates/template-detail-route' import { parseTemplatesRoute } from '@/app/components/plugins/marketplace/templates/template-links' -import { getLocaleOnServer } from '@/i18n-config/server' +import { getLocaleOnServer } from '@/i18n/server' import { redirect } from '@/next/navigation' type TemplatesPageProps = { diff --git a/web/app/__tests__/layout.spec.tsx b/web/app/__tests__/layout.spec.tsx index cee0bd121ed..9f93408da43 100644 --- a/web/app/__tests__/layout.spec.tsx +++ b/web/app/__tests__/layout.spec.tsx @@ -20,7 +20,7 @@ vi.mock('@/env', async (importOriginal) => { } }) -vi.mock('@/i18n-config/server', () => ({ +vi.mock('@/i18n/server', () => ({ getLocaleOnServer: async () => 'en-US', })) diff --git a/web/app/__tests__/route-metadata.spec.ts b/web/app/__tests__/route-metadata.spec.ts index b9308ee84b8..a85569332f0 100644 --- a/web/app/__tests__/route-metadata.spec.ts +++ b/web/app/__tests__/route-metadata.spec.ts @@ -18,8 +18,8 @@ import { generateMetadata as generateSignupSetPasswordMetadata } from '../signup vi.mock('server-only', () => ({})) -vi.mock('@/i18n-config/server', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/server', async (importOriginal) => ({ + ...(await importOriginal()), getLocaleOnServer: async () => 'en-US', })) diff --git a/web/app/components/app/access-config/index.tsx b/web/app/components/app/access-config/index.tsx index 8474749131e..570b7d850f2 100644 --- a/web/app/components/app/access-config/index.tsx +++ b/web/app/components/app/access-config/index.tsx @@ -11,7 +11,7 @@ import { useStore } from '@/app/components/app/store' import { workspacePermissionKeysAtom } from '@/context/permission-state' import { userProfileQueryOptions } from '@/features/account-profile/client' import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { getAccessControlTemplateLanguage } from '@/i18n-config/language' +import { getAccessControlTemplateLanguage } from '@/i18n/language' import { RESOURCE_ACCESS_SETTINGS_PAGE_SIZE } from '@/service/access-control/constants' import { useAppAccessRules, diff --git a/web/app/components/app/annotation/batch-add-annotation-modal/__tests__/csv-downloader.spec.tsx b/web/app/components/app/annotation/batch-add-annotation-modal/__tests__/csv-downloader.spec.tsx index 2587af7eca8..9e77cfc47b2 100644 --- a/web/app/components/app/annotation/batch-add-annotation-modal/__tests__/csv-downloader.spec.tsx +++ b/web/app/components/app/annotation/batch-add-annotation-modal/__tests__/csv-downloader.spec.tsx @@ -1,9 +1,9 @@ import type { Mock } from 'vite-plus/test' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import { render, screen } from '@testing-library/react' import * as React from 'react' import { useLocale } from '#i18n' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import CSVDownload from '../csv-downloader' vi.mock('#i18n', async (importOriginal) => ({ diff --git a/web/app/components/app/annotation/batch-add-annotation-modal/csv-downloader.tsx b/web/app/components/app/annotation/batch-add-annotation-modal/csv-downloader.tsx index aa5bdcdb140..6648a6472f7 100644 --- a/web/app/components/app/annotation/batch-add-annotation-modal/csv-downloader.tsx +++ b/web/app/components/app/annotation/batch-add-annotation-modal/csv-downloader.tsx @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next' import { useCSVDownloader } from 'react-papaparse' import { useLocale } from '#i18n' import { Download02 as DownloadIcon } from '@/app/components/base/icons/src/vender/solid/general' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' const CSV_TEMPLATE_QA_EN = [ ['question', 'answer'], diff --git a/web/app/components/app/annotation/header-opts/__tests__/index.spec.tsx b/web/app/components/app/annotation/header-opts/__tests__/index.spec.tsx index 536fd0379d2..95a731cd7d0 100644 --- a/web/app/components/app/annotation/header-opts/__tests__/index.spec.tsx +++ b/web/app/components/app/annotation/header-opts/__tests__/index.spec.tsx @@ -1,11 +1,11 @@ import type { ComponentProps } from 'react' import type { Mock } from 'vite-plus/test' import type { AnnotationItemBasic } from '../../type' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import { act, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { useLocale } from '#i18n' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { clearAllAnnotations, fetchExportAnnotationList } from '@/service/annotation' import { renderWithConsoleQuery as render } from '@/test/console/query-data' import HeaderOptions from '../index' diff --git a/web/app/components/app/annotation/header-opts/index.tsx b/web/app/components/app/annotation/header-opts/index.tsx index 6f43e75229e..d725b92c4c7 100644 --- a/web/app/components/app/annotation/header-opts/index.tsx +++ b/web/app/components/app/annotation/header-opts/index.tsx @@ -16,7 +16,7 @@ import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { jsonToCSV } from 'react-papaparse' import { useLocale } from '#i18n' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { clearAllAnnotations, fetchExportAnnotationList } from '@/service/annotation' import { downloadBlob } from '@/utils/download' import AddAnnotationModal from '../add-annotation-modal' diff --git a/web/app/components/app/app-publisher/publish-with-multiple-model.tsx b/web/app/components/app/app-publisher/publish-with-multiple-model.tsx index 84ab304263f..7e3b216573e 100644 --- a/web/app/components/app/app-publisher/publish-with-multiple-model.tsx +++ b/web/app/components/app/app-publisher/publish-with-multiple-model.tsx @@ -17,7 +17,7 @@ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { consoleQuery } from '@/service/console' import ModelIcon from '../../header/account-setting/model-provider-page/model-icon' diff --git a/web/app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool.tsx b/web/app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool.tsx index c3677f3f102..7538e1b68a6 100644 --- a/web/app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool.tsx +++ b/web/app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool.tsx @@ -28,7 +28,7 @@ import { AuthCategory, PluginAuthInAgent } from '@/app/components/plugins/plugin import { ReadmeEntrance } from '@/app/components/plugins/readme-panel/entrance' import { CollectionType } from '@/app/components/tools/types' import { toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema' -import { getPluginLanguage } from '@/i18n-config/metadata' +import { getPluginLanguage } from '@/i18n/metadata' import { fetchBuiltInToolList, fetchCustomToolList, diff --git a/web/app/components/app/configuration/config/automatic/__tests__/generator-reflow.browser.spec.tsx b/web/app/components/app/configuration/config/automatic/__tests__/generator-reflow.browser.spec.tsx index 9227956b34b..24eaca6b69d 100644 --- a/web/app/components/app/configuration/config/automatic/__tests__/generator-reflow.browser.spec.tsx +++ b/web/app/components/app/configuration/config/automatic/__tests__/generator-reflow.browser.spec.tsx @@ -6,8 +6,8 @@ import GetAutomaticRes from '../get-automatic-res' vi.mock('react-i18next', async () => { const { createReactI18nextMock } = await import('@/test/i18n-mock') - const { default: appDebug } = await import('@/i18n/en-US/app-debug.json') - const { default: common } = await import('@/i18n/en-US/common.json') + const { default: appDebug } = await import('@/i18n/locales/en-US/app-debug.json') + const { default: common } = await import('@/i18n/locales/en-US/common.json') return createReactI18nextMock({ ...appDebug, ...common }) }) diff --git a/web/app/components/app/configuration/dataset-config/select-dataset/__tests__/index.spec.tsx b/web/app/components/app/configuration/dataset-config/select-dataset/__tests__/index.spec.tsx index e0278e5dd19..2fcc3bf14fe 100644 --- a/web/app/components/app/configuration/dataset-config/select-dataset/__tests__/index.spec.tsx +++ b/web/app/components/app/configuration/dataset-config/select-dataset/__tests__/index.spec.tsx @@ -8,16 +8,6 @@ import { render } from '@/test/console/render' import { RETRIEVE_METHOD } from '@/types/app' import SelectDataSet from '../index' -vi.mock('@/i18n-config/i18next-config', () => ({ - default: { - changeLanguage: vi.fn(), - addResourceBundle: vi.fn(), - use: vi.fn().mockReturnThis(), - init: vi.fn(), - addResource: vi.fn(), - hasResourceBundle: vi.fn().mockReturnValue(true), - }, -})) const mockUseInfiniteScroll = vi.fn() vi.mock('ahooks', async (importOriginal) => { const actual = await importOriginal() diff --git a/web/app/components/app/configuration/tools/__tests__/external-data-tool-modal-utils.spec.ts b/web/app/components/app/configuration/tools/__tests__/external-data-tool-modal-utils.spec.ts index e832efacf6e..b020d8cadcb 100644 --- a/web/app/components/app/configuration/tools/__tests__/external-data-tool-modal-utils.spec.ts +++ b/web/app/components/app/configuration/tools/__tests__/external-data-tool-modal-utils.spec.ts @@ -1,6 +1,6 @@ -import type { I18nText } from '@/i18n-config/language' +import type { I18nText } from '@/i18n/language' import type { CodeBasedExtensionItem } from '@/models/common' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { withSelectorKey } from '@/test/i18n-mock' import { buildProviders, diff --git a/web/app/components/app/configuration/tools/external-data-tool-modal-utils.ts b/web/app/components/app/configuration/tools/external-data-tool-modal-utils.ts index 27557168d13..165554ac3bd 100644 --- a/web/app/components/app/configuration/tools/external-data-tool-modal-utils.ts +++ b/web/app/components/app/configuration/tools/external-data-tool-modal-utils.ts @@ -1,7 +1,7 @@ import type { SelectorTranslate } from '@/app/components/app/configuration/utils' import type { CodeBasedExtensionItem, ExternalDataTool } from '@/models/common' import { getStringSelectorTranslate } from '@/app/components/app/configuration/utils' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' const systemTypes = ['api'] as const diff --git a/web/app/components/app/deploy/index.tsx b/web/app/components/app/deploy/index.tsx index 5ab81fa74dc..d9f03ec1259 100644 --- a/web/app/components/app/deploy/index.tsx +++ b/web/app/components/app/deploy/index.tsx @@ -16,7 +16,7 @@ import { LoadingPlaceholder } from '@/app/components/base/loading-placeholder' import { getEnterpriseDocUrl } from '@/context/i18n' import { workspacePermissionKeysAtom } from '@/context/permission-state' import { userProfileQueryOptions } from '@/features/account-profile/client' -import { getDocLanguage } from '@/i18n-config/language' +import { getDocLanguage } from '@/i18n/language' import dynamic from '@/next/dynamic' import { AppModeEnum } from '@/types/app' import { getAppACLCapabilities } from '@/utils/permission' diff --git a/web/app/components/app/overview/settings/index.tsx b/web/app/components/app/overview/settings/index.tsx index 4f25d6fd20a..00a1b78214c 100644 --- a/web/app/components/app/overview/settings/index.tsx +++ b/web/app/components/app/overview/settings/index.tsx @@ -44,7 +44,7 @@ import { pricingQueryParser, } from '@/app/components/billing/pricing/query-params' import { deploymentEditionAtom } from '@/features/system-features/state' -import { languages } from '@/i18n-config/language' +import { languages } from '@/i18n/language' import Link from '@/next/link' import { consoleQuery } from '@/service/console' import { AppModeEnum } from '@/types/app' diff --git a/web/app/components/base/chat/chat-with-history/__tests__/hooks.spec.tsx b/web/app/components/base/chat/chat-with-history/__tests__/hooks.spec.tsx index 12004cb7c28..e4370a88690 100644 --- a/web/app/components/base/chat/chat-with-history/__tests__/hooks.spec.tsx +++ b/web/app/components/base/chat/chat-with-history/__tests__/hooks.spec.tsx @@ -24,7 +24,7 @@ vi.mock('@/hooks/use-app-favicon', () => ({ useAppFavicon: vi.fn(), })) -vi.mock('@/i18n-config/client', () => ({ +vi.mock('@/i18n/client', () => ({ changeLanguage: vi.fn().mockResolvedValue(undefined), })) diff --git a/web/app/components/base/chat/chat-with-history/hooks.tsx b/web/app/components/base/chat/chat-with-history/hooks.tsx index cea9d1b77aa..c1625ef99a9 100644 --- a/web/app/components/base/chat/chat-with-history/hooks.tsx +++ b/web/app/components/base/chat/chat-with-history/hooks.tsx @@ -16,7 +16,7 @@ import { getProcessedFilesFromResponse } from '@/app/components/base/file-upload import { InputVarType } from '@/app/components/workflow/types' import { useWebAppStore } from '@/context/web-app-context' import { useAppFavicon } from '@/hooks/use-app-favicon' -import { changeLanguage } from '@/i18n-config/client' +import { changeLanguage } from '@/i18n/client' import { AppSourceType, delConversation, diff --git a/web/app/components/base/chat/chat/answer/agent-roster-response-content.tsx b/web/app/components/base/chat/chat/answer/agent-roster-response-content.tsx index 895f5868b78..c2ea6e10755 100644 --- a/web/app/components/base/chat/chat/answer/agent-roster-response-content.tsx +++ b/web/app/components/base/chat/chat/answer/agent-roster-response-content.tsx @@ -1,12 +1,12 @@ import type { ThoughtItem } from '@/app/components/base/chat/chat/type' import type { ChatItem } from '@/app/components/base/chat/types' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import { Collapsible, CollapsiblePanel, CollapsibleTrigger } from '@langgenius/dify-ui/collapsible' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { FileList } from '@/app/components/base/file-uploader' import { Markdown } from '@/app/components/base/markdown' -import { getPluginLanguage, renderI18nObject } from '@/i18n-config/metadata' +import { getPluginLanguage, renderI18nObject } from '@/i18n/metadata' type AgentRosterResponseContentProps = { item: ChatItem diff --git a/web/app/components/base/chat/chat/answer/human-input-content/__tests__/utils.spec.ts b/web/app/components/base/chat/chat/answer/human-input-content/__tests__/utils.spec.ts index b41eeec1f0e..bfa327af3e0 100644 --- a/web/app/components/base/chat/chat/answer/human-input-content/__tests__/utils.spec.ts +++ b/web/app/components/base/chat/chat/answer/human-input-content/__tests__/utils.spec.ts @@ -1,5 +1,5 @@ import type { FormInputItem } from '@/app/components/workflow/nodes/human-input/types' -import type { Locale } from '@/i18n-config/locale' +import type { Locale } from '@/i18n/locale' import { UserActionButtonType } from '@/app/components/workflow/nodes/human-input/types' import { InputVarType, SupportUploadFileTypes } from '@/app/components/workflow/types' import { TransferMethod } from '@/types/app' diff --git a/web/app/components/base/chat/chat/answer/human-input-content/utils.ts b/web/app/components/base/chat/chat/answer/human-input-content/utils.ts index f0746ea8a01..d80fd04ddc2 100644 --- a/web/app/components/base/chat/chat/answer/human-input-content/utils.ts +++ b/web/app/components/base/chat/chat/answer/human-input-content/utils.ts @@ -2,7 +2,7 @@ import type { ButtonProps } from '@langgenius/dify-ui/button' import type { HumanInputFieldValue } from './field-renderer' import type { FileEntity } from '@/app/components/base/file-uploader/types' import type { FormInputItem } from '@/app/components/workflow/nodes/human-input/types' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import type { HumanInputResolvedValue } from '@/types/workflow' import dayjs from 'dayjs' import isSameOrAfter from 'dayjs/plugin/isSameOrAfter' diff --git a/web/app/components/base/chat/embedded-chatbot/__tests__/hooks.spec.tsx b/web/app/components/base/chat/embedded-chatbot/__tests__/hooks.spec.tsx index 7bed22ea171..32fe04d931a 100644 --- a/web/app/components/base/chat/embedded-chatbot/__tests__/hooks.spec.tsx +++ b/web/app/components/base/chat/embedded-chatbot/__tests__/hooks.spec.tsx @@ -27,7 +27,7 @@ type InputForm = { hide?: boolean } -vi.mock('@/i18n-config/client', () => ({ +vi.mock('@/i18n/client', () => ({ changeLanguage: vi.fn().mockResolvedValue(undefined), })) @@ -693,7 +693,7 @@ describe('useEmbeddedChatbot', () => { describe('Language settings', () => { it('should set language from URL parameters', async () => { window.history.replaceState({}, '', '/?locale=zh-Hans') - const { changeLanguage } = await import('@/i18n-config/client') + const { changeLanguage } = await import('@/i18n/client') await renderWithClient(() => useEmbeddedChatbot(AppSourceType.webApp)) @@ -703,7 +703,7 @@ describe('useEmbeddedChatbot', () => { it('should set language from system variables when URL param is missing', async () => { mockGetProcessedSystemVariablesFromUrlParams.mockResolvedValue({ locale: 'fr-FR' }) - const { changeLanguage } = await import('@/i18n-config/client') + const { changeLanguage } = await import('@/i18n/client') await renderWithClient(() => useEmbeddedChatbot(AppSourceType.webApp)) @@ -719,7 +719,7 @@ describe('useEmbeddedChatbot', () => { default_language: 'ja-JP', }, } as unknown as AppData - const { changeLanguage } = await import('@/i18n-config/client') + const { changeLanguage } = await import('@/i18n/client') await renderWithClient(() => useEmbeddedChatbot(AppSourceType.webApp)) diff --git a/web/app/components/base/chat/embedded-chatbot/hooks.tsx b/web/app/components/base/chat/embedded-chatbot/hooks.tsx index 52ef87d6ac3..9be176dc322 100644 --- a/web/app/components/base/chat/embedded-chatbot/hooks.tsx +++ b/web/app/components/base/chat/embedded-chatbot/hooks.tsx @@ -1,6 +1,6 @@ import type { ChatConfig, ChatItem, OnFeedback } from '../types' import type { InputValueTypes } from '@/app/components/share/text-generation/types' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import type { AppData, ConversationItem } from '@/models/share' import { toast } from '@langgenius/dify-ui/toast' import { noop } from 'es-toolkit/function' @@ -11,7 +11,7 @@ import { useConversationSelection } from '@/app/components/base/chat/storage' import { addFileInfos, sortAgentSorts } from '@/app/components/tools/utils' import { InputVarType } from '@/app/components/workflow/types' import { useWebAppStore } from '@/context/web-app-context' -import { changeLanguage } from '@/i18n-config/client' +import { changeLanguage } from '@/i18n/client' import { AppSourceType, updateFeedback } from '@/service/share' import { useInvalidateShareConversations, diff --git a/web/app/components/base/features/new-feature-panel/moderation/__tests__/form-generation.spec.tsx b/web/app/components/base/features/new-feature-panel/moderation/__tests__/form-generation.spec.tsx index 39a61da434c..e2e1b84b824 100644 --- a/web/app/components/base/features/new-feature-panel/moderation/__tests__/form-generation.spec.tsx +++ b/web/app/components/base/features/new-feature-panel/moderation/__tests__/form-generation.spec.tsx @@ -1,4 +1,4 @@ -import type { I18nText } from '@/i18n-config/language' +import type { I18nText } from '@/i18n/language' import type { CodeBasedExtensionForm } from '@/models/common' import { fireEvent, render, screen } from '@testing-library/react' import FormGeneration from '../form-generation' diff --git a/web/app/components/base/features/new-feature-panel/moderation/moderation-setting-modal.tsx b/web/app/components/base/features/new-feature-panel/moderation/moderation-setting-modal.tsx index c42266f16cf..148b1a56d34 100644 --- a/web/app/components/base/features/new-feature-panel/moderation/moderation-setting-modal.tsx +++ b/web/app/components/base/features/new-feature-panel/moderation/moderation-setting-modal.tsx @@ -18,7 +18,7 @@ import { settingsQueryParser, } from '@/app/components/header/account-setting/query-params' import { useDocLink } from '@/context/i18n' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { useCodeBasedExtensions, useModelProviderDetails } from '@/service/use-common' import FormGeneration from './form-generation' import ModerationContent from './moderation-content' diff --git a/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/index.spec.tsx b/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/index.spec.tsx index 6e4d2961df8..53d0ef02e25 100644 --- a/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/index.spec.tsx +++ b/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/index.spec.tsx @@ -6,7 +6,7 @@ import { TtsAutoPlay } from '@/types/app' import { FeaturesProvider } from '../../../context' import TextToSpeech from '../index' -vi.mock('@/i18n-config/language', () => ({ +vi.mock('@/i18n/language', () => ({ languages: [ { value: 'en-US', name: 'English', example: 'Hello world' }, { value: 'zh-Hans', name: '中文', example: '你好' }, diff --git a/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/param-config-content.spec.tsx b/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/param-config-content.spec.tsx index ebd7a8b5cf7..36397b7c24b 100644 --- a/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/param-config-content.spec.tsx +++ b/web/app/components/base/features/new-feature-panel/text-to-speech/__tests__/param-config-content.spec.tsx @@ -41,7 +41,7 @@ vi.mock('@/next/navigation', () => ({ useParams: () => ({}), })) -vi.mock('@/i18n-config/language', () => ({ +vi.mock('@/i18n/language', () => ({ get languages() { return mockLanguages }, diff --git a/web/app/components/base/features/new-feature-panel/text-to-speech/index.tsx b/web/app/components/base/features/new-feature-panel/text-to-speech/index.tsx index 4f7ddfba655..5a923b15ab9 100644 --- a/web/app/components/base/features/new-feature-panel/text-to-speech/index.tsx +++ b/web/app/components/base/features/new-feature-panel/text-to-speech/index.tsx @@ -10,7 +10,7 @@ import FeatureCard from '@/app/components/base/features/new-feature-panel/featur import VoiceSettings from '@/app/components/base/features/new-feature-panel/text-to-speech/voice-settings' import { FeatureEnum } from '@/app/components/base/features/types' import { TextToAudio } from '@/app/components/base/icons/src/vender/features' -import { languages } from '@/i18n-config/language' +import { languages } from '@/i18n/language' import { TtsAutoPlay } from '@/types/app' type Props = Readonly<{ diff --git a/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx b/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx index 7eb99ac4095..77d6ca9658e 100644 --- a/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx +++ b/web/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx @@ -20,7 +20,7 @@ import { replace } from 'string-ts' import { AudioBtn } from '@/app/components/base/audio-btn' import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks' import { Infotip } from '@/app/components/base/infotip' -import { languages } from '@/i18n-config/language' +import { languages } from '@/i18n/language' import { usePathname } from '@/next/navigation' import { consoleQuery } from '@/service/console' import { TtsAutoPlay } from '@/types/app' diff --git a/web/app/components/base/form/types.ts b/web/app/components/base/form/types.ts index 8a1742074a2..d93220ea3d4 100644 --- a/web/app/components/base/form/types.ts +++ b/web/app/components/base/form/types.ts @@ -1,6 +1,6 @@ import type { AnyFormApi, FieldValidators } from '@tanstack/react-form' import type { ForwardedRef, ReactNode } from 'react' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' export type TypeWithI18N = { en_US: T diff --git a/web/app/components/base/new-audio-button/__tests__/index.spec.tsx b/web/app/components/base/new-audio-button/__tests__/index.spec.tsx index 0e8de6b1b1a..d1c87fd4f60 100644 --- a/web/app/components/base/new-audio-button/__tests__/index.spec.tsx +++ b/web/app/components/base/new-audio-button/__tests__/index.spec.tsx @@ -5,7 +5,7 @@ import userEvent from '@testing-library/user-event' import { createInstance } from 'i18next' import { I18nextProvider } from 'react-i18next' import { beforeEach, describe, expect, it, vi } from 'vite-plus/test' -import appApi from '@/i18n/en-US/app-api.json' +import appApi from '@/i18n/locales/en-US/app-api.json' import { useParams, usePathname } from '@/next/navigation' import AudioBtn from '../index' diff --git a/web/app/components/base/resize-handle/__tests__/index.spec.tsx b/web/app/components/base/resize-handle/__tests__/index.spec.tsx index 7e232417a6f..9fd4bb3b668 100644 --- a/web/app/components/base/resize-handle/__tests__/index.spec.tsx +++ b/web/app/components/base/resize-handle/__tests__/index.spec.tsx @@ -6,7 +6,7 @@ import ResizeHandle from '..' vi.mock('react-i18next', async () => { const { createReactI18nextMock } = await import('@/test/i18n-mock') - const { default: common } = await import('@/i18n/en-US/common.json') + const { default: common } = await import('@/i18n/locales/en-US/common.json') return createReactI18nextMock(common) }) diff --git a/web/app/components/billing/pricing/__tests__/footer.spec.tsx b/web/app/components/billing/pricing/__tests__/footer.spec.tsx index ea564663d04..5a1a2b09910 100644 --- a/web/app/components/billing/pricing/__tests__/footer.spec.tsx +++ b/web/app/components/billing/pricing/__tests__/footer.spec.tsx @@ -1,4 +1,4 @@ -import type { Locale } from '@/i18n-config/locale' +import type { Locale } from '@/i18n/locale' import { render, screen } from '@testing-library/react' import { PricingFooter } from '../footer' diff --git a/web/app/components/billing/pricing/footer.tsx b/web/app/components/billing/pricing/footer.tsx index b1f5f4f5652..f729dbecc90 100644 --- a/web/app/components/billing/pricing/footer.tsx +++ b/web/app/components/billing/pricing/footer.tsx @@ -1,4 +1,4 @@ -import type { Locale } from '@/i18n-config/locale' +import type { Locale } from '@/i18n/locale' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import Link from '@/next/link' diff --git a/web/app/components/datasets/access-config/index.tsx b/web/app/components/datasets/access-config/index.tsx index 579c18c038d..b4ae968f9b8 100644 --- a/web/app/components/datasets/access-config/index.tsx +++ b/web/app/components/datasets/access-config/index.tsx @@ -12,7 +12,7 @@ import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { workspacePermissionKeysAtom } from '@/context/permission-state' import { userProfileQueryOptions } from '@/features/account-profile/client' import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { getAccessControlTemplateLanguage } from '@/i18n-config/language' +import { getAccessControlTemplateLanguage } from '@/i18n/language' import { RESOURCE_ACCESS_SETTINGS_PAGE_SIZE } from '@/service/access-control/constants' import { useDatasetAccessRules, diff --git a/web/app/components/datasets/create-from-pipeline/list/built-in-pipeline-list.tsx b/web/app/components/datasets/create-from-pipeline/list/built-in-pipeline-list.tsx index 4b7f346d814..1badbede64a 100644 --- a/web/app/components/datasets/create-from-pipeline/list/built-in-pipeline-list.tsx +++ b/web/app/components/datasets/create-from-pipeline/list/built-in-pipeline-list.tsx @@ -2,7 +2,7 @@ import { useSuspenseQuery } from '@tanstack/react-query' import { useMemo } from 'react' import { useLocale } from '#i18n' import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { usePipelineTemplateList } from '@/service/use-pipeline' import CreateCard from './create-card' import TemplateCard from './template-card' diff --git a/web/app/components/datasets/create/file-uploader/__tests__/index.spec.tsx b/web/app/components/datasets/create/file-uploader/__tests__/index.spec.tsx index e2b41f00cb8..c8b503ca8e3 100644 --- a/web/app/components/datasets/create/file-uploader/__tests__/index.spec.tsx +++ b/web/app/components/datasets/create/file-uploader/__tests__/index.spec.tsx @@ -31,7 +31,7 @@ vi.mock('@/service/use-common', () => ({ data: { allowed_extensions: ['pdf', 'docx', 'txt'] }, }), })) -vi.mock('@/i18n-config/language', () => ({ +vi.mock('@/i18n/language', () => ({ LanguagesSupported: ['en-US', 'zh-Hans'], })) diff --git a/web/app/components/datasets/create/file-uploader/hooks/__tests__/use-file-upload.spec.tsx b/web/app/components/datasets/create/file-uploader/hooks/__tests__/use-file-upload.spec.tsx index 3d82ed33950..5586bb01ea4 100644 --- a/web/app/components/datasets/create/file-uploader/hooks/__tests__/use-file-upload.spec.tsx +++ b/web/app/components/datasets/create/file-uploader/hooks/__tests__/use-file-upload.spec.tsx @@ -38,7 +38,7 @@ vi.mock('@/service/use-common', () => ({ useFileUploadConfig: () => ({ data: mockFileUploadConfig }), useFileSupportTypes: () => ({ data: mockSupportTypes }), })) -vi.mock('@/i18n-config/language', () => ({ +vi.mock('@/i18n/language', () => ({ LanguagesSupported: ['en-US', 'zh-Hans'], })) diff --git a/web/app/components/datasets/create/file-uploader/hooks/use-file-upload.ts b/web/app/components/datasets/create/file-uploader/hooks/use-file-upload.ts index 9da58edbbf4..2606889e901 100644 --- a/web/app/components/datasets/create/file-uploader/hooks/use-file-upload.ts +++ b/web/app/components/datasets/create/file-uploader/hooks/use-file-upload.ts @@ -8,7 +8,7 @@ import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import { getFileUploadErrorMessage } from '@/app/components/base/file-uploader/utils' import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { upload } from '@/service/base' import { useFileSupportTypes, useFileUploadConfig } from '@/service/use-common' import { getFileExtension } from '@/utils/format' diff --git a/web/app/components/datasets/create/step-two/index.tsx b/web/app/components/datasets/create/step-two/index.tsx index a3b7381be87..5ed0e40578b 100644 --- a/web/app/components/datasets/create/step-two/index.tsx +++ b/web/app/components/datasets/create/step-two/index.tsx @@ -10,7 +10,7 @@ import { useLocale } from '#i18n' import Divider from '@/app/components/base/divider' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { DataSourceProvider } from '@/models/common' import { ChunkingMode, ProcessMode } from '@/models/datasets' import { useFetchDefaultProcessRule } from '@/service/knowledge/use-create-dataset' diff --git a/web/app/components/datasets/create/step-two/language-select/__tests__/index.spec.tsx b/web/app/components/datasets/create/step-two/language-select/__tests__/index.spec.tsx index 64553d139df..d6346db4c0e 100644 --- a/web/app/components/datasets/create/step-two/language-select/__tests__/index.spec.tsx +++ b/web/app/components/datasets/create/step-two/language-select/__tests__/index.spec.tsx @@ -2,7 +2,7 @@ import type { ILanguageSelectProps } from '../index' import { act, fireEvent, render, screen, waitFor, within } from '@testing-library/react' import userEvent from '@testing-library/user-event' import * as React from 'react' -import { languages } from '@/i18n-config/language' +import { languages } from '@/i18n/language' import LanguageSelect from '../index' const supportedLanguages = languages.filter((language) => language.supported) diff --git a/web/app/components/datasets/create/step-two/language-select/index.tsx b/web/app/components/datasets/create/step-two/language-select/index.tsx index c127906f76e..aef2e4f1305 100644 --- a/web/app/components/datasets/create/step-two/language-select/index.tsx +++ b/web/app/components/datasets/create/step-two/language-select/index.tsx @@ -11,7 +11,7 @@ import { SelectValue, } from '@langgenius/dify-ui/select' import * as React from 'react' -import { languages } from '@/i18n-config/language' +import { languages } from '@/i18n/language' export type ILanguageSelectProps = { currentLanguage: string diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/hooks/__tests__/use-local-file-upload.spec.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/hooks/__tests__/use-local-file-upload.spec.tsx index 58da00674f7..d6e9047723f 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/hooks/__tests__/use-local-file-upload.spec.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/local-file/hooks/__tests__/use-local-file-upload.spec.tsx @@ -36,7 +36,7 @@ vi.mock('@/utils/format', () => ({ }, })) // Mock i18n config -vi.mock('@/i18n-config/language', () => ({ +vi.mock('@/i18n/language', () => ({ LanguagesSupported: ['en-US', 'zh-Hans'], })) diff --git a/web/app/components/datasets/documents/detail/batch-modal/__tests__/csv-downloader.spec.tsx b/web/app/components/datasets/documents/detail/batch-modal/__tests__/csv-downloader.spec.tsx index 0ffc93d4a96..d84a53350ca 100644 --- a/web/app/components/datasets/documents/detail/batch-modal/__tests__/csv-downloader.spec.tsx +++ b/web/app/components/datasets/documents/detail/batch-modal/__tests__/csv-downloader.spec.tsx @@ -1,7 +1,7 @@ import type { ReactNode } from 'react' import { render, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vite-plus/test' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { ChunkingMode } from '@/models/datasets' import CSVDownload from '../csv-downloader' diff --git a/web/app/components/datasets/documents/detail/batch-modal/csv-downloader.tsx b/web/app/components/datasets/documents/detail/batch-modal/csv-downloader.tsx index 1f18f464437..da1355ea611 100644 --- a/web/app/components/datasets/documents/detail/batch-modal/csv-downloader.tsx +++ b/web/app/components/datasets/documents/detail/batch-modal/csv-downloader.tsx @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next' import { useCSVDownloader } from 'react-papaparse' import { useLocale } from '#i18n' import { Download02 as DownloadIcon } from '@/app/components/base/icons/src/vender/solid/general' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { ChunkingMode } from '@/models/datasets' const CSV_TEMPLATE_QA_EN = [ diff --git a/web/app/components/explore/category.tsx b/web/app/components/explore/category.tsx index 8d7d9ab77ad..777d58a9b2d 100644 --- a/web/app/components/explore/category.tsx +++ b/web/app/components/explore/category.tsx @@ -3,7 +3,7 @@ import type { AppCategory } from '@/models/explore' import { cn } from '@langgenius/dify-ui/cn' import { RadioGroup, RadioItem } from '@langgenius/dify-ui/radio-group' import { useTranslation } from 'react-i18next' -import exploreI18n from '@/i18n/en-US/explore.json' +import exploreI18n from '@/i18n/locales/en-US/explore.json' type ICategoryProps = { className?: string diff --git a/web/app/components/goto-anything/actions/__tests__/plugin.spec.ts b/web/app/components/goto-anything/actions/__tests__/plugin.spec.ts index 16a0dc946f3..faf634ec905 100644 --- a/web/app/components/goto-anything/actions/__tests__/plugin.spec.ts +++ b/web/app/components/goto-anything/actions/__tests__/plugin.spec.ts @@ -6,8 +6,8 @@ vi.mock('@/service/marketplace', () => ({ marketplaceQuery: { searchAdvanced: { queryOptions: serviceMocks.queryOptions } }, })) -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), renderI18nObject: vi.fn((value: Record | string, locale: string) => typeof value === 'string' ? value : value[locale] || value.en_US || '', ), diff --git a/web/app/components/goto-anything/actions/commands/__tests__/language.spec.ts b/web/app/components/goto-anything/actions/commands/__tests__/language.spec.ts index 670e58c785f..dbf84f2f351 100644 --- a/web/app/components/goto-anything/actions/commands/__tests__/language.spec.ts +++ b/web/app/components/goto-anything/actions/commands/__tests__/language.spec.ts @@ -2,7 +2,7 @@ import { registerCommands, unregisterCommands } from '../command-bus' import { languageCommand } from '../language' vi.mock('../command-bus') -vi.mock('@/i18n-config/language', () => ({ +vi.mock('@/i18n/language', () => ({ languages: [ { value: 'en-US', name: 'English', supported: true }, { value: 'zh-Hans', name: '简体中文', supported: true }, diff --git a/web/app/components/goto-anything/actions/commands/__tests__/slash.spec.tsx b/web/app/components/goto-anything/actions/commands/__tests__/slash.spec.tsx index 90471eebb64..dbc1c3993d2 100644 --- a/web/app/components/goto-anything/actions/commands/__tests__/slash.spec.tsx +++ b/web/app/components/goto-anything/actions/commands/__tests__/slash.spec.tsx @@ -43,7 +43,7 @@ vi.mock('next-themes', () => ({ setTheme: mockSetTheme, }), })) -vi.mock('@/i18n-config/client', () => ({ +vi.mock('@/i18n/client', () => ({ setLocaleOnClient: mockSetLocale, })) vi.mock('@/features/agent-v2/feature-flag', () => ({ diff --git a/web/app/components/goto-anything/actions/commands/language.tsx b/web/app/components/goto-anything/actions/commands/language.tsx index 0439124f4ea..0d064c60821 100644 --- a/web/app/components/goto-anything/actions/commands/language.tsx +++ b/web/app/components/goto-anything/actions/commands/language.tsx @@ -1,7 +1,7 @@ import type { CommandSearchResult } from '../types' import type { SlashCommandHandler } from './types' import { getI18n } from 'react-i18next' -import { languages } from '@/i18n-config/language' +import { languages } from '@/i18n/language' import { registerCommands, unregisterCommands } from './command-bus' // Language dependency types diff --git a/web/app/components/goto-anything/actions/commands/slash-provider.tsx b/web/app/components/goto-anything/actions/commands/slash-provider.tsx index 914bc1ff253..5589c4f83f9 100644 --- a/web/app/components/goto-anything/actions/commands/slash-provider.tsx +++ b/web/app/components/goto-anything/actions/commands/slash-provider.tsx @@ -6,7 +6,7 @@ import { ENABLE_FEATURE_PREVIEW } from '@/config' import { useDocLink } from '@/context/i18n' import { isCurrentWorkspaceDatasetOperatorAtom } from '@/context/workspace-state' import { isAgentV2Enabled } from '@/features/agent-v2/feature-flag' -import { setLocaleOnClient } from '@/i18n-config/client' +import { setLocaleOnClient } from '@/i18n/client' import { accountCommand } from './account' import { createCommand } from './create' import { discordCommand } from './discord' diff --git a/web/app/components/goto-anything/actions/plugin.tsx b/web/app/components/goto-anything/actions/plugin.tsx index 491afa7b965..5ff0fa7ed4a 100644 --- a/web/app/components/goto-anything/actions/plugin.tsx +++ b/web/app/components/goto-anything/actions/plugin.tsx @@ -1,6 +1,6 @@ import type { Plugin } from '../../plugins/types' import type { ActionItem, PluginSearchResult } from './types' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { marketplaceQuery } from '@/service/marketplace' import Icon from '../../plugins/card/base/card-icon' import { getFormattedPlugin } from '../../plugins/marketplace/utils' diff --git a/web/app/components/header/account-setting/access-rules-page/permission-set-modal/index.tsx b/web/app/components/header/account-setting/access-rules-page/permission-set-modal/index.tsx index 145bb6f7fb7..29a67e9ba2d 100644 --- a/web/app/components/header/account-setting/access-rules-page/permission-set-modal/index.tsx +++ b/web/app/components/header/account-setting/access-rules-page/permission-set-modal/index.tsx @@ -15,7 +15,7 @@ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import { getEnterpriseDocUrl } from '@/context/i18n' -import { getDocLanguage } from '@/i18n-config/language' +import { getDocLanguage } from '@/i18n/language' import PermissionPicker from './permission-picker' export type PermissionSetModalMode = 'create' | 'edit' | 'view' diff --git a/web/app/components/header/account-setting/access-rules-page/resource-access-rule-section.tsx b/web/app/components/header/account-setting/access-rules-page/resource-access-rule-section.tsx index 6285cf5503e..834b15c386a 100644 --- a/web/app/components/header/account-setting/access-rules-page/resource-access-rule-section.tsx +++ b/web/app/components/header/account-setting/access-rules-page/resource-access-rule-section.tsx @@ -10,7 +10,7 @@ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import { workspacePermissionKeysAtom } from '@/context/permission-state' -import { getAccessControlTemplateLanguage } from '@/i18n-config/language' +import { getAccessControlTemplateLanguage } from '@/i18n/language' import { consoleQuery } from '@/service/console' import { hasPermission } from '@/utils/permission' import AccessRuleSection from './access-rule-section' diff --git a/web/app/components/header/account-setting/members-page/index.tsx b/web/app/components/header/account-setting/members-page/index.tsx index b76c055545c..d808cea5fd6 100644 --- a/web/app/components/header/account-setting/members-page/index.tsx +++ b/web/app/components/header/account-setting/members-page/index.tsx @@ -15,7 +15,7 @@ import { workspacePermissionKeysAtom } from '@/context/permission-state' import { currentWorkspaceAtom, isCurrentWorkspaceOwnerAtom } from '@/context/workspace-state' import { userProfileQueryOptions } from '@/features/account-profile/client' import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { getAccessControlTemplateLanguage, LanguagesSupported } from '@/i18n-config/language' +import { getAccessControlTemplateLanguage, LanguagesSupported } from '@/i18n/language' import { useUpdateRolesOfMember } from '@/service/access-control/use-member-roles' import { consoleQuery } from '@/service/console' import { useMembers } from '@/service/use-common' diff --git a/web/app/components/header/account-setting/members-page/invite-modal/role-selector.tsx b/web/app/components/header/account-setting/members-page/invite-modal/role-selector.tsx index 03d3121c3ec..7450738a363 100644 --- a/web/app/components/header/account-setting/members-page/invite-modal/role-selector.tsx +++ b/web/app/components/header/account-setting/members-page/invite-modal/role-selector.tsx @@ -18,7 +18,7 @@ import { import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' -import { getAccessControlTemplateLanguage } from '@/i18n-config/language' +import { getAccessControlTemplateLanguage } from '@/i18n/language' import { useWorkspaceRoleList } from '@/service/access-control/use-workspace-roles' type RoleSelectorProps = { diff --git a/web/app/components/header/account-setting/members-page/member-details-modal/index.tsx b/web/app/components/header/account-setting/members-page/member-details-modal/index.tsx index 93f5dbf6d65..75f455707d9 100644 --- a/web/app/components/header/account-setting/members-page/member-details-modal/index.tsx +++ b/web/app/components/header/account-setting/members-page/member-details-modal/index.tsx @@ -9,7 +9,7 @@ import { memo, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import { LoadingPlaceholder } from '@/app/components/base/loading-placeholder' -import { getAccessControlTemplateLanguage } from '@/i18n-config/language' +import { getAccessControlTemplateLanguage } from '@/i18n/language' import { useRolesOfMember } from '@/service/access-control/use-member-roles' import AssignRolesModal from '../assign-roles-modal' import PermissionRoleChip from './permission-role-chip' diff --git a/web/app/components/header/account-setting/model-provider-page/hooks.ts b/web/app/components/header/account-setting/model-provider-page/hooks.ts index dfdbf8154d4..041dfe1cffd 100644 --- a/web/app/components/header/account-setting/model-provider-page/hooks.ts +++ b/web/app/components/header/account-setting/model-provider-page/hooks.ts @@ -22,7 +22,7 @@ import { } from '@/app/components/plugins/marketplace/hooks' import { PluginCategoryEnum } from '@/app/components/plugins/types' import { useModalContextSelector } from '@/context/modal-context' -import { getModelLanguage } from '@/i18n-config/metadata' +import { getModelLanguage } from '@/i18n/metadata' import { fetchDefaultModal } from '@/service/common' import { consoleQuery } from '@/service/console' import { commonQueryKeys, modelProviderDetailsQueryOptions } from '@/service/use-common' diff --git a/web/app/components/header/account-setting/model-provider-page/model-icon/index.tsx b/web/app/components/header/account-setting/model-provider-page/model-icon/index.tsx index 51925bfcfe1..150187af5e1 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-icon/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-icon/index.tsx @@ -8,7 +8,7 @@ import type { ModelSelectorProvider } from '../model-selector/types' import { cn } from '@langgenius/dify-ui/cn' import { OpenaiYellow } from '@/app/components/base/icons/src/public/llm' import useTheme from '@/hooks/use-theme' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { Theme } from '@/types/app' import { useLanguage } from '../hooks' diff --git a/web/app/components/header/account-setting/model-provider-page/model-name/index.tsx b/web/app/components/header/account-setting/model-provider-page/model-name/index.tsx index 82722aaf5ee..9807acdc3ad 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-name/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-name/index.tsx @@ -1,7 +1,7 @@ import type { FC, PropsWithChildren } from 'react' import type { ModelSelectorModel } from '../model-selector/types' import { cn } from '@langgenius/dify-ui/cn' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { useLanguage } from '../hooks' import ModelBadge from '../model-badge' import FeatureIcon from '../model-selector/feature-icon' diff --git a/web/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx b/web/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx index c5851f606ab..1dd68ba7ff1 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx @@ -18,7 +18,7 @@ import { useCallback, useId, useState } from 'react' import { useTranslation } from 'react-i18next' import { useModalContext } from '@/context/modal-context' import { useCredentialPermissions } from '@/hooks/use-credential-permissions' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { consoleQuery } from '@/service/console' import { ConfigurationMethodEnum, ModelStatusEnum } from '../declarations' import { diff --git a/web/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx b/web/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx index 95bf0f00191..7712cfbbee3 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx @@ -21,7 +21,7 @@ import useRefreshPluginList from '@/app/components/plugins/install-plugin/hooks/ import useWorkspacePluginInstallPermission from '@/app/components/plugins/install-plugin/hooks/use-workspace-plugin-install-permission' import { PluginCategoryEnum } from '@/app/components/plugins/types' import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { consoleQuery } from '@/service/console' import { fetchPluginInfoFromMarketPlace } from '@/service/plugins' import { useInstallPackageFromMarketPlace } from '@/service/use-plugins' diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx index 2c0405b2c9f..01949571294 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx @@ -12,7 +12,7 @@ import { PluginCategoryEnum } from '@/app/components/plugins/types' import { workspacePermissionKeysAtom } from '@/context/permission-state' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { useCredentialPermissions } from '@/hooks/use-credential-permissions' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { consoleQuery } from '@/service/console' import { commonQueryKeys } from '@/service/use-common' import { useInvalidateInstalledPluginList } from '@/service/use-plugins' diff --git a/web/app/components/header/account-setting/model-provider-page/provider-icon/index.tsx b/web/app/components/header/account-setting/model-provider-page/provider-icon/index.tsx index d46ff856715..13dc35e40ca 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-icon/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-icon/index.tsx @@ -4,7 +4,7 @@ import { cn } from '@langgenius/dify-ui/cn' import { AnthropicDark, AnthropicLight } from '@/app/components/base/icons/src/public/llm' import { Openai } from '@/app/components/base/icons/src/vender/other' import useTheme from '@/hooks/use-theme' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { Theme } from '@/types/app' import { useLanguage } from '../hooks' diff --git a/web/app/components/header/account-setting/permissions-page/index.tsx b/web/app/components/header/account-setting/permissions-page/index.tsx index 4bc4c3ed268..dd4b1fdc7c4 100644 --- a/web/app/components/header/account-setting/permissions-page/index.tsx +++ b/web/app/components/header/account-setting/permissions-page/index.tsx @@ -9,7 +9,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import { workspacePermissionKeysAtom } from '@/context/permission-state' -import { getAccessControlTemplateLanguage } from '@/i18n-config/language' +import { getAccessControlTemplateLanguage } from '@/i18n/language' import { useCreateWorkspaceRole, useUpdateWorkspaceRole, diff --git a/web/app/components/header/account-setting/permissions-page/role-modal/index.tsx b/web/app/components/header/account-setting/permissions-page/role-modal/index.tsx index 2d66c4b9ccb..740ab51a93c 100644 --- a/web/app/components/header/account-setting/permissions-page/role-modal/index.tsx +++ b/web/app/components/header/account-setting/permissions-page/role-modal/index.tsx @@ -15,7 +15,7 @@ import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import { getEnterpriseDocUrl } from '@/context/i18n' -import { getDocLanguage } from '@/i18n-config/language' +import { getDocLanguage } from '@/i18n/language' import PermissionField from './permission-field' export type RoleModalMode = 'create' | 'view' | 'edit' diff --git a/web/app/components/header/account-setting/preference-page/__tests__/index.spec.tsx b/web/app/components/header/account-setting/preference-page/__tests__/index.spec.tsx index a4f65eebca9..494c1479bd0 100644 --- a/web/app/components/header/account-setting/preference-page/__tests__/index.spec.tsx +++ b/web/app/components/header/account-setting/preference-page/__tests__/index.spec.tsx @@ -3,7 +3,7 @@ import { ToastHost } from '@langgenius/dify-ui/toast' import { QueryClientProvider } from '@tanstack/react-query' import { screen, waitFor, within } from '@testing-library/react' import userEvent from '@testing-library/user-event' -import { languages } from '@/i18n-config/language' +import { languages } from '@/i18n/language' import { createAccountProfileQueryClient } from '@/test/console/account-profile' import { render } from '@/test/console/render' import { timezones } from '@/utils/timezone' @@ -30,7 +30,7 @@ vi.mock('#i18n', async (importOriginal) => ({ useLocale: () => mockLocale, })) -vi.mock('@/i18n-config/client', () => ({ +vi.mock('@/i18n/client', () => ({ setLocaleOnClient: vi.fn(), })) diff --git a/web/app/components/header/account-setting/preference-page/index.tsx b/web/app/components/header/account-setting/preference-page/index.tsx index 494207b55c3..281c09a4f9f 100644 --- a/web/app/components/header/account-setting/preference-page/index.tsx +++ b/web/app/components/header/account-setting/preference-page/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import { Select, SelectContent, @@ -15,8 +15,8 @@ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import { userProfileQueryOptions } from '@/features/account-profile/client' -import { setLocaleOnClient } from '@/i18n-config/client' -import { languages } from '@/i18n-config/language' +import { setLocaleOnClient } from '@/i18n/client' +import { languages } from '@/i18n/language' import { useRouter } from '@/next/navigation' import { consoleQuery } from '@/service/console' import { timezones } from '@/utils/timezone' diff --git a/web/app/components/header/account-setting/workspace-role-checkbox-list.tsx b/web/app/components/header/account-setting/workspace-role-checkbox-list.tsx index 52338cb25c2..5445c25d58c 100644 --- a/web/app/components/header/account-setting/workspace-role-checkbox-list.tsx +++ b/web/app/components/header/account-setting/workspace-role-checkbox-list.tsx @@ -15,7 +15,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import { SearchInput } from '@/app/components/base/search-input' -import { getAccessControlTemplateLanguage } from '@/i18n-config/language' +import { getAccessControlTemplateLanguage } from '@/i18n/language' import { useWorkspaceRoleList } from '@/service/access-control/use-workspace-roles' type WorkspaceRoleCheckboxListProps = { diff --git a/web/app/components/integrations/tool-provider-card.tsx b/web/app/components/integrations/tool-provider-card.tsx index c22c599a289..85c4a804e28 100644 --- a/web/app/components/integrations/tool-provider-card.tsx +++ b/web/app/components/integrations/tool-provider-card.tsx @@ -8,7 +8,7 @@ import { useTranslation } from 'react-i18next' import Icon from '@/app/components/plugins/card/base/card-icon' import CornerMark from '@/app/components/plugins/card/base/corner-mark' import { useGetLanguage } from '@/context/i18n' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' const getCollectionPluginIdentity = (collection: Collection) => { const [org, ...nameParts] = collection.plugin_id?.split('/').filter(Boolean) ?? [] diff --git a/web/app/components/plugins/card/__tests__/index.spec.tsx b/web/app/components/plugins/card/__tests__/index.spec.tsx index 669591379d8..b505a6d070d 100644 --- a/web/app/components/plugins/card/__tests__/index.spec.tsx +++ b/web/app/components/plugins/card/__tests__/index.spec.tsx @@ -43,8 +43,8 @@ vi.mock('@/hooks/use-theme', () => ({ default: () => ({ theme: 'light' }), })) -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), renderI18nObject: (value: Record) => value['en-US'] ?? '', })) diff --git a/web/app/components/plugins/card/index.tsx b/web/app/components/plugins/card/index.tsx index cdbb6f4304c..8685e334fe5 100644 --- a/web/app/components/plugins/card/index.tsx +++ b/web/app/components/plugins/card/index.tsx @@ -7,7 +7,7 @@ import { useTranslation } from '#i18n' import { useGetLanguage } from '@/context/i18n' import { currentWorkspaceIdAtom } from '@/context/workspace-state' import useTheme from '@/hooks/use-theme' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { Theme } from '@/types/app' import { formatNumber } from '@/utils/format' import Partner from '../base/badges/partner' diff --git a/web/app/components/plugins/marketplace/__tests__/server-entry.spec.tsx b/web/app/components/plugins/marketplace/__tests__/server-entry.spec.tsx index da95eaf2204..5d8a7526b5e 100644 --- a/web/app/components/plugins/marketplace/__tests__/server-entry.spec.tsx +++ b/web/app/components/plugins/marketplace/__tests__/server-entry.spec.tsx @@ -9,7 +9,7 @@ const { mockFetchPluginBanners, mockGetLocaleOnServer } = vi.hoisted(() => ({ mockGetLocaleOnServer: vi.fn(), })) -vi.mock('@/i18n-config/server', () => ({ +vi.mock('@/i18n/server', () => ({ getLocaleOnServer: mockGetLocaleOnServer, })) diff --git a/web/app/components/plugins/marketplace/home/home-guide.tsx b/web/app/components/plugins/marketplace/home/home-guide.tsx index bceac49c2df..950a56e3a59 100644 --- a/web/app/components/plugins/marketplace/home/home-guide.tsx +++ b/web/app/components/plugins/marketplace/home/home-guide.tsx @@ -7,7 +7,7 @@ import { SubmitRequestDropdownMenu, } from '@/app/components/plugins/plugin-page/nav-operations' import { defaultDocBaseUrl } from '@/context/i18n' -import { getDocLanguage } from '@/i18n-config/language' +import { getDocLanguage } from '@/i18n/language' function MarketplaceGuide() { const { i18n } = useTranslation() diff --git a/web/app/components/plugins/marketplace/home/marketplace-search-autocomplete.tsx b/web/app/components/plugins/marketplace/home/marketplace-search-autocomplete.tsx index 39c2345f4cc..cd6893e2be0 100644 --- a/web/app/components/plugins/marketplace/home/marketplace-search-autocomplete.tsx +++ b/web/app/components/plugins/marketplace/home/marketplace-search-autocomplete.tsx @@ -25,7 +25,7 @@ import { useDebounce } from 'ahooks' import { useEffect, useRef, useState } from 'react' import { useTranslation } from '#i18n' import { MARKETPLACE_API_PREFIX } from '@/config' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { marketplaceQuery } from '@/service/marketplace' import { markMarketplaceSiteSearch } from '@/utils/marketplace-site-track' import { diff --git a/web/app/components/plugins/marketplace/index.tsx b/web/app/components/plugins/marketplace/index.tsx index 92baa6f3380..4b0b8fe08d7 100644 --- a/web/app/components/plugins/marketplace/index.tsx +++ b/web/app/components/plugins/marketplace/index.tsx @@ -1,7 +1,7 @@ import type { PluginBanner } from '@dify/contracts/marketplace' import type { SearchParams } from 'nuqs' import type { MarketplaceViewProps } from './view' -import { getLocaleOnServer } from '@/i18n-config/server' +import { getLocaleOnServer } from '@/i18n/server' import { fetchPluginBanners } from './home/banners' import { HydrateQueryClient } from './hydration-server' import { prefetchMarketplaceDehydratedState } from './prefetch-marketplace-dehydrated-state' diff --git a/web/app/components/plugins/marketplace/list/__tests__/list-with-collection-layout.browser.spec.tsx b/web/app/components/plugins/marketplace/list/__tests__/list-with-collection-layout.browser.spec.tsx index ebc278238a8..aa016f45c10 100644 --- a/web/app/components/plugins/marketplace/list/__tests__/list-with-collection-layout.browser.spec.tsx +++ b/web/app/components/plugins/marketplace/list/__tests__/list-with-collection-layout.browser.spec.tsx @@ -26,8 +26,8 @@ vi.mock('#i18n', async () => { } }) -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), getPluginLanguage: (locale: string) => locale, })) diff --git a/web/app/components/plugins/marketplace/list/__tests__/list-with-collection.spec.tsx b/web/app/components/plugins/marketplace/list/__tests__/list-with-collection.spec.tsx index 36cf7dae10e..0073d7aba91 100644 --- a/web/app/components/plugins/marketplace/list/__tests__/list-with-collection.spec.tsx +++ b/web/app/components/plugins/marketplace/list/__tests__/list-with-collection.spec.tsx @@ -9,8 +9,8 @@ vi.mock('../../atoms', () => ({ useMarketplaceMoreClick: () => mockMoreClick, })) -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), getPluginLanguage: (locale: string) => locale, })) diff --git a/web/app/components/plugins/marketplace/list/card-wrapper.tsx b/web/app/components/plugins/marketplace/list/card-wrapper.tsx index 12ac75161fc..7a4db8ffdc3 100644 --- a/web/app/components/plugins/marketplace/list/card-wrapper.tsx +++ b/web/app/components/plugins/marketplace/list/card-wrapper.tsx @@ -11,7 +11,7 @@ import { useTags } from '@/app/components/plugins/hooks' import { useOptionalPluginInstallPermission } from '@/app/components/plugins/install-plugin/hooks/use-plugin-install-permission' import InstallFromMarketplace from '@/app/components/plugins/install-plugin/install-from-marketplace' import { useGetLanguage } from '@/context/i18n' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import Link from '@/next/link' import { trackMarketplaceSiteCardClick } from '@/utils/marketplace-site-track' import MarketplaceDetailDialog from '../detail-dialog' diff --git a/web/app/components/plugins/marketplace/list/list-with-collection.tsx b/web/app/components/plugins/marketplace/list/list-with-collection.tsx index bc2d75ad941..09588c55751 100644 --- a/web/app/components/plugins/marketplace/list/list-with-collection.tsx +++ b/web/app/components/plugins/marketplace/list/list-with-collection.tsx @@ -5,7 +5,7 @@ import type { Plugin } from '@/app/components/plugins/types' import { cn } from '@langgenius/dify-ui/cn' import { useEffect, useId, useMemo, useRef, useState } from 'react' import { useLocale, useTranslation } from '#i18n' -import { getPluginLanguage } from '@/i18n-config/metadata' +import { getPluginLanguage } from '@/i18n/metadata' import { trackMarketplaceSiteEvent } from '@/utils/marketplace-site-track' import { useMarketplaceMoreClick } from '../atoms' import { MARKETPLACE_CONTAINER_ID } from '../constants' diff --git a/web/app/components/plugins/marketplace/templates/index.tsx b/web/app/components/plugins/marketplace/templates/index.tsx index da35a40ec91..b7a7f86b5b5 100644 --- a/web/app/components/plugins/marketplace/templates/index.tsx +++ b/web/app/components/plugins/marketplace/templates/index.tsx @@ -1,8 +1,8 @@ import type { MarketplaceTemplate } from '@dify/contracts/marketplace' import type { TemplateCategory } from './categories' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import { cn } from '@langgenius/dify-ui/cn' -import { getTranslation } from '@/i18n-config/server' +import { getTranslation } from '@/i18n/server' import { redirect } from '@/next/navigation' import { getMarketplaceTemplateCollectionsAndTemplates, diff --git a/web/app/components/plugins/plugin-detail-panel/model-selector/__tests__/tts-params-panel.spec.tsx b/web/app/components/plugins/plugin-detail-panel/model-selector/__tests__/tts-params-panel.spec.tsx index f2be3c2d620..e32d13b3d29 100644 --- a/web/app/components/plugins/plugin-detail-panel/model-selector/__tests__/tts-params-panel.spec.tsx +++ b/web/app/components/plugins/plugin-detail-panel/model-selector/__tests__/tts-params-panel.spec.tsx @@ -2,7 +2,7 @@ import { fireEvent, render, screen, within } from '@testing-library/react' import userEvent from '@testing-library/user-event' import TTSParamsPanel from '../tts-params-panel' -vi.mock('@/i18n-config/language', () => ({ +vi.mock('@/i18n/language', () => ({ languages: [ { value: 'en-US', name: 'English', supported: true }, { value: 'zh-Hans', name: 'Chinese', supported: true }, diff --git a/web/app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx b/web/app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx index 6f0aff384bf..e67a06e8485 100644 --- a/web/app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx +++ b/web/app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx @@ -10,7 +10,7 @@ import { import * as React from 'react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { languages } from '@/i18n-config/language' +import { languages } from '@/i18n/language' type Props = Readonly<{ currentModel: any diff --git a/web/app/components/plugins/plugin-detail-panel/strategy-detail.tsx b/web/app/components/plugins/plugin-detail-panel/strategy-detail.tsx index 8986c4a81f0..4971c3aee09 100644 --- a/web/app/components/plugins/plugin-detail-panel/strategy-detail.tsx +++ b/web/app/components/plugins/plugin-detail-panel/strategy-detail.tsx @@ -2,8 +2,8 @@ import type { FC } from 'react' import type { StrategyDetail as StrategyDetailType } from '@/app/components/plugins/types' -import type { Locale } from '@/i18n-config/locale' -import type { PluginLanguage } from '@/i18n-config/metadata' +import type { Locale } from '@/i18n/locale' +import type { PluginLanguage } from '@/i18n/metadata' import { cn } from '@langgenius/dify-ui/cn' import { Drawer, diff --git a/web/app/components/plugins/plugin-detail-panel/strategy-item.tsx b/web/app/components/plugins/plugin-detail-panel/strategy-item.tsx index 89f4e56d1ae..8201618dd62 100644 --- a/web/app/components/plugins/plugin-detail-panel/strategy-item.tsx +++ b/web/app/components/plugins/plugin-detail-panel/strategy-item.tsx @@ -1,8 +1,8 @@ 'use client' import type { StrategyDetail } from '@/app/components/plugins/types' -import type { Locale } from '@/i18n-config/locale' -import type { PluginLanguage } from '@/i18n-config/metadata' +import type { Locale } from '@/i18n/locale' +import type { PluginLanguage } from '@/i18n/metadata' import { cn } from '@langgenius/dify-ui/cn' import * as React from 'react' import { useState } from 'react' diff --git a/web/app/components/plugins/plugin-mutation-model/__tests__/index.spec.tsx b/web/app/components/plugins/plugin-mutation-model/__tests__/index.spec.tsx index ea107adca89..320bc968d4b 100644 --- a/web/app/components/plugins/plugin-mutation-model/__tests__/index.spec.tsx +++ b/web/app/components/plugins/plugin-mutation-model/__tests__/index.spec.tsx @@ -18,8 +18,8 @@ vi.mock('@/hooks/use-theme', () => ({ default: () => ({ theme: 'light' }), })) -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), renderI18nObject: (obj: Record, locale: string) => { return obj?.[locale] || obj?.['en-US'] || '' }, diff --git a/web/app/components/plugins/plugin-page/__tests__/plugins-panel.spec.tsx b/web/app/components/plugins/plugin-page/__tests__/plugins-panel.spec.tsx index 69af145ed3b..d2afd68aa08 100644 --- a/web/app/components/plugins/plugin-page/__tests__/plugins-panel.spec.tsx +++ b/web/app/components/plugins/plugin-page/__tests__/plugins-panel.spec.tsx @@ -42,8 +42,8 @@ vi.mock('@tanstack/react-query', () => ({ queryOptions: (options: unknown) => options, useSuspenseQuery: () => ({ data: mockSystemFeatures.enableMarketplace }), })) -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), renderI18nObject: (value: Record, locale: string) => value[locale] || '', })) diff --git a/web/app/components/plugins/plugin-page/plugin-tasks/components/error-plugin-item.tsx b/web/app/components/plugins/plugin-page/plugin-tasks/components/error-plugin-item.tsx index f7db5146a8d..db83102ab1f 100644 --- a/web/app/components/plugins/plugin-page/plugin-tasks/components/error-plugin-item.tsx +++ b/web/app/components/plugins/plugin-page/plugin-tasks/components/error-plugin-item.tsx @@ -1,6 +1,6 @@ import type { FC } from 'react' import type { Plugin, PluginStatus } from '@/app/components/plugins/types' -import type { PluginLanguage } from '@/i18n-config/metadata' +import type { PluginLanguage } from '@/i18n/metadata' import { Button } from '@langgenius/dify-ui/button' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/web/app/components/plugins/plugin-page/plugin-tasks/components/plugin-item.tsx b/web/app/components/plugins/plugin-page/plugin-tasks/components/plugin-item.tsx index 532036044d9..5e0a267d7ff 100644 --- a/web/app/components/plugins/plugin-page/plugin-tasks/components/plugin-item.tsx +++ b/web/app/components/plugins/plugin-page/plugin-tasks/components/plugin-item.tsx @@ -1,6 +1,6 @@ import type { FC, ReactNode } from 'react' import type { PluginStatus } from '@/app/components/plugins/types' -import type { PluginLanguage } from '@/i18n-config/metadata' +import type { PluginLanguage } from '@/i18n/metadata' import { MagicBox } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices' import CardIcon from '@/app/components/plugins/card/base/card-icon' diff --git a/web/app/components/plugins/plugin-page/plugin-tasks/components/plugin-section.tsx b/web/app/components/plugins/plugin-page/plugin-tasks/components/plugin-section.tsx index c20c31ccc9a..c76b8c1bf6e 100644 --- a/web/app/components/plugins/plugin-page/plugin-tasks/components/plugin-section.tsx +++ b/web/app/components/plugins/plugin-page/plugin-tasks/components/plugin-section.tsx @@ -1,6 +1,6 @@ import type { ReactNode } from 'react' import type { PluginStatus } from '@/app/components/plugins/types' -import type { PluginLanguage } from '@/i18n-config/metadata' +import type { PluginLanguage } from '@/i18n/metadata' import { ScrollArea, ScrollAreaContent, diff --git a/web/app/components/plugins/plugin-page/plugins-panel-utils.ts b/web/app/components/plugins/plugin-page/plugins-panel-utils.ts index b5a3c6b8f4d..a95959939db 100644 --- a/web/app/components/plugins/plugin-page/plugins-panel-utils.ts +++ b/web/app/components/plugins/plugin-page/plugins-panel-utils.ts @@ -1,5 +1,5 @@ import type { Collection } from '@/app/components/tools/types' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' export const EMPTY_BUILTIN_TOOLS: Collection[] = [] diff --git a/web/app/components/plugins/plugin-page/plugins-panel.tsx b/web/app/components/plugins/plugin-page/plugins-panel.tsx index 88b423f6a83..745f3cb5b69 100644 --- a/web/app/components/plugins/plugin-page/plugins-panel.tsx +++ b/web/app/components/plugins/plugin-page/plugins-panel.tsx @@ -14,7 +14,7 @@ import { STEP_BY_STEP_TOUR_TARGETS } from '@/app/components/step-by-step-tour/ta import ProviderDetail from '@/app/components/tools/provider/detail' import { useGetLanguage } from '@/context/i18n' import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { normalizePluginCategoryListLanguage, useInstalledPluginList, diff --git a/web/app/components/plugins/reference-setting-modal/auto-update-setting/__tests__/tool-item.spec.tsx b/web/app/components/plugins/reference-setting-modal/auto-update-setting/__tests__/tool-item.spec.tsx index 6b60659ba21..3672b220ac3 100644 --- a/web/app/components/plugins/reference-setting-modal/auto-update-setting/__tests__/tool-item.spec.tsx +++ b/web/app/components/plugins/reference-setting-modal/auto-update-setting/__tests__/tool-item.spec.tsx @@ -6,8 +6,8 @@ import ToolItem from '../tool-item' vi.mock('@/config', () => ({ MARKETPLACE_API_PREFIX: 'https://marketplace.example.com', })) -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), renderI18nObject: (value: Record, language: string) => value[language], })) diff --git a/web/app/components/plugins/reference-setting-modal/auto-update-setting/tool-item.tsx b/web/app/components/plugins/reference-setting-modal/auto-update-setting/tool-item.tsx index b78456767e1..b760595a4a1 100644 --- a/web/app/components/plugins/reference-setting-modal/auto-update-setting/tool-item.tsx +++ b/web/app/components/plugins/reference-setting-modal/auto-update-setting/tool-item.tsx @@ -6,7 +6,7 @@ import * as React from 'react' import Icon from '@/app/components/plugins/card/base/card-icon' import { MARKETPLACE_API_PREFIX } from '@/config' import { useGetLanguage } from '@/context/i18n' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' type Props = Readonly<{ payload: PluginDetail diff --git a/web/app/components/plugins/types.ts b/web/app/components/plugins/types.ts index 86888865192..6412894bd9a 100644 --- a/web/app/components/plugins/types.ts +++ b/web/app/components/plugins/types.ts @@ -3,8 +3,8 @@ import type { CredentialFormSchemaBase } from '../header/account-setting/model-p import type { AutoUpdateConfig } from './reference-setting-modal/auto-update-setting/types' import type { TypeWithI18N } from '@/app/components/base/form/types' import type { ToolCredential } from '@/app/components/tools/types' -import type { Locale } from '@/i18n-config/locale' -import type { PluginLanguage } from '@/i18n-config/metadata' +import type { Locale } from '@/i18n/locale' +import type { PluginLanguage } from '@/i18n/metadata' export enum PluginCategoryEnum { tool = 'tool', diff --git a/web/app/components/provider/i18n-server.tsx b/web/app/components/provider/i18n-server.tsx index 4560a46d0ec..aa6745a2061 100644 --- a/web/app/components/provider/i18n-server.tsx +++ b/web/app/components/provider/i18n-server.tsx @@ -1,4 +1,4 @@ -import { getLocaleOnServer, getResources } from '@/i18n-config/server' +import { getLocaleOnServer, getResources } from '@/i18n/server' import { I18nClientProvider } from './i18n' export async function I18nServerProvider({ children }: { children: React.ReactNode }) { diff --git a/web/app/components/provider/i18n.tsx b/web/app/components/provider/i18n.tsx index 9c9e60a7350..ca8b41e894d 100644 --- a/web/app/components/provider/i18n.tsx +++ b/web/app/components/provider/i18n.tsx @@ -1,9 +1,9 @@ 'use client' import type { Resource } from 'i18next' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import { I18nextProvider } from 'react-i18next' -import { createI18nextInstance } from '@/i18n-config/client' +import { createI18nextInstance } from '@/i18n/client' export function I18nClientProvider({ locale, diff --git a/web/app/components/share/text-generation/hooks/__tests__/use-text-generation-app-state.spec.ts b/web/app/components/share/text-generation/hooks/__tests__/use-text-generation-app-state.spec.ts index 6dc76577d0b..0a9dae58cc1 100644 --- a/web/app/components/share/text-generation/hooks/__tests__/use-text-generation-app-state.spec.ts +++ b/web/app/components/share/text-generation/hooks/__tests__/use-text-generation-app-state.spec.ts @@ -48,7 +48,7 @@ vi.mock('@/hooks/use-document-title', () => ({ default: useDocumentTitleMock, })) -vi.mock('@/i18n-config/client', () => ({ +vi.mock('@/i18n/client', () => ({ changeLanguage: changeLanguageMock, })) diff --git a/web/app/components/share/text-generation/hooks/use-text-generation-app-state.ts b/web/app/components/share/text-generation/hooks/use-text-generation-app-state.ts index 75c853da440..90a989d2273 100644 --- a/web/app/components/share/text-generation/hooks/use-text-generation-app-state.ts +++ b/web/app/components/share/text-generation/hooks/use-text-generation-app-state.ts @@ -16,7 +16,7 @@ import { useWebAppStore } from '@/context/web-app-context' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { useAppFavicon } from '@/hooks/use-app-favicon' import useDocumentTitle from '@/hooks/use-document-title' -import { changeLanguage } from '@/i18n-config/client' +import { changeLanguage } from '@/i18n/client' import { AppSourceType, fetchSavedMessage as doFetchSavedMessage, diff --git a/web/app/components/tools/edit-custom-collection-modal/test-api.tsx b/web/app/components/tools/edit-custom-collection-modal/test-api.tsx index b70cf260e92..d32d6a315d6 100644 --- a/web/app/components/tools/edit-custom-collection-modal/test-api.tsx +++ b/web/app/components/tools/edit-custom-collection-modal/test-api.tsx @@ -24,7 +24,7 @@ import { useId, useState } from 'react' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import { AuthType } from '@/app/components/tools/types' -import { getPluginLanguage } from '@/i18n-config/metadata' +import { getPluginLanguage } from '@/i18n/metadata' import { testAPIAvailable } from '@/service/tools' import ConfigCredentials from './config-credentials' diff --git a/web/app/components/tools/mcp/detail/tool-item.tsx b/web/app/components/tools/mcp/detail/tool-item.tsx index a0659a99518..b0878587baa 100644 --- a/web/app/components/tools/mcp/detail/tool-item.tsx +++ b/web/app/components/tools/mcp/detail/tool-item.tsx @@ -5,7 +5,7 @@ import { Popover, PopoverContent, PopoverTrigger } from '@langgenius/dify-ui/pop import * as React from 'react' import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' -import { getPluginLanguage } from '@/i18n-config/metadata' +import { getPluginLanguage } from '@/i18n/metadata' type Props = Readonly<{ tool: Tool diff --git a/web/app/components/tools/provider/__tests__/custom-create-card.spec.tsx b/web/app/components/tools/provider/__tests__/custom-create-card.spec.tsx index 4928aa38b4a..e3889cf7d70 100644 --- a/web/app/components/tools/provider/__tests__/custom-create-card.spec.tsx +++ b/web/app/components/tools/provider/__tests__/custom-create-card.spec.tsx @@ -29,8 +29,8 @@ vi.mock('@/context/i18n', () => ({ })) // Mock getPluginLanguage -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), getPluginLanguage: () => 'en-US', })) diff --git a/web/app/components/tools/provider/__tests__/detail.spec.tsx b/web/app/components/tools/provider/__tests__/detail.spec.tsx index ce7e0c34d6f..a5bbc4f1576 100644 --- a/web/app/components/tools/provider/__tests__/detail.spec.tsx +++ b/web/app/components/tools/provider/__tests__/detail.spec.tsx @@ -48,8 +48,8 @@ const render = (ui: ReactElement) => { return renderWithConsoleQuery(ui, { queryClient }) } -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), getPluginLanguage: () => 'en_US', })) diff --git a/web/app/components/tools/provider/__tests__/tool-item.spec.tsx b/web/app/components/tools/provider/__tests__/tool-item.spec.tsx index 0b11a7fb5f1..459783b646f 100644 --- a/web/app/components/tools/provider/__tests__/tool-item.spec.tsx +++ b/web/app/components/tools/provider/__tests__/tool-item.spec.tsx @@ -4,8 +4,8 @@ import userEvent from '@testing-library/user-event' import { describe, expect, it, vi } from 'vite-plus/test' import ToolItem from '../tool-item' -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), getPluginLanguage: () => 'en_US', })) vi.mock( diff --git a/web/app/components/tools/provider/detail.tsx b/web/app/components/tools/provider/detail.tsx index 4dd22f1ea29..6678b7ac43e 100644 --- a/web/app/components/tools/provider/detail.tsx +++ b/web/app/components/tools/provider/detail.tsx @@ -47,7 +47,7 @@ import ConfigCredential from '@/app/components/tools/setting/build-in/config-cre import { WorkflowToolDrawer } from '@/app/components/tools/workflow-tool' import { useModalContext } from '@/context/modal-context' import { useCredentialPermissions } from '@/hooks/use-credential-permissions' -import { getPluginLanguage } from '@/i18n-config/metadata' +import { getPluginLanguage } from '@/i18n/metadata' import { consoleQuery } from '@/service/console' import { deleteWorkflowTool, diff --git a/web/app/components/tools/provider/tool-item.tsx b/web/app/components/tools/provider/tool-item.tsx index a226c1ad003..eb1bd73307b 100644 --- a/web/app/components/tools/provider/tool-item.tsx +++ b/web/app/components/tools/provider/tool-item.tsx @@ -5,7 +5,7 @@ import * as React from 'react' import { useState } from 'react' import { useLocale } from '#i18n' import SettingBuiltInTool from '@/app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool' -import { getPluginLanguage } from '@/i18n-config/metadata' +import { getPluginLanguage } from '@/i18n/metadata' type Props = Readonly<{ disabled?: boolean diff --git a/web/app/components/workflow/block-selector/featured-tools.tsx b/web/app/components/workflow/block-selector/featured-tools.tsx index 0c20b74f699..fa96c308dfe 100644 --- a/web/app/components/workflow/block-selector/featured-tools.tsx +++ b/web/app/components/workflow/block-selector/featured-tools.tsx @@ -4,7 +4,7 @@ import type { TFunction } from 'i18next' import type { ToolWithProvider } from '../types' import type { ToolDefaultValue, ToolValue } from './types' import type { Plugin } from '@/app/components/plugins/types' -import type { PluginLanguage } from '@/i18n-config/metadata' +import type { PluginLanguage } from '@/i18n/metadata' import { Button } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' import { Collapsible, CollapsiblePanel, CollapsibleTrigger } from '@langgenius/dify-ui/collapsible' diff --git a/web/app/components/workflow/block-selector/featured-triggers.tsx b/web/app/components/workflow/block-selector/featured-triggers.tsx index dd054f391bb..dde08397a54 100644 --- a/web/app/components/workflow/block-selector/featured-triggers.tsx +++ b/web/app/components/workflow/block-selector/featured-triggers.tsx @@ -4,7 +4,7 @@ import type { TFunction } from 'i18next' import type { TriggerPluginActionPreviewPayload } from './trigger-plugin/action-item' import type { TriggerDefaultValue, TriggerWithProvider } from './types' import type { Plugin } from '@/app/components/plugins/types' -import type { PluginLanguage } from '@/i18n-config/metadata' +import type { PluginLanguage } from '@/i18n/metadata' import { Button } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' import { Collapsible, CollapsiblePanel, CollapsibleTrigger } from '@langgenius/dify-ui/collapsible' diff --git a/web/app/components/workflow/nodes/agent/default.ts b/web/app/components/workflow/nodes/agent/default.ts index 6920678ef33..1e0bf856519 100644 --- a/web/app/components/workflow/nodes/agent/default.ts +++ b/web/app/components/workflow/nodes/agent/default.ts @@ -3,7 +3,7 @@ import type { NodeDefault } from '../../types' import type { AgentNodeType } from './types' import type { StrategyDetail, StrategyPluginDetail } from '@/app/components/plugins/types' import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { BlockEnum } from '../../types' import { genNodeMetaData } from '../../utils' diff --git a/web/app/components/workflow/nodes/document-extractor/__tests__/integration.spec.tsx b/web/app/components/workflow/nodes/document-extractor/__tests__/integration.spec.tsx index b3b6470ce7d..a0514acfdf0 100644 --- a/web/app/components/workflow/nodes/document-extractor/__tests__/integration.spec.tsx +++ b/web/app/components/workflow/nodes/document-extractor/__tests__/integration.spec.tsx @@ -3,7 +3,7 @@ import type { DocExtractorNodeType } from '../types' import type { PanelProps } from '@/types/workflow' import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { BlockEnum } from '../../../types' import Node from '../node' import Panel from '../panel' diff --git a/web/app/components/workflow/nodes/document-extractor/__tests__/panel.spec.tsx b/web/app/components/workflow/nodes/document-extractor/__tests__/panel.spec.tsx index 3302087d4b5..0f439ad7b88 100644 --- a/web/app/components/workflow/nodes/document-extractor/__tests__/panel.spec.tsx +++ b/web/app/components/workflow/nodes/document-extractor/__tests__/panel.spec.tsx @@ -3,7 +3,7 @@ import type { DocExtractorNodeType } from '../types' import type { PanelProps } from '@/types/workflow' import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { BlockEnum } from '../../../types' import Panel from '../panel' import useConfig from '../use-config' diff --git a/web/app/components/workflow/nodes/document-extractor/panel.tsx b/web/app/components/workflow/nodes/document-extractor/panel.tsx index ab684415e1f..fc3952703bb 100644 --- a/web/app/components/workflow/nodes/document-extractor/panel.tsx +++ b/web/app/components/workflow/nodes/document-extractor/panel.tsx @@ -6,7 +6,7 @@ import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import Field from '@/app/components/workflow/nodes/_base/components/field' import { BlockEnum } from '@/app/components/workflow/types' -import { LanguagesSupported } from '@/i18n-config/language' +import { LanguagesSupported } from '@/i18n/language' import { useFileSupportTypes } from '@/service/use-common' import OutputVars, { VarItem } from '../_base/components/output-vars' import Split from '../_base/components/split' diff --git a/web/app/components/workflow/nodes/knowledge-base/node.tsx b/web/app/components/workflow/nodes/knowledge-base/node.tsx index 504b13e4c9c..e51e73e8554 100644 --- a/web/app/components/workflow/nodes/knowledge-base/node.tsx +++ b/web/app/components/workflow/nodes/knowledge-base/node.tsx @@ -9,7 +9,7 @@ import { ModelTypeEnum } from '@/app/components/header/account-setting/model-pro import { DERIVED_MODEL_STATUS_BADGE_I18N } from '@/app/components/header/account-setting/model-provider-page/derive-model-status' import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks' import { normalizeModelProviderModelsResponse } from '@/app/components/header/account-setting/model-provider-page/utils' -import { renderI18nObject } from '@/i18n-config/metadata' +import { renderI18nObject } from '@/i18n/metadata' import { consoleQuery } from '@/service/console' import { useEmbeddingModelStatus } from './hooks/use-embedding-model-status' import { useSettingsDisplay } from './hooks/use-settings-display' diff --git a/web/app/device/_header.tsx b/web/app/device/_header.tsx index 2796f3f005f..ed40bfb6646 100644 --- a/web/app/device/_header.tsx +++ b/web/app/device/_header.tsx @@ -5,8 +5,8 @@ import Divider from '@/app/components/base/divider' import { DifyLogo } from '@/app/components/base/logo/dify-logo' import LocaleMenu from '@/app/signin/_locale-menu' import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { setLocaleOnClient } from '@/i18n-config/client' -import { languages } from '@/i18n-config/language' +import { setLocaleOnClient } from '@/i18n/client' +import { languages } from '@/i18n/language' import dynamic from '@/next/dynamic' const ThemeSelector = dynamic(() => import('@/app/components/base/theme-selector'), { diff --git a/web/app/device/utils/error-copy.ts b/web/app/device/utils/error-copy.ts index fee7a08dcfb..cc0c337c342 100644 --- a/web/app/device/utils/error-copy.ts +++ b/web/app/device/utils/error-copy.ts @@ -4,7 +4,7 @@ // this maps a server code to an i18n key, then the key to translated copy. import type { TFunction } from 'i18next' -import type deviceFlowResources from '@/i18n/en-US/device-flow.json' +import type deviceFlowResources from '@/i18n/locales/en-US/device-flow.json' import { DeviceFlowError } from '@/service/device-flow' type DeviceFlowKey = keyof typeof deviceFlowResources diff --git a/web/app/layout.tsx b/web/app/layout.tsx index 50f9e13370a..935875cc1e2 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -13,7 +13,7 @@ import { dehydrateSystemFeatures, getOptionalSystemFeatures, } from '@/features/system-features/server' -import { getLocaleOnServer } from '@/i18n-config/server' +import { getLocaleOnServer } from '@/i18n/server' import { headers } from '@/next/headers' import { getApplicationTitle } from '@/utils/document-title' import { basePath } from '@/utils/var' diff --git a/web/app/route-metadata.ts b/web/app/route-metadata.ts index c0baa53016e..d4b939e3c71 100644 --- a/web/app/route-metadata.ts +++ b/web/app/route-metadata.ts @@ -1,7 +1,7 @@ import type { SelectorParam } from 'i18next' -import type { Namespace } from '@/i18n-config/resources' +import type { Namespace } from '@/i18n/resources' import type { Metadata } from '@/next' -import { getLocaleOnServer, getTranslation } from '@/i18n-config/server' +import { getLocaleOnServer, getTranslation } from '@/i18n/server' import 'server-only' export async function getRouteMetadata( diff --git a/web/app/signin/__tests__/_header.spec.tsx b/web/app/signin/__tests__/_header.spec.tsx index 86778357cd3..e6190795048 100644 --- a/web/app/signin/__tests__/_header.spec.tsx +++ b/web/app/signin/__tests__/_header.spec.tsx @@ -1,9 +1,9 @@ import { fireEvent, screen } from '@testing-library/react' -import { setLocaleOnClient } from '@/i18n-config/client' +import { setLocaleOnClient } from '@/i18n/client' import { renderWithConsoleQuery as render } from '@/test/console/query-data' import Header from '../_header' -vi.mock('@/i18n-config/client', () => ({ +vi.mock('@/i18n/client', () => ({ setLocaleOnClient: vi.fn(), })) diff --git a/web/app/signin/_header.tsx b/web/app/signin/_header.tsx index 9e309c5c902..3b6be586226 100644 --- a/web/app/signin/_header.tsx +++ b/web/app/signin/_header.tsx @@ -4,8 +4,8 @@ import { useLocale } from '#i18n' import Divider from '@/app/components/base/divider' import { DifyLogo } from '@/app/components/base/logo/dify-logo' import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { setLocaleOnClient } from '@/i18n-config/client' -import { languages } from '@/i18n-config/language' +import { setLocaleOnClient } from '@/i18n/client' +import { languages } from '@/i18n/language' import dynamic from '@/next/dynamic' import LocaleMenu from './_locale-menu' diff --git a/web/app/signin/invite-settings/__tests__/page.spec.tsx b/web/app/signin/invite-settings/__tests__/page.spec.tsx index 52ff5a09e10..ff98926162e 100644 --- a/web/app/signin/invite-settings/__tests__/page.spec.tsx +++ b/web/app/signin/invite-settings/__tests__/page.spec.tsx @@ -47,13 +47,13 @@ vi.mock('#i18n', async (importOriginal) => ({ useLocale: vi.fn(), })) -vi.mock('@/i18n-config', () => ({ +vi.mock('@/i18n', () => ({ i18n: { defaultLocale: 'en-US', }, })) -vi.mock('@/i18n-config/client', () => ({ +vi.mock('@/i18n/client', () => ({ setLocaleOnClient: vi.fn(() => Promise.resolve()), })) diff --git a/web/app/signin/invite-settings/page.tsx b/web/app/signin/invite-settings/page.tsx index 1d891a7d8e7..bd00ead67b8 100644 --- a/web/app/signin/invite-settings/page.tsx +++ b/web/app/signin/invite-settings/page.tsx @@ -1,5 +1,5 @@ 'use client' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import { Button, buttonVariants } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' import { Field, FieldError, FieldLabel } from '@langgenius/dify-ui/field' @@ -23,9 +23,9 @@ import { LICENSE_LINK } from '@/constants/link' import { isLegacyBase401, userProfileQueryOptions } from '@/features/account-profile/client' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import useDocumentTitle from '@/hooks/use-document-title' -import { i18n } from '@/i18n-config' -import { setLocaleOnClient } from '@/i18n-config/client' -import { languages } from '@/i18n-config/language' +import { i18n } from '@/i18n' +import { setLocaleOnClient } from '@/i18n/client' +import { languages } from '@/i18n/language' import Link from '@/next/link' import { useRouter, useSearchParams } from '@/next/navigation' import { activateMember } from '@/service/common' diff --git a/web/app/signin/one-more-step.tsx b/web/app/signin/one-more-step.tsx index 2e885e486ea..3a553c6037b 100644 --- a/web/app/signin/one-more-step.tsx +++ b/web/app/signin/one-more-step.tsx @@ -20,7 +20,7 @@ import { useReducer } from 'react' import { useTranslation } from 'react-i18next' import { resolvePostLoginRedirect } from '@/app/signin/utils/post-login-redirect' import { LICENSE_LINK } from '@/constants/link' -import { languages } from '@/i18n-config/language' +import { languages } from '@/i18n/language' import Link from '@/next/link' import { useRouter, useSearchParams } from '@/next/navigation' import { consoleQuery } from '@/service/console' diff --git a/web/context/i18n.spec.ts b/web/context/i18n.spec.ts index ed8b1b1351d..bbcf0b47c70 100644 --- a/web/context/i18n.spec.ts +++ b/web/context/i18n.spec.ts @@ -2,7 +2,7 @@ import type { DocPathMap } from './i18n' import type { DocPathWithoutLang } from '@/types/doc-paths' import { renderHook } from '@testing-library/react' import { useLocale } from '#i18n' -import { getDocLanguage } from '@/i18n-config/language' +import { getDocLanguage } from '@/i18n/language' import { defaultDocBaseUrl, enterpriseDocBaseUrl, useDocLink } from './i18n' const mockDeploymentEdition = vi.hoisted(() => ({ @@ -19,7 +19,7 @@ vi.mock('jotai', async (importOriginal) => ({ useAtomValue: () => mockDeploymentEdition.value, })) -vi.mock('@/i18n-config/language', () => ({ +vi.mock('@/i18n/language', () => ({ getDocLanguage: vi.fn((locale: string) => { const map: Record = { 'zh-Hans': 'zh', @@ -30,8 +30,8 @@ vi.mock('@/i18n-config/language', () => ({ }), })) -vi.mock('@/i18n-config/metadata', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@/i18n/metadata', async (importOriginal) => ({ + ...(await importOriginal()), getPluginLanguage: vi.fn(), })) diff --git a/web/context/i18n.ts b/web/context/i18n.ts index 376731b8558..9f4ee1d1630 100644 --- a/web/context/i18n.ts +++ b/web/context/i18n.ts @@ -1,12 +1,12 @@ import type { DeploymentEdition } from '@dify/contracts/api/console/system-features/types.gen' -import type { Locale } from '@/i18n-config/locale' +import type { Locale } from '@/i18n/locale' import type { DocLanguage, DocPathWithoutLang, DocsProduct } from '@/types/doc-paths' import { useAtomValue } from 'jotai' import { useCallback } from 'react' import { useLocale } from '#i18n' import { deploymentEditionAtom } from '@/features/system-features/state' -import { getDocLanguage } from '@/i18n-config/language' -import { getPluginLanguage } from '@/i18n-config/metadata' +import { getDocLanguage } from '@/i18n/language' +import { getPluginLanguage } from '@/i18n/metadata' import { docPathProductAvailability, isProductlessDocPath } from '@/types/doc-paths' export const useGetLanguage = () => { diff --git a/web/features/agent-v2/agent-detail/access-config/page.tsx b/web/features/agent-v2/agent-detail/access-config/page.tsx index 89864e98863..2a4275f3feb 100644 --- a/web/features/agent-v2/agent-detail/access-config/page.tsx +++ b/web/features/agent-v2/agent-detail/access-config/page.tsx @@ -8,7 +8,7 @@ import { useTranslation } from 'react-i18next' import { useLocale } from '#i18n' import AccessRulesEditor from '@/app/components/access-rules-editor' import { useAgentPermissions } from '@/features/agent-v2/permissions' -import { getAccessControlTemplateLanguage } from '@/i18n-config/language' +import { getAccessControlTemplateLanguage } from '@/i18n/language' import { RESOURCE_ACCESS_SETTINGS_PAGE_SIZE } from '@/service/access-control/constants' import { consoleQuery } from '@/service/console' diff --git a/web/features/agent-v2/roster/components/__tests__/delete-agent-dialog.spec.tsx b/web/features/agent-v2/roster/components/__tests__/delete-agent-dialog.spec.tsx index 7ed8e40a8b9..07a46921c97 100644 --- a/web/features/agent-v2/roster/components/__tests__/delete-agent-dialog.spec.tsx +++ b/web/features/agent-v2/roster/components/__tests__/delete-agent-dialog.spec.tsx @@ -24,7 +24,7 @@ vi.mock('@/service/console', () => ({ vi.mock('react-i18next', async () => { const { createReactI18nextMock } = await import('@/test/i18n-mock') - const { default: agentV2 } = await import('@/i18n/en-US/agent-v-2.json') + const { default: agentV2 } = await import('@/i18n/locales/en-US/agent-v-2.json') return createReactI18nextMock({ 'roster.deleteDialog.description': agentV2['roster.deleteDialog.description'], 'roster.deleteDialog.title': agentV2['roster.deleteDialog.title'], diff --git a/web/features/home/page.tsx b/web/features/home/page.tsx index 31b6fb8ac0a..5e734844b20 100644 --- a/web/features/home/page.tsx +++ b/web/features/home/page.tsx @@ -2,7 +2,7 @@ import { dehydrate, HydrationBoundary, noop } from '@tanstack/react-query' import { Suspense } from 'react' import { getQueryClient } from '@/app/get-query-client' import { getOptionalSystemFeatures } from '@/features/system-features/server' -import { getLocaleOnServer } from '@/i18n-config/server' +import { getLocaleOnServer } from '@/i18n/server' import { consoleQuery } from '@/service/console' import { HomeContent } from './home-content/home-content' import { HomeShell } from './home-shell' diff --git a/web/features/new-rag/__tests__/crawl-selection-form.spec.tsx b/web/features/new-rag/__tests__/crawl-selection-form.spec.tsx index b6da837d90c..7b2f412be40 100644 --- a/web/features/new-rag/__tests__/crawl-selection-form.spec.tsx +++ b/web/features/new-rag/__tests__/crawl-selection-form.spec.tsx @@ -8,8 +8,8 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { act, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { createInstance } from 'i18next' -import { getInitOptions } from '@/i18n-config/settings' -import datasetTranslations from '@/i18n/en-US/dataset.json' +import datasetTranslations from '@/i18n/locales/en-US/dataset.json' +import { getInitOptions } from '@/i18n/settings' import { render } from '@/test/console/render' import { CrawlSelectionForm } from '../crawl-selection-form' diff --git a/web/features/new-rag/__tests__/sources-page.spec.tsx b/web/features/new-rag/__tests__/sources-page.spec.tsx index 494a8fbc5df..cd31c3a7d0f 100644 --- a/web/features/new-rag/__tests__/sources-page.spec.tsx +++ b/web/features/new-rag/__tests__/sources-page.spec.tsx @@ -1,7 +1,7 @@ import type { Source } from '@dify/contracts/knowledge-fs/types.gen' import { screen, waitFor, within } from '@testing-library/react' import userEvent from '@testing-library/user-event' -import datasetTranslations from '@/i18n/en-US/dataset.json' +import datasetTranslations from '@/i18n/locales/en-US/dataset.json' import { render } from '@/test/console/render' import { SourcesPage } from '../sources-page' diff --git a/web/hooks/use-format-time-from-now.ts b/web/hooks/use-format-time-from-now.ts index e08418fd32d..a245758eb10 100644 --- a/web/hooks/use-format-time-from-now.ts +++ b/web/hooks/use-format-time-from-now.ts @@ -2,7 +2,7 @@ import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' import { useCallback } from 'react' import { useLocale } from '#i18n' -import { localeMap } from '@/i18n-config/language' +import { localeMap } from '@/i18n/language' import 'dayjs/locale/az' import 'dayjs/locale/de' import 'dayjs/locale/es' diff --git a/web/hooks/use-i18n.ts b/web/hooks/use-i18n.ts index 85fc7682f83..326750562ef 100644 --- a/web/hooks/use-i18n.ts +++ b/web/hooks/use-i18n.ts @@ -1,5 +1,5 @@ import { useLocale } from '#i18n' -import { getModelLanguage, renderI18nObject } from '@/i18n-config/metadata' +import { getModelLanguage, renderI18nObject } from '@/i18n/metadata' export const useRenderI18nObject = () => { const language = getModelLanguage(useLocale()) diff --git a/web/i18n-config/README.md b/web/i18n/README.md similarity index 80% rename from web/i18n-config/README.md rename to web/i18n/README.md index af063bca2b3..632a41e9e7d 100644 --- a/web/i18n-config/README.md +++ b/web/i18n/README.md @@ -1,6 +1,8 @@ # Internationalization -English JSON files under `web/i18n/en-US/` are the source locale. Other locale directories must keep the same flat keys and placeholders. i18next uses `keySeparator: false`, so dots are part of a key rather than nested-object separators. +English JSON files under `web/i18n/locales/en-US/` are the source locale. Other locale directories must keep the same flat keys and placeholders. i18next uses `keySeparator: false`, so dots are part of a key rather than nested-object separators. + +The module keeps runtime code and bundled translation assets together. `#i18n` remains the conditional client/server entrypoint; `locales/` contains translation JSON only. Per-locale loaders preserve the existing dynamic-import boundaries. This layout is a project ownership convention, not an i18next requirement. ## Owners @@ -21,7 +23,7 @@ Do not copy the language registry into documentation. Read the current source fi ## Add a locale 1. Add the locale metadata to `languages.ts`. -2. Add a matching `web/i18n//` directory with every source namespace. +2. Add a matching `web/i18n/locales//` directory with every source namespace. 3. Add `locale-resources/.ts` and the required mappings in `language.ts`. 4. Keep the backend language and timezone registry in `api/constants/languages.py` aligned when the locale is accepted by backend APIs. 5. Run the complete i18n check before submitting the change. @@ -70,6 +72,6 @@ not load Vite plugins. ## Automated translation -Changes to `web/i18n/en-US/*.json` on `main` trigger the scoped translation workflow. The workflow derives target locales from `languages.ts`, translates only the changed namespaces and keys, verifies them with `i18n:check`, and opens a pull request when translations change. +Changes to `web/i18n/locales/en-US/*.json` on `main` trigger the scoped translation workflow. The workflow derives target locales from `languages.ts`, translates only the changed namespaces and keys, verifies them with `i18n:check`, and opens a pull request when translations change. Use the `Translate i18n Files with Claude Code` workflow dispatch for a manual scoped sync. Full mode requires an explicit file list. diff --git a/web/i18n-config/__tests__/client-locale.spec.ts b/web/i18n/__tests__/client-locale.spec.ts similarity index 100% rename from web/i18n-config/__tests__/client-locale.spec.ts rename to web/i18n/__tests__/client-locale.spec.ts diff --git a/web/i18n-config/__tests__/load-resource.spec.ts b/web/i18n/__tests__/load-resource.spec.ts similarity index 100% rename from web/i18n-config/__tests__/load-resource.spec.ts rename to web/i18n/__tests__/load-resource.spec.ts diff --git a/web/i18n-config/__tests__/metadata.spec.ts b/web/i18n/__tests__/metadata.spec.ts similarity index 100% rename from web/i18n-config/__tests__/metadata.spec.ts rename to web/i18n/__tests__/metadata.spec.ts diff --git a/web/i18n-config/__tests__/plural-selector.spec.ts b/web/i18n/__tests__/plural-selector.spec.ts similarity index 97% rename from web/i18n-config/__tests__/plural-selector.spec.ts rename to web/i18n/__tests__/plural-selector.spec.ts index 313e9e4db62..170e89bc2b2 100644 --- a/web/i18n-config/__tests__/plural-selector.spec.ts +++ b/web/i18n/__tests__/plural-selector.spec.ts @@ -1,7 +1,7 @@ import type { SelectorParam } from 'i18next' import { createInstance } from 'i18next' import { describe, expect, it } from 'vite-plus/test' -import skill from '../../i18n/en-US/skill.json' +import skill from '../locales/en-US/skill.json' import { getInitOptions } from '../settings' describe('i18n selector configuration', () => { diff --git a/web/i18n-config/__tests__/server.spec.ts b/web/i18n/__tests__/server.spec.ts similarity index 100% rename from web/i18n-config/__tests__/server.spec.ts rename to web/i18n/__tests__/server.spec.ts diff --git a/web/i18n-config/client.ts b/web/i18n/client.ts similarity index 100% rename from web/i18n-config/client.ts rename to web/i18n/client.ts diff --git a/web/i18n-config/index.ts b/web/i18n/index.ts similarity index 100% rename from web/i18n-config/index.ts rename to web/i18n/index.ts diff --git a/web/i18n-config/language.ts b/web/i18n/language.ts similarity index 100% rename from web/i18n-config/language.ts rename to web/i18n/language.ts diff --git a/web/i18n-config/languages.ts b/web/i18n/languages.ts similarity index 100% rename from web/i18n-config/languages.ts rename to web/i18n/languages.ts diff --git a/web/i18n-config/lib.client.ts b/web/i18n/lib.client.ts similarity index 100% rename from web/i18n-config/lib.client.ts rename to web/i18n/lib.client.ts diff --git a/web/i18n-config/lib.server.ts b/web/i18n/lib.server.ts similarity index 100% rename from web/i18n-config/lib.server.ts rename to web/i18n/lib.server.ts diff --git a/web/i18n-config/load-resource.ts b/web/i18n/load-resource.ts similarity index 100% rename from web/i18n-config/load-resource.ts rename to web/i18n/load-resource.ts diff --git a/web/i18n-config/locale-resources/ar-TN.ts b/web/i18n/locale-resources/ar-TN.ts similarity index 51% rename from web/i18n-config/locale-resources/ar-TN.ts rename to web/i18n/locale-resources/ar-TN.ts index 0233334f0c4..67115a32d26 100644 --- a/web/i18n-config/locale-resources/ar-TN.ts +++ b/web/i18n/locale-resources/ar-TN.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/ar-TN/${fileNamespace}.json`) + import(`../locales/ar-TN/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/az-AZ.ts b/web/i18n/locale-resources/az-AZ.ts similarity index 51% rename from web/i18n-config/locale-resources/az-AZ.ts rename to web/i18n/locale-resources/az-AZ.ts index 6a515f06370..3db1baeb3d2 100644 --- a/web/i18n-config/locale-resources/az-AZ.ts +++ b/web/i18n/locale-resources/az-AZ.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/az-AZ/${fileNamespace}.json`) + import(`../locales/az-AZ/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/de-DE.ts b/web/i18n/locale-resources/de-DE.ts similarity index 51% rename from web/i18n-config/locale-resources/de-DE.ts rename to web/i18n/locale-resources/de-DE.ts index d518616ea12..a16f3a628ff 100644 --- a/web/i18n-config/locale-resources/de-DE.ts +++ b/web/i18n/locale-resources/de-DE.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/de-DE/${fileNamespace}.json`) + import(`../locales/de-DE/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/en-US.ts b/web/i18n/locale-resources/en-US.ts similarity index 51% rename from web/i18n-config/locale-resources/en-US.ts rename to web/i18n/locale-resources/en-US.ts index f7d33c53c6d..4dc709e11df 100644 --- a/web/i18n-config/locale-resources/en-US.ts +++ b/web/i18n/locale-resources/en-US.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/en-US/${fileNamespace}.json`) + import(`../locales/en-US/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/es-ES.ts b/web/i18n/locale-resources/es-ES.ts similarity index 51% rename from web/i18n-config/locale-resources/es-ES.ts rename to web/i18n/locale-resources/es-ES.ts index ad7d256275a..7a84ef6fef1 100644 --- a/web/i18n-config/locale-resources/es-ES.ts +++ b/web/i18n/locale-resources/es-ES.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/es-ES/${fileNamespace}.json`) + import(`../locales/es-ES/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/fa-IR.ts b/web/i18n/locale-resources/fa-IR.ts similarity index 51% rename from web/i18n-config/locale-resources/fa-IR.ts rename to web/i18n/locale-resources/fa-IR.ts index d95c6e62ca3..f4bfa9a858b 100644 --- a/web/i18n-config/locale-resources/fa-IR.ts +++ b/web/i18n/locale-resources/fa-IR.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/fa-IR/${fileNamespace}.json`) + import(`../locales/fa-IR/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/fr-FR.ts b/web/i18n/locale-resources/fr-FR.ts similarity index 51% rename from web/i18n-config/locale-resources/fr-FR.ts rename to web/i18n/locale-resources/fr-FR.ts index e82371bb143..7da11806152 100644 --- a/web/i18n-config/locale-resources/fr-FR.ts +++ b/web/i18n/locale-resources/fr-FR.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/fr-FR/${fileNamespace}.json`) + import(`../locales/fr-FR/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/hi-IN.ts b/web/i18n/locale-resources/hi-IN.ts similarity index 51% rename from web/i18n-config/locale-resources/hi-IN.ts rename to web/i18n/locale-resources/hi-IN.ts index c81c8c62eb7..65aa799773d 100644 --- a/web/i18n-config/locale-resources/hi-IN.ts +++ b/web/i18n/locale-resources/hi-IN.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/hi-IN/${fileNamespace}.json`) + import(`../locales/hi-IN/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/id-ID.ts b/web/i18n/locale-resources/id-ID.ts similarity index 51% rename from web/i18n-config/locale-resources/id-ID.ts rename to web/i18n/locale-resources/id-ID.ts index 1b8629e15f2..3fee5bdf5d2 100644 --- a/web/i18n-config/locale-resources/id-ID.ts +++ b/web/i18n/locale-resources/id-ID.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/id-ID/${fileNamespace}.json`) + import(`../locales/id-ID/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/it-IT.ts b/web/i18n/locale-resources/it-IT.ts similarity index 51% rename from web/i18n-config/locale-resources/it-IT.ts rename to web/i18n/locale-resources/it-IT.ts index 0920e7b4d20..61edaaa4b9a 100644 --- a/web/i18n-config/locale-resources/it-IT.ts +++ b/web/i18n/locale-resources/it-IT.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/it-IT/${fileNamespace}.json`) + import(`../locales/it-IT/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/ja-JP.ts b/web/i18n/locale-resources/ja-JP.ts similarity index 51% rename from web/i18n-config/locale-resources/ja-JP.ts rename to web/i18n/locale-resources/ja-JP.ts index 50732b3c6e3..eb14b53b55b 100644 --- a/web/i18n-config/locale-resources/ja-JP.ts +++ b/web/i18n/locale-resources/ja-JP.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/ja-JP/${fileNamespace}.json`) + import(`../locales/ja-JP/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/ko-KR.ts b/web/i18n/locale-resources/ko-KR.ts similarity index 51% rename from web/i18n-config/locale-resources/ko-KR.ts rename to web/i18n/locale-resources/ko-KR.ts index 60234fbd033..7a56e3326ef 100644 --- a/web/i18n-config/locale-resources/ko-KR.ts +++ b/web/i18n/locale-resources/ko-KR.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/ko-KR/${fileNamespace}.json`) + import(`../locales/ko-KR/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/lo-LA.ts b/web/i18n/locale-resources/lo-LA.ts similarity index 51% rename from web/i18n-config/locale-resources/lo-LA.ts rename to web/i18n/locale-resources/lo-LA.ts index b835990c5ee..c58cd9a1fc3 100644 --- a/web/i18n-config/locale-resources/lo-LA.ts +++ b/web/i18n/locale-resources/lo-LA.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/lo-LA/${fileNamespace}.json`) + import(`../locales/lo-LA/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/nl-NL.ts b/web/i18n/locale-resources/nl-NL.ts similarity index 51% rename from web/i18n-config/locale-resources/nl-NL.ts rename to web/i18n/locale-resources/nl-NL.ts index 56dda25160e..b10f825e1fe 100644 --- a/web/i18n-config/locale-resources/nl-NL.ts +++ b/web/i18n/locale-resources/nl-NL.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/nl-NL/${fileNamespace}.json`) + import(`../locales/nl-NL/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/pl-PL.ts b/web/i18n/locale-resources/pl-PL.ts similarity index 51% rename from web/i18n-config/locale-resources/pl-PL.ts rename to web/i18n/locale-resources/pl-PL.ts index e0782421886..2f0fd3908d5 100644 --- a/web/i18n-config/locale-resources/pl-PL.ts +++ b/web/i18n/locale-resources/pl-PL.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/pl-PL/${fileNamespace}.json`) + import(`../locales/pl-PL/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/pt-BR.ts b/web/i18n/locale-resources/pt-BR.ts similarity index 51% rename from web/i18n-config/locale-resources/pt-BR.ts rename to web/i18n/locale-resources/pt-BR.ts index d77363b7c67..7aa6f3723f4 100644 --- a/web/i18n-config/locale-resources/pt-BR.ts +++ b/web/i18n/locale-resources/pt-BR.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/pt-BR/${fileNamespace}.json`) + import(`../locales/pt-BR/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/ro-RO.ts b/web/i18n/locale-resources/ro-RO.ts similarity index 51% rename from web/i18n-config/locale-resources/ro-RO.ts rename to web/i18n/locale-resources/ro-RO.ts index db065496d0b..7188eb82896 100644 --- a/web/i18n-config/locale-resources/ro-RO.ts +++ b/web/i18n/locale-resources/ro-RO.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/ro-RO/${fileNamespace}.json`) + import(`../locales/ro-RO/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/ru-RU.ts b/web/i18n/locale-resources/ru-RU.ts similarity index 51% rename from web/i18n-config/locale-resources/ru-RU.ts rename to web/i18n/locale-resources/ru-RU.ts index f5034f141ba..6652e96e8e1 100644 --- a/web/i18n-config/locale-resources/ru-RU.ts +++ b/web/i18n/locale-resources/ru-RU.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/ru-RU/${fileNamespace}.json`) + import(`../locales/ru-RU/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/sl-SI.ts b/web/i18n/locale-resources/sl-SI.ts similarity index 51% rename from web/i18n-config/locale-resources/sl-SI.ts rename to web/i18n/locale-resources/sl-SI.ts index aa4e530b180..a8f138321d9 100644 --- a/web/i18n-config/locale-resources/sl-SI.ts +++ b/web/i18n/locale-resources/sl-SI.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/sl-SI/${fileNamespace}.json`) + import(`../locales/sl-SI/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/th-TH.ts b/web/i18n/locale-resources/th-TH.ts similarity index 51% rename from web/i18n-config/locale-resources/th-TH.ts rename to web/i18n/locale-resources/th-TH.ts index a7f3e322447..91b694ca0f1 100644 --- a/web/i18n-config/locale-resources/th-TH.ts +++ b/web/i18n/locale-resources/th-TH.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/th-TH/${fileNamespace}.json`) + import(`../locales/th-TH/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/tr-TR.ts b/web/i18n/locale-resources/tr-TR.ts similarity index 51% rename from web/i18n-config/locale-resources/tr-TR.ts rename to web/i18n/locale-resources/tr-TR.ts index e4efa9b5a83..18b0314b507 100644 --- a/web/i18n-config/locale-resources/tr-TR.ts +++ b/web/i18n/locale-resources/tr-TR.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/tr-TR/${fileNamespace}.json`) + import(`../locales/tr-TR/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/uk-UA.ts b/web/i18n/locale-resources/uk-UA.ts similarity index 51% rename from web/i18n-config/locale-resources/uk-UA.ts rename to web/i18n/locale-resources/uk-UA.ts index 245696237c4..64b8eba9a9b 100644 --- a/web/i18n-config/locale-resources/uk-UA.ts +++ b/web/i18n/locale-resources/uk-UA.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/uk-UA/${fileNamespace}.json`) + import(`../locales/uk-UA/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/vi-VN.ts b/web/i18n/locale-resources/vi-VN.ts similarity index 51% rename from web/i18n-config/locale-resources/vi-VN.ts rename to web/i18n/locale-resources/vi-VN.ts index dfde38233f8..09fd9637747 100644 --- a/web/i18n-config/locale-resources/vi-VN.ts +++ b/web/i18n/locale-resources/vi-VN.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/vi-VN/${fileNamespace}.json`) + import(`../locales/vi-VN/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/zh-Hans.ts b/web/i18n/locale-resources/zh-Hans.ts similarity index 50% rename from web/i18n-config/locale-resources/zh-Hans.ts rename to web/i18n/locale-resources/zh-Hans.ts index 3fecc27d70a..2404b82dabe 100644 --- a/web/i18n-config/locale-resources/zh-Hans.ts +++ b/web/i18n/locale-resources/zh-Hans.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/zh-Hans/${fileNamespace}.json`) + import(`../locales/zh-Hans/${fileNamespace}.json`) diff --git a/web/i18n-config/locale-resources/zh-Hant.ts b/web/i18n/locale-resources/zh-Hant.ts similarity index 50% rename from web/i18n-config/locale-resources/zh-Hant.ts rename to web/i18n/locale-resources/zh-Hant.ts index 30cd2cb64e1..8608870f8f1 100644 --- a/web/i18n-config/locale-resources/zh-Hant.ts +++ b/web/i18n/locale-resources/zh-Hant.ts @@ -1,2 +1,2 @@ export const loadResource = (fileNamespace: string) => - import(`../../i18n/zh-Hant/${fileNamespace}.json`) + import(`../locales/zh-Hant/${fileNamespace}.json`) diff --git a/web/i18n-config/locale.ts b/web/i18n/locale.ts similarity index 100% rename from web/i18n-config/locale.ts rename to web/i18n/locale.ts diff --git a/web/i18n/ar-TN/agent-v-2.json b/web/i18n/locales/ar-TN/agent-v-2.json similarity index 100% rename from web/i18n/ar-TN/agent-v-2.json rename to web/i18n/locales/ar-TN/agent-v-2.json diff --git a/web/i18n/ar-TN/app-annotation.json b/web/i18n/locales/ar-TN/app-annotation.json similarity index 100% rename from web/i18n/ar-TN/app-annotation.json rename to web/i18n/locales/ar-TN/app-annotation.json diff --git a/web/i18n/ar-TN/app-api.json b/web/i18n/locales/ar-TN/app-api.json similarity index 100% rename from web/i18n/ar-TN/app-api.json rename to web/i18n/locales/ar-TN/app-api.json diff --git a/web/i18n/ar-TN/app-debug.json b/web/i18n/locales/ar-TN/app-debug.json similarity index 100% rename from web/i18n/ar-TN/app-debug.json rename to web/i18n/locales/ar-TN/app-debug.json diff --git a/web/i18n/ar-TN/app-log.json b/web/i18n/locales/ar-TN/app-log.json similarity index 100% rename from web/i18n/ar-TN/app-log.json rename to web/i18n/locales/ar-TN/app-log.json diff --git a/web/i18n/ar-TN/app-overview.json b/web/i18n/locales/ar-TN/app-overview.json similarity index 100% rename from web/i18n/ar-TN/app-overview.json rename to web/i18n/locales/ar-TN/app-overview.json diff --git a/web/i18n/ar-TN/app.json b/web/i18n/locales/ar-TN/app.json similarity index 100% rename from web/i18n/ar-TN/app.json rename to web/i18n/locales/ar-TN/app.json diff --git a/web/i18n/ar-TN/billing.json b/web/i18n/locales/ar-TN/billing.json similarity index 100% rename from web/i18n/ar-TN/billing.json rename to web/i18n/locales/ar-TN/billing.json diff --git a/web/i18n/ar-TN/common.json b/web/i18n/locales/ar-TN/common.json similarity index 100% rename from web/i18n/ar-TN/common.json rename to web/i18n/locales/ar-TN/common.json diff --git a/web/i18n/ar-TN/custom.json b/web/i18n/locales/ar-TN/custom.json similarity index 100% rename from web/i18n/ar-TN/custom.json rename to web/i18n/locales/ar-TN/custom.json diff --git a/web/i18n/ar-TN/dataset-creation.json b/web/i18n/locales/ar-TN/dataset-creation.json similarity index 100% rename from web/i18n/ar-TN/dataset-creation.json rename to web/i18n/locales/ar-TN/dataset-creation.json diff --git a/web/i18n/ar-TN/dataset-documents.json b/web/i18n/locales/ar-TN/dataset-documents.json similarity index 100% rename from web/i18n/ar-TN/dataset-documents.json rename to web/i18n/locales/ar-TN/dataset-documents.json diff --git a/web/i18n/ar-TN/dataset-hit-testing.json b/web/i18n/locales/ar-TN/dataset-hit-testing.json similarity index 100% rename from web/i18n/ar-TN/dataset-hit-testing.json rename to web/i18n/locales/ar-TN/dataset-hit-testing.json diff --git a/web/i18n/ar-TN/dataset-pipeline.json b/web/i18n/locales/ar-TN/dataset-pipeline.json similarity index 100% rename from web/i18n/ar-TN/dataset-pipeline.json rename to web/i18n/locales/ar-TN/dataset-pipeline.json diff --git a/web/i18n/ar-TN/dataset-settings.json b/web/i18n/locales/ar-TN/dataset-settings.json similarity index 100% rename from web/i18n/ar-TN/dataset-settings.json rename to web/i18n/locales/ar-TN/dataset-settings.json diff --git a/web/i18n/ar-TN/dataset.json b/web/i18n/locales/ar-TN/dataset.json similarity index 100% rename from web/i18n/ar-TN/dataset.json rename to web/i18n/locales/ar-TN/dataset.json diff --git a/web/i18n/ar-TN/deployments.json b/web/i18n/locales/ar-TN/deployments.json similarity index 100% rename from web/i18n/ar-TN/deployments.json rename to web/i18n/locales/ar-TN/deployments.json diff --git a/web/i18n/ar-TN/device-flow.json b/web/i18n/locales/ar-TN/device-flow.json similarity index 100% rename from web/i18n/ar-TN/device-flow.json rename to web/i18n/locales/ar-TN/device-flow.json diff --git a/web/i18n/ar-TN/education.json b/web/i18n/locales/ar-TN/education.json similarity index 100% rename from web/i18n/ar-TN/education.json rename to web/i18n/locales/ar-TN/education.json diff --git a/web/i18n/ar-TN/explore.json b/web/i18n/locales/ar-TN/explore.json similarity index 100% rename from web/i18n/ar-TN/explore.json rename to web/i18n/locales/ar-TN/explore.json diff --git a/web/i18n/ar-TN/layout.json b/web/i18n/locales/ar-TN/layout.json similarity index 100% rename from web/i18n/ar-TN/layout.json rename to web/i18n/locales/ar-TN/layout.json diff --git a/web/i18n/ar-TN/login.json b/web/i18n/locales/ar-TN/login.json similarity index 100% rename from web/i18n/ar-TN/login.json rename to web/i18n/locales/ar-TN/login.json diff --git a/web/i18n/ar-TN/oauth.json b/web/i18n/locales/ar-TN/oauth.json similarity index 100% rename from web/i18n/ar-TN/oauth.json rename to web/i18n/locales/ar-TN/oauth.json diff --git a/web/i18n/ar-TN/permission-keys.json b/web/i18n/locales/ar-TN/permission-keys.json similarity index 100% rename from web/i18n/ar-TN/permission-keys.json rename to web/i18n/locales/ar-TN/permission-keys.json diff --git a/web/i18n/ar-TN/permission.json b/web/i18n/locales/ar-TN/permission.json similarity index 100% rename from web/i18n/ar-TN/permission.json rename to web/i18n/locales/ar-TN/permission.json diff --git a/web/i18n/ar-TN/pipeline.json b/web/i18n/locales/ar-TN/pipeline.json similarity index 100% rename from web/i18n/ar-TN/pipeline.json rename to web/i18n/locales/ar-TN/pipeline.json diff --git a/web/i18n/ar-TN/plugin-tags.json b/web/i18n/locales/ar-TN/plugin-tags.json similarity index 100% rename from web/i18n/ar-TN/plugin-tags.json rename to web/i18n/locales/ar-TN/plugin-tags.json diff --git a/web/i18n/ar-TN/plugin-trigger.json b/web/i18n/locales/ar-TN/plugin-trigger.json similarity index 100% rename from web/i18n/ar-TN/plugin-trigger.json rename to web/i18n/locales/ar-TN/plugin-trigger.json diff --git a/web/i18n/ar-TN/plugin.json b/web/i18n/locales/ar-TN/plugin.json similarity index 100% rename from web/i18n/ar-TN/plugin.json rename to web/i18n/locales/ar-TN/plugin.json diff --git a/web/i18n/ar-TN/register.json b/web/i18n/locales/ar-TN/register.json similarity index 100% rename from web/i18n/ar-TN/register.json rename to web/i18n/locales/ar-TN/register.json diff --git a/web/i18n/ar-TN/run-log.json b/web/i18n/locales/ar-TN/run-log.json similarity index 100% rename from web/i18n/ar-TN/run-log.json rename to web/i18n/locales/ar-TN/run-log.json diff --git a/web/i18n/ar-TN/share.json b/web/i18n/locales/ar-TN/share.json similarity index 100% rename from web/i18n/ar-TN/share.json rename to web/i18n/locales/ar-TN/share.json diff --git a/web/i18n/ar-TN/skill.json b/web/i18n/locales/ar-TN/skill.json similarity index 100% rename from web/i18n/ar-TN/skill.json rename to web/i18n/locales/ar-TN/skill.json diff --git a/web/i18n/ar-TN/snippet.json b/web/i18n/locales/ar-TN/snippet.json similarity index 100% rename from web/i18n/ar-TN/snippet.json rename to web/i18n/locales/ar-TN/snippet.json diff --git a/web/i18n/ar-TN/time.json b/web/i18n/locales/ar-TN/time.json similarity index 100% rename from web/i18n/ar-TN/time.json rename to web/i18n/locales/ar-TN/time.json diff --git a/web/i18n/ar-TN/tools.json b/web/i18n/locales/ar-TN/tools.json similarity index 100% rename from web/i18n/ar-TN/tools.json rename to web/i18n/locales/ar-TN/tools.json diff --git a/web/i18n/ar-TN/workflow.json b/web/i18n/locales/ar-TN/workflow.json similarity index 100% rename from web/i18n/ar-TN/workflow.json rename to web/i18n/locales/ar-TN/workflow.json diff --git a/web/i18n/az-AZ/agent-v-2.json b/web/i18n/locales/az-AZ/agent-v-2.json similarity index 100% rename from web/i18n/az-AZ/agent-v-2.json rename to web/i18n/locales/az-AZ/agent-v-2.json diff --git a/web/i18n/az-AZ/app-annotation.json b/web/i18n/locales/az-AZ/app-annotation.json similarity index 100% rename from web/i18n/az-AZ/app-annotation.json rename to web/i18n/locales/az-AZ/app-annotation.json diff --git a/web/i18n/az-AZ/app-api.json b/web/i18n/locales/az-AZ/app-api.json similarity index 100% rename from web/i18n/az-AZ/app-api.json rename to web/i18n/locales/az-AZ/app-api.json diff --git a/web/i18n/az-AZ/app-debug.json b/web/i18n/locales/az-AZ/app-debug.json similarity index 100% rename from web/i18n/az-AZ/app-debug.json rename to web/i18n/locales/az-AZ/app-debug.json diff --git a/web/i18n/az-AZ/app-log.json b/web/i18n/locales/az-AZ/app-log.json similarity index 100% rename from web/i18n/az-AZ/app-log.json rename to web/i18n/locales/az-AZ/app-log.json diff --git a/web/i18n/az-AZ/app-overview.json b/web/i18n/locales/az-AZ/app-overview.json similarity index 100% rename from web/i18n/az-AZ/app-overview.json rename to web/i18n/locales/az-AZ/app-overview.json diff --git a/web/i18n/az-AZ/app.json b/web/i18n/locales/az-AZ/app.json similarity index 100% rename from web/i18n/az-AZ/app.json rename to web/i18n/locales/az-AZ/app.json diff --git a/web/i18n/az-AZ/billing.json b/web/i18n/locales/az-AZ/billing.json similarity index 100% rename from web/i18n/az-AZ/billing.json rename to web/i18n/locales/az-AZ/billing.json diff --git a/web/i18n/az-AZ/common.json b/web/i18n/locales/az-AZ/common.json similarity index 100% rename from web/i18n/az-AZ/common.json rename to web/i18n/locales/az-AZ/common.json diff --git a/web/i18n/az-AZ/custom.json b/web/i18n/locales/az-AZ/custom.json similarity index 100% rename from web/i18n/az-AZ/custom.json rename to web/i18n/locales/az-AZ/custom.json diff --git a/web/i18n/az-AZ/dataset-creation.json b/web/i18n/locales/az-AZ/dataset-creation.json similarity index 100% rename from web/i18n/az-AZ/dataset-creation.json rename to web/i18n/locales/az-AZ/dataset-creation.json diff --git a/web/i18n/az-AZ/dataset-documents.json b/web/i18n/locales/az-AZ/dataset-documents.json similarity index 100% rename from web/i18n/az-AZ/dataset-documents.json rename to web/i18n/locales/az-AZ/dataset-documents.json diff --git a/web/i18n/az-AZ/dataset-hit-testing.json b/web/i18n/locales/az-AZ/dataset-hit-testing.json similarity index 100% rename from web/i18n/az-AZ/dataset-hit-testing.json rename to web/i18n/locales/az-AZ/dataset-hit-testing.json diff --git a/web/i18n/az-AZ/dataset-pipeline.json b/web/i18n/locales/az-AZ/dataset-pipeline.json similarity index 100% rename from web/i18n/az-AZ/dataset-pipeline.json rename to web/i18n/locales/az-AZ/dataset-pipeline.json diff --git a/web/i18n/az-AZ/dataset-settings.json b/web/i18n/locales/az-AZ/dataset-settings.json similarity index 100% rename from web/i18n/az-AZ/dataset-settings.json rename to web/i18n/locales/az-AZ/dataset-settings.json diff --git a/web/i18n/az-AZ/dataset.json b/web/i18n/locales/az-AZ/dataset.json similarity index 100% rename from web/i18n/az-AZ/dataset.json rename to web/i18n/locales/az-AZ/dataset.json diff --git a/web/i18n/az-AZ/deployments.json b/web/i18n/locales/az-AZ/deployments.json similarity index 100% rename from web/i18n/az-AZ/deployments.json rename to web/i18n/locales/az-AZ/deployments.json diff --git a/web/i18n/az-AZ/device-flow.json b/web/i18n/locales/az-AZ/device-flow.json similarity index 100% rename from web/i18n/az-AZ/device-flow.json rename to web/i18n/locales/az-AZ/device-flow.json diff --git a/web/i18n/az-AZ/education.json b/web/i18n/locales/az-AZ/education.json similarity index 100% rename from web/i18n/az-AZ/education.json rename to web/i18n/locales/az-AZ/education.json diff --git a/web/i18n/az-AZ/explore.json b/web/i18n/locales/az-AZ/explore.json similarity index 100% rename from web/i18n/az-AZ/explore.json rename to web/i18n/locales/az-AZ/explore.json diff --git a/web/i18n/az-AZ/layout.json b/web/i18n/locales/az-AZ/layout.json similarity index 100% rename from web/i18n/az-AZ/layout.json rename to web/i18n/locales/az-AZ/layout.json diff --git a/web/i18n/az-AZ/login.json b/web/i18n/locales/az-AZ/login.json similarity index 100% rename from web/i18n/az-AZ/login.json rename to web/i18n/locales/az-AZ/login.json diff --git a/web/i18n/az-AZ/oauth.json b/web/i18n/locales/az-AZ/oauth.json similarity index 100% rename from web/i18n/az-AZ/oauth.json rename to web/i18n/locales/az-AZ/oauth.json diff --git a/web/i18n/az-AZ/permission-keys.json b/web/i18n/locales/az-AZ/permission-keys.json similarity index 100% rename from web/i18n/az-AZ/permission-keys.json rename to web/i18n/locales/az-AZ/permission-keys.json diff --git a/web/i18n/az-AZ/permission.json b/web/i18n/locales/az-AZ/permission.json similarity index 100% rename from web/i18n/az-AZ/permission.json rename to web/i18n/locales/az-AZ/permission.json diff --git a/web/i18n/az-AZ/pipeline.json b/web/i18n/locales/az-AZ/pipeline.json similarity index 100% rename from web/i18n/az-AZ/pipeline.json rename to web/i18n/locales/az-AZ/pipeline.json diff --git a/web/i18n/az-AZ/plugin-tags.json b/web/i18n/locales/az-AZ/plugin-tags.json similarity index 100% rename from web/i18n/az-AZ/plugin-tags.json rename to web/i18n/locales/az-AZ/plugin-tags.json diff --git a/web/i18n/az-AZ/plugin-trigger.json b/web/i18n/locales/az-AZ/plugin-trigger.json similarity index 100% rename from web/i18n/az-AZ/plugin-trigger.json rename to web/i18n/locales/az-AZ/plugin-trigger.json diff --git a/web/i18n/az-AZ/plugin.json b/web/i18n/locales/az-AZ/plugin.json similarity index 100% rename from web/i18n/az-AZ/plugin.json rename to web/i18n/locales/az-AZ/plugin.json diff --git a/web/i18n/az-AZ/register.json b/web/i18n/locales/az-AZ/register.json similarity index 100% rename from web/i18n/az-AZ/register.json rename to web/i18n/locales/az-AZ/register.json diff --git a/web/i18n/az-AZ/run-log.json b/web/i18n/locales/az-AZ/run-log.json similarity index 100% rename from web/i18n/az-AZ/run-log.json rename to web/i18n/locales/az-AZ/run-log.json diff --git a/web/i18n/az-AZ/share.json b/web/i18n/locales/az-AZ/share.json similarity index 100% rename from web/i18n/az-AZ/share.json rename to web/i18n/locales/az-AZ/share.json diff --git a/web/i18n/az-AZ/skill.json b/web/i18n/locales/az-AZ/skill.json similarity index 100% rename from web/i18n/az-AZ/skill.json rename to web/i18n/locales/az-AZ/skill.json diff --git a/web/i18n/az-AZ/snippet.json b/web/i18n/locales/az-AZ/snippet.json similarity index 100% rename from web/i18n/az-AZ/snippet.json rename to web/i18n/locales/az-AZ/snippet.json diff --git a/web/i18n/az-AZ/time.json b/web/i18n/locales/az-AZ/time.json similarity index 100% rename from web/i18n/az-AZ/time.json rename to web/i18n/locales/az-AZ/time.json diff --git a/web/i18n/az-AZ/tools.json b/web/i18n/locales/az-AZ/tools.json similarity index 100% rename from web/i18n/az-AZ/tools.json rename to web/i18n/locales/az-AZ/tools.json diff --git a/web/i18n/az-AZ/workflow.json b/web/i18n/locales/az-AZ/workflow.json similarity index 100% rename from web/i18n/az-AZ/workflow.json rename to web/i18n/locales/az-AZ/workflow.json diff --git a/web/i18n/de-DE/agent-v-2.json b/web/i18n/locales/de-DE/agent-v-2.json similarity index 100% rename from web/i18n/de-DE/agent-v-2.json rename to web/i18n/locales/de-DE/agent-v-2.json diff --git a/web/i18n/de-DE/app-annotation.json b/web/i18n/locales/de-DE/app-annotation.json similarity index 100% rename from web/i18n/de-DE/app-annotation.json rename to web/i18n/locales/de-DE/app-annotation.json diff --git a/web/i18n/de-DE/app-api.json b/web/i18n/locales/de-DE/app-api.json similarity index 100% rename from web/i18n/de-DE/app-api.json rename to web/i18n/locales/de-DE/app-api.json diff --git a/web/i18n/de-DE/app-debug.json b/web/i18n/locales/de-DE/app-debug.json similarity index 100% rename from web/i18n/de-DE/app-debug.json rename to web/i18n/locales/de-DE/app-debug.json diff --git a/web/i18n/de-DE/app-log.json b/web/i18n/locales/de-DE/app-log.json similarity index 100% rename from web/i18n/de-DE/app-log.json rename to web/i18n/locales/de-DE/app-log.json diff --git a/web/i18n/de-DE/app-overview.json b/web/i18n/locales/de-DE/app-overview.json similarity index 100% rename from web/i18n/de-DE/app-overview.json rename to web/i18n/locales/de-DE/app-overview.json diff --git a/web/i18n/de-DE/app.json b/web/i18n/locales/de-DE/app.json similarity index 100% rename from web/i18n/de-DE/app.json rename to web/i18n/locales/de-DE/app.json diff --git a/web/i18n/de-DE/billing.json b/web/i18n/locales/de-DE/billing.json similarity index 100% rename from web/i18n/de-DE/billing.json rename to web/i18n/locales/de-DE/billing.json diff --git a/web/i18n/de-DE/common.json b/web/i18n/locales/de-DE/common.json similarity index 100% rename from web/i18n/de-DE/common.json rename to web/i18n/locales/de-DE/common.json diff --git a/web/i18n/de-DE/custom.json b/web/i18n/locales/de-DE/custom.json similarity index 100% rename from web/i18n/de-DE/custom.json rename to web/i18n/locales/de-DE/custom.json diff --git a/web/i18n/de-DE/dataset-creation.json b/web/i18n/locales/de-DE/dataset-creation.json similarity index 100% rename from web/i18n/de-DE/dataset-creation.json rename to web/i18n/locales/de-DE/dataset-creation.json diff --git a/web/i18n/de-DE/dataset-documents.json b/web/i18n/locales/de-DE/dataset-documents.json similarity index 100% rename from web/i18n/de-DE/dataset-documents.json rename to web/i18n/locales/de-DE/dataset-documents.json diff --git a/web/i18n/de-DE/dataset-hit-testing.json b/web/i18n/locales/de-DE/dataset-hit-testing.json similarity index 100% rename from web/i18n/de-DE/dataset-hit-testing.json rename to web/i18n/locales/de-DE/dataset-hit-testing.json diff --git a/web/i18n/de-DE/dataset-pipeline.json b/web/i18n/locales/de-DE/dataset-pipeline.json similarity index 100% rename from web/i18n/de-DE/dataset-pipeline.json rename to web/i18n/locales/de-DE/dataset-pipeline.json diff --git a/web/i18n/de-DE/dataset-settings.json b/web/i18n/locales/de-DE/dataset-settings.json similarity index 100% rename from web/i18n/de-DE/dataset-settings.json rename to web/i18n/locales/de-DE/dataset-settings.json diff --git a/web/i18n/de-DE/dataset.json b/web/i18n/locales/de-DE/dataset.json similarity index 100% rename from web/i18n/de-DE/dataset.json rename to web/i18n/locales/de-DE/dataset.json diff --git a/web/i18n/de-DE/deployments.json b/web/i18n/locales/de-DE/deployments.json similarity index 100% rename from web/i18n/de-DE/deployments.json rename to web/i18n/locales/de-DE/deployments.json diff --git a/web/i18n/de-DE/device-flow.json b/web/i18n/locales/de-DE/device-flow.json similarity index 100% rename from web/i18n/de-DE/device-flow.json rename to web/i18n/locales/de-DE/device-flow.json diff --git a/web/i18n/de-DE/education.json b/web/i18n/locales/de-DE/education.json similarity index 100% rename from web/i18n/de-DE/education.json rename to web/i18n/locales/de-DE/education.json diff --git a/web/i18n/de-DE/explore.json b/web/i18n/locales/de-DE/explore.json similarity index 100% rename from web/i18n/de-DE/explore.json rename to web/i18n/locales/de-DE/explore.json diff --git a/web/i18n/de-DE/layout.json b/web/i18n/locales/de-DE/layout.json similarity index 100% rename from web/i18n/de-DE/layout.json rename to web/i18n/locales/de-DE/layout.json diff --git a/web/i18n/de-DE/login.json b/web/i18n/locales/de-DE/login.json similarity index 100% rename from web/i18n/de-DE/login.json rename to web/i18n/locales/de-DE/login.json diff --git a/web/i18n/de-DE/oauth.json b/web/i18n/locales/de-DE/oauth.json similarity index 100% rename from web/i18n/de-DE/oauth.json rename to web/i18n/locales/de-DE/oauth.json diff --git a/web/i18n/de-DE/permission-keys.json b/web/i18n/locales/de-DE/permission-keys.json similarity index 100% rename from web/i18n/de-DE/permission-keys.json rename to web/i18n/locales/de-DE/permission-keys.json diff --git a/web/i18n/de-DE/permission.json b/web/i18n/locales/de-DE/permission.json similarity index 100% rename from web/i18n/de-DE/permission.json rename to web/i18n/locales/de-DE/permission.json diff --git a/web/i18n/de-DE/pipeline.json b/web/i18n/locales/de-DE/pipeline.json similarity index 100% rename from web/i18n/de-DE/pipeline.json rename to web/i18n/locales/de-DE/pipeline.json diff --git a/web/i18n/de-DE/plugin-tags.json b/web/i18n/locales/de-DE/plugin-tags.json similarity index 100% rename from web/i18n/de-DE/plugin-tags.json rename to web/i18n/locales/de-DE/plugin-tags.json diff --git a/web/i18n/de-DE/plugin-trigger.json b/web/i18n/locales/de-DE/plugin-trigger.json similarity index 100% rename from web/i18n/de-DE/plugin-trigger.json rename to web/i18n/locales/de-DE/plugin-trigger.json diff --git a/web/i18n/de-DE/plugin.json b/web/i18n/locales/de-DE/plugin.json similarity index 100% rename from web/i18n/de-DE/plugin.json rename to web/i18n/locales/de-DE/plugin.json diff --git a/web/i18n/de-DE/register.json b/web/i18n/locales/de-DE/register.json similarity index 100% rename from web/i18n/de-DE/register.json rename to web/i18n/locales/de-DE/register.json diff --git a/web/i18n/de-DE/run-log.json b/web/i18n/locales/de-DE/run-log.json similarity index 100% rename from web/i18n/de-DE/run-log.json rename to web/i18n/locales/de-DE/run-log.json diff --git a/web/i18n/de-DE/share.json b/web/i18n/locales/de-DE/share.json similarity index 100% rename from web/i18n/de-DE/share.json rename to web/i18n/locales/de-DE/share.json diff --git a/web/i18n/de-DE/skill.json b/web/i18n/locales/de-DE/skill.json similarity index 100% rename from web/i18n/de-DE/skill.json rename to web/i18n/locales/de-DE/skill.json diff --git a/web/i18n/de-DE/snippet.json b/web/i18n/locales/de-DE/snippet.json similarity index 100% rename from web/i18n/de-DE/snippet.json rename to web/i18n/locales/de-DE/snippet.json diff --git a/web/i18n/de-DE/time.json b/web/i18n/locales/de-DE/time.json similarity index 100% rename from web/i18n/de-DE/time.json rename to web/i18n/locales/de-DE/time.json diff --git a/web/i18n/de-DE/tools.json b/web/i18n/locales/de-DE/tools.json similarity index 100% rename from web/i18n/de-DE/tools.json rename to web/i18n/locales/de-DE/tools.json diff --git a/web/i18n/de-DE/workflow.json b/web/i18n/locales/de-DE/workflow.json similarity index 100% rename from web/i18n/de-DE/workflow.json rename to web/i18n/locales/de-DE/workflow.json diff --git a/web/i18n/en-US/agent-v-2.json b/web/i18n/locales/en-US/agent-v-2.json similarity index 100% rename from web/i18n/en-US/agent-v-2.json rename to web/i18n/locales/en-US/agent-v-2.json diff --git a/web/i18n/en-US/app-annotation.json b/web/i18n/locales/en-US/app-annotation.json similarity index 100% rename from web/i18n/en-US/app-annotation.json rename to web/i18n/locales/en-US/app-annotation.json diff --git a/web/i18n/en-US/app-api.json b/web/i18n/locales/en-US/app-api.json similarity index 100% rename from web/i18n/en-US/app-api.json rename to web/i18n/locales/en-US/app-api.json diff --git a/web/i18n/en-US/app-debug.json b/web/i18n/locales/en-US/app-debug.json similarity index 100% rename from web/i18n/en-US/app-debug.json rename to web/i18n/locales/en-US/app-debug.json diff --git a/web/i18n/en-US/app-log.json b/web/i18n/locales/en-US/app-log.json similarity index 100% rename from web/i18n/en-US/app-log.json rename to web/i18n/locales/en-US/app-log.json diff --git a/web/i18n/en-US/app-overview.json b/web/i18n/locales/en-US/app-overview.json similarity index 100% rename from web/i18n/en-US/app-overview.json rename to web/i18n/locales/en-US/app-overview.json diff --git a/web/i18n/en-US/app.json b/web/i18n/locales/en-US/app.json similarity index 100% rename from web/i18n/en-US/app.json rename to web/i18n/locales/en-US/app.json diff --git a/web/i18n/en-US/billing.json b/web/i18n/locales/en-US/billing.json similarity index 100% rename from web/i18n/en-US/billing.json rename to web/i18n/locales/en-US/billing.json diff --git a/web/i18n/en-US/common.json b/web/i18n/locales/en-US/common.json similarity index 100% rename from web/i18n/en-US/common.json rename to web/i18n/locales/en-US/common.json diff --git a/web/i18n/en-US/custom.json b/web/i18n/locales/en-US/custom.json similarity index 100% rename from web/i18n/en-US/custom.json rename to web/i18n/locales/en-US/custom.json diff --git a/web/i18n/en-US/dataset-creation.json b/web/i18n/locales/en-US/dataset-creation.json similarity index 100% rename from web/i18n/en-US/dataset-creation.json rename to web/i18n/locales/en-US/dataset-creation.json diff --git a/web/i18n/en-US/dataset-documents.json b/web/i18n/locales/en-US/dataset-documents.json similarity index 100% rename from web/i18n/en-US/dataset-documents.json rename to web/i18n/locales/en-US/dataset-documents.json diff --git a/web/i18n/en-US/dataset-hit-testing.json b/web/i18n/locales/en-US/dataset-hit-testing.json similarity index 100% rename from web/i18n/en-US/dataset-hit-testing.json rename to web/i18n/locales/en-US/dataset-hit-testing.json diff --git a/web/i18n/en-US/dataset-pipeline.json b/web/i18n/locales/en-US/dataset-pipeline.json similarity index 100% rename from web/i18n/en-US/dataset-pipeline.json rename to web/i18n/locales/en-US/dataset-pipeline.json diff --git a/web/i18n/en-US/dataset-settings.json b/web/i18n/locales/en-US/dataset-settings.json similarity index 100% rename from web/i18n/en-US/dataset-settings.json rename to web/i18n/locales/en-US/dataset-settings.json diff --git a/web/i18n/en-US/dataset.json b/web/i18n/locales/en-US/dataset.json similarity index 100% rename from web/i18n/en-US/dataset.json rename to web/i18n/locales/en-US/dataset.json diff --git a/web/i18n/en-US/deployments.json b/web/i18n/locales/en-US/deployments.json similarity index 100% rename from web/i18n/en-US/deployments.json rename to web/i18n/locales/en-US/deployments.json diff --git a/web/i18n/en-US/device-flow.json b/web/i18n/locales/en-US/device-flow.json similarity index 100% rename from web/i18n/en-US/device-flow.json rename to web/i18n/locales/en-US/device-flow.json diff --git a/web/i18n/en-US/education.json b/web/i18n/locales/en-US/education.json similarity index 100% rename from web/i18n/en-US/education.json rename to web/i18n/locales/en-US/education.json diff --git a/web/i18n/en-US/explore.json b/web/i18n/locales/en-US/explore.json similarity index 100% rename from web/i18n/en-US/explore.json rename to web/i18n/locales/en-US/explore.json diff --git a/web/i18n/en-US/layout.json b/web/i18n/locales/en-US/layout.json similarity index 100% rename from web/i18n/en-US/layout.json rename to web/i18n/locales/en-US/layout.json diff --git a/web/i18n/en-US/login.json b/web/i18n/locales/en-US/login.json similarity index 100% rename from web/i18n/en-US/login.json rename to web/i18n/locales/en-US/login.json diff --git a/web/i18n/en-US/oauth.json b/web/i18n/locales/en-US/oauth.json similarity index 100% rename from web/i18n/en-US/oauth.json rename to web/i18n/locales/en-US/oauth.json diff --git a/web/i18n/en-US/permission-keys.json b/web/i18n/locales/en-US/permission-keys.json similarity index 100% rename from web/i18n/en-US/permission-keys.json rename to web/i18n/locales/en-US/permission-keys.json diff --git a/web/i18n/en-US/permission.json b/web/i18n/locales/en-US/permission.json similarity index 100% rename from web/i18n/en-US/permission.json rename to web/i18n/locales/en-US/permission.json diff --git a/web/i18n/en-US/pipeline.json b/web/i18n/locales/en-US/pipeline.json similarity index 100% rename from web/i18n/en-US/pipeline.json rename to web/i18n/locales/en-US/pipeline.json diff --git a/web/i18n/en-US/plugin-tags.json b/web/i18n/locales/en-US/plugin-tags.json similarity index 100% rename from web/i18n/en-US/plugin-tags.json rename to web/i18n/locales/en-US/plugin-tags.json diff --git a/web/i18n/en-US/plugin-trigger.json b/web/i18n/locales/en-US/plugin-trigger.json similarity index 100% rename from web/i18n/en-US/plugin-trigger.json rename to web/i18n/locales/en-US/plugin-trigger.json diff --git a/web/i18n/en-US/plugin.json b/web/i18n/locales/en-US/plugin.json similarity index 100% rename from web/i18n/en-US/plugin.json rename to web/i18n/locales/en-US/plugin.json diff --git a/web/i18n/en-US/register.json b/web/i18n/locales/en-US/register.json similarity index 100% rename from web/i18n/en-US/register.json rename to web/i18n/locales/en-US/register.json diff --git a/web/i18n/en-US/run-log.json b/web/i18n/locales/en-US/run-log.json similarity index 100% rename from web/i18n/en-US/run-log.json rename to web/i18n/locales/en-US/run-log.json diff --git a/web/i18n/en-US/share.json b/web/i18n/locales/en-US/share.json similarity index 100% rename from web/i18n/en-US/share.json rename to web/i18n/locales/en-US/share.json diff --git a/web/i18n/en-US/skill.json b/web/i18n/locales/en-US/skill.json similarity index 100% rename from web/i18n/en-US/skill.json rename to web/i18n/locales/en-US/skill.json diff --git a/web/i18n/en-US/snippet.json b/web/i18n/locales/en-US/snippet.json similarity index 100% rename from web/i18n/en-US/snippet.json rename to web/i18n/locales/en-US/snippet.json diff --git a/web/i18n/en-US/time.json b/web/i18n/locales/en-US/time.json similarity index 100% rename from web/i18n/en-US/time.json rename to web/i18n/locales/en-US/time.json diff --git a/web/i18n/en-US/tools.json b/web/i18n/locales/en-US/tools.json similarity index 100% rename from web/i18n/en-US/tools.json rename to web/i18n/locales/en-US/tools.json diff --git a/web/i18n/en-US/workflow.json b/web/i18n/locales/en-US/workflow.json similarity index 100% rename from web/i18n/en-US/workflow.json rename to web/i18n/locales/en-US/workflow.json diff --git a/web/i18n/es-ES/agent-v-2.json b/web/i18n/locales/es-ES/agent-v-2.json similarity index 100% rename from web/i18n/es-ES/agent-v-2.json rename to web/i18n/locales/es-ES/agent-v-2.json diff --git a/web/i18n/es-ES/app-annotation.json b/web/i18n/locales/es-ES/app-annotation.json similarity index 100% rename from web/i18n/es-ES/app-annotation.json rename to web/i18n/locales/es-ES/app-annotation.json diff --git a/web/i18n/es-ES/app-api.json b/web/i18n/locales/es-ES/app-api.json similarity index 100% rename from web/i18n/es-ES/app-api.json rename to web/i18n/locales/es-ES/app-api.json diff --git a/web/i18n/es-ES/app-debug.json b/web/i18n/locales/es-ES/app-debug.json similarity index 100% rename from web/i18n/es-ES/app-debug.json rename to web/i18n/locales/es-ES/app-debug.json diff --git a/web/i18n/es-ES/app-log.json b/web/i18n/locales/es-ES/app-log.json similarity index 100% rename from web/i18n/es-ES/app-log.json rename to web/i18n/locales/es-ES/app-log.json diff --git a/web/i18n/es-ES/app-overview.json b/web/i18n/locales/es-ES/app-overview.json similarity index 100% rename from web/i18n/es-ES/app-overview.json rename to web/i18n/locales/es-ES/app-overview.json diff --git a/web/i18n/es-ES/app.json b/web/i18n/locales/es-ES/app.json similarity index 100% rename from web/i18n/es-ES/app.json rename to web/i18n/locales/es-ES/app.json diff --git a/web/i18n/es-ES/billing.json b/web/i18n/locales/es-ES/billing.json similarity index 100% rename from web/i18n/es-ES/billing.json rename to web/i18n/locales/es-ES/billing.json diff --git a/web/i18n/es-ES/common.json b/web/i18n/locales/es-ES/common.json similarity index 100% rename from web/i18n/es-ES/common.json rename to web/i18n/locales/es-ES/common.json diff --git a/web/i18n/es-ES/custom.json b/web/i18n/locales/es-ES/custom.json similarity index 100% rename from web/i18n/es-ES/custom.json rename to web/i18n/locales/es-ES/custom.json diff --git a/web/i18n/es-ES/dataset-creation.json b/web/i18n/locales/es-ES/dataset-creation.json similarity index 100% rename from web/i18n/es-ES/dataset-creation.json rename to web/i18n/locales/es-ES/dataset-creation.json diff --git a/web/i18n/es-ES/dataset-documents.json b/web/i18n/locales/es-ES/dataset-documents.json similarity index 100% rename from web/i18n/es-ES/dataset-documents.json rename to web/i18n/locales/es-ES/dataset-documents.json diff --git a/web/i18n/es-ES/dataset-hit-testing.json b/web/i18n/locales/es-ES/dataset-hit-testing.json similarity index 100% rename from web/i18n/es-ES/dataset-hit-testing.json rename to web/i18n/locales/es-ES/dataset-hit-testing.json diff --git a/web/i18n/es-ES/dataset-pipeline.json b/web/i18n/locales/es-ES/dataset-pipeline.json similarity index 100% rename from web/i18n/es-ES/dataset-pipeline.json rename to web/i18n/locales/es-ES/dataset-pipeline.json diff --git a/web/i18n/es-ES/dataset-settings.json b/web/i18n/locales/es-ES/dataset-settings.json similarity index 100% rename from web/i18n/es-ES/dataset-settings.json rename to web/i18n/locales/es-ES/dataset-settings.json diff --git a/web/i18n/es-ES/dataset.json b/web/i18n/locales/es-ES/dataset.json similarity index 100% rename from web/i18n/es-ES/dataset.json rename to web/i18n/locales/es-ES/dataset.json diff --git a/web/i18n/es-ES/deployments.json b/web/i18n/locales/es-ES/deployments.json similarity index 100% rename from web/i18n/es-ES/deployments.json rename to web/i18n/locales/es-ES/deployments.json diff --git a/web/i18n/es-ES/device-flow.json b/web/i18n/locales/es-ES/device-flow.json similarity index 100% rename from web/i18n/es-ES/device-flow.json rename to web/i18n/locales/es-ES/device-flow.json diff --git a/web/i18n/es-ES/education.json b/web/i18n/locales/es-ES/education.json similarity index 100% rename from web/i18n/es-ES/education.json rename to web/i18n/locales/es-ES/education.json diff --git a/web/i18n/es-ES/explore.json b/web/i18n/locales/es-ES/explore.json similarity index 100% rename from web/i18n/es-ES/explore.json rename to web/i18n/locales/es-ES/explore.json diff --git a/web/i18n/es-ES/layout.json b/web/i18n/locales/es-ES/layout.json similarity index 100% rename from web/i18n/es-ES/layout.json rename to web/i18n/locales/es-ES/layout.json diff --git a/web/i18n/es-ES/login.json b/web/i18n/locales/es-ES/login.json similarity index 100% rename from web/i18n/es-ES/login.json rename to web/i18n/locales/es-ES/login.json diff --git a/web/i18n/es-ES/oauth.json b/web/i18n/locales/es-ES/oauth.json similarity index 100% rename from web/i18n/es-ES/oauth.json rename to web/i18n/locales/es-ES/oauth.json diff --git a/web/i18n/es-ES/permission-keys.json b/web/i18n/locales/es-ES/permission-keys.json similarity index 100% rename from web/i18n/es-ES/permission-keys.json rename to web/i18n/locales/es-ES/permission-keys.json diff --git a/web/i18n/es-ES/permission.json b/web/i18n/locales/es-ES/permission.json similarity index 100% rename from web/i18n/es-ES/permission.json rename to web/i18n/locales/es-ES/permission.json diff --git a/web/i18n/es-ES/pipeline.json b/web/i18n/locales/es-ES/pipeline.json similarity index 100% rename from web/i18n/es-ES/pipeline.json rename to web/i18n/locales/es-ES/pipeline.json diff --git a/web/i18n/es-ES/plugin-tags.json b/web/i18n/locales/es-ES/plugin-tags.json similarity index 100% rename from web/i18n/es-ES/plugin-tags.json rename to web/i18n/locales/es-ES/plugin-tags.json diff --git a/web/i18n/es-ES/plugin-trigger.json b/web/i18n/locales/es-ES/plugin-trigger.json similarity index 100% rename from web/i18n/es-ES/plugin-trigger.json rename to web/i18n/locales/es-ES/plugin-trigger.json diff --git a/web/i18n/es-ES/plugin.json b/web/i18n/locales/es-ES/plugin.json similarity index 100% rename from web/i18n/es-ES/plugin.json rename to web/i18n/locales/es-ES/plugin.json diff --git a/web/i18n/es-ES/register.json b/web/i18n/locales/es-ES/register.json similarity index 100% rename from web/i18n/es-ES/register.json rename to web/i18n/locales/es-ES/register.json diff --git a/web/i18n/es-ES/run-log.json b/web/i18n/locales/es-ES/run-log.json similarity index 100% rename from web/i18n/es-ES/run-log.json rename to web/i18n/locales/es-ES/run-log.json diff --git a/web/i18n/es-ES/share.json b/web/i18n/locales/es-ES/share.json similarity index 100% rename from web/i18n/es-ES/share.json rename to web/i18n/locales/es-ES/share.json diff --git a/web/i18n/es-ES/skill.json b/web/i18n/locales/es-ES/skill.json similarity index 100% rename from web/i18n/es-ES/skill.json rename to web/i18n/locales/es-ES/skill.json diff --git a/web/i18n/es-ES/snippet.json b/web/i18n/locales/es-ES/snippet.json similarity index 100% rename from web/i18n/es-ES/snippet.json rename to web/i18n/locales/es-ES/snippet.json diff --git a/web/i18n/es-ES/time.json b/web/i18n/locales/es-ES/time.json similarity index 100% rename from web/i18n/es-ES/time.json rename to web/i18n/locales/es-ES/time.json diff --git a/web/i18n/es-ES/tools.json b/web/i18n/locales/es-ES/tools.json similarity index 100% rename from web/i18n/es-ES/tools.json rename to web/i18n/locales/es-ES/tools.json diff --git a/web/i18n/es-ES/workflow.json b/web/i18n/locales/es-ES/workflow.json similarity index 100% rename from web/i18n/es-ES/workflow.json rename to web/i18n/locales/es-ES/workflow.json diff --git a/web/i18n/fa-IR/agent-v-2.json b/web/i18n/locales/fa-IR/agent-v-2.json similarity index 100% rename from web/i18n/fa-IR/agent-v-2.json rename to web/i18n/locales/fa-IR/agent-v-2.json diff --git a/web/i18n/fa-IR/app-annotation.json b/web/i18n/locales/fa-IR/app-annotation.json similarity index 100% rename from web/i18n/fa-IR/app-annotation.json rename to web/i18n/locales/fa-IR/app-annotation.json diff --git a/web/i18n/fa-IR/app-api.json b/web/i18n/locales/fa-IR/app-api.json similarity index 100% rename from web/i18n/fa-IR/app-api.json rename to web/i18n/locales/fa-IR/app-api.json diff --git a/web/i18n/fa-IR/app-debug.json b/web/i18n/locales/fa-IR/app-debug.json similarity index 100% rename from web/i18n/fa-IR/app-debug.json rename to web/i18n/locales/fa-IR/app-debug.json diff --git a/web/i18n/fa-IR/app-log.json b/web/i18n/locales/fa-IR/app-log.json similarity index 100% rename from web/i18n/fa-IR/app-log.json rename to web/i18n/locales/fa-IR/app-log.json diff --git a/web/i18n/fa-IR/app-overview.json b/web/i18n/locales/fa-IR/app-overview.json similarity index 100% rename from web/i18n/fa-IR/app-overview.json rename to web/i18n/locales/fa-IR/app-overview.json diff --git a/web/i18n/fa-IR/app.json b/web/i18n/locales/fa-IR/app.json similarity index 100% rename from web/i18n/fa-IR/app.json rename to web/i18n/locales/fa-IR/app.json diff --git a/web/i18n/fa-IR/billing.json b/web/i18n/locales/fa-IR/billing.json similarity index 100% rename from web/i18n/fa-IR/billing.json rename to web/i18n/locales/fa-IR/billing.json diff --git a/web/i18n/fa-IR/common.json b/web/i18n/locales/fa-IR/common.json similarity index 100% rename from web/i18n/fa-IR/common.json rename to web/i18n/locales/fa-IR/common.json diff --git a/web/i18n/fa-IR/custom.json b/web/i18n/locales/fa-IR/custom.json similarity index 100% rename from web/i18n/fa-IR/custom.json rename to web/i18n/locales/fa-IR/custom.json diff --git a/web/i18n/fa-IR/dataset-creation.json b/web/i18n/locales/fa-IR/dataset-creation.json similarity index 100% rename from web/i18n/fa-IR/dataset-creation.json rename to web/i18n/locales/fa-IR/dataset-creation.json diff --git a/web/i18n/fa-IR/dataset-documents.json b/web/i18n/locales/fa-IR/dataset-documents.json similarity index 100% rename from web/i18n/fa-IR/dataset-documents.json rename to web/i18n/locales/fa-IR/dataset-documents.json diff --git a/web/i18n/fa-IR/dataset-hit-testing.json b/web/i18n/locales/fa-IR/dataset-hit-testing.json similarity index 100% rename from web/i18n/fa-IR/dataset-hit-testing.json rename to web/i18n/locales/fa-IR/dataset-hit-testing.json diff --git a/web/i18n/fa-IR/dataset-pipeline.json b/web/i18n/locales/fa-IR/dataset-pipeline.json similarity index 100% rename from web/i18n/fa-IR/dataset-pipeline.json rename to web/i18n/locales/fa-IR/dataset-pipeline.json diff --git a/web/i18n/fa-IR/dataset-settings.json b/web/i18n/locales/fa-IR/dataset-settings.json similarity index 100% rename from web/i18n/fa-IR/dataset-settings.json rename to web/i18n/locales/fa-IR/dataset-settings.json diff --git a/web/i18n/fa-IR/dataset.json b/web/i18n/locales/fa-IR/dataset.json similarity index 100% rename from web/i18n/fa-IR/dataset.json rename to web/i18n/locales/fa-IR/dataset.json diff --git a/web/i18n/fa-IR/deployments.json b/web/i18n/locales/fa-IR/deployments.json similarity index 100% rename from web/i18n/fa-IR/deployments.json rename to web/i18n/locales/fa-IR/deployments.json diff --git a/web/i18n/fa-IR/device-flow.json b/web/i18n/locales/fa-IR/device-flow.json similarity index 100% rename from web/i18n/fa-IR/device-flow.json rename to web/i18n/locales/fa-IR/device-flow.json diff --git a/web/i18n/fa-IR/education.json b/web/i18n/locales/fa-IR/education.json similarity index 100% rename from web/i18n/fa-IR/education.json rename to web/i18n/locales/fa-IR/education.json diff --git a/web/i18n/fa-IR/explore.json b/web/i18n/locales/fa-IR/explore.json similarity index 100% rename from web/i18n/fa-IR/explore.json rename to web/i18n/locales/fa-IR/explore.json diff --git a/web/i18n/fa-IR/layout.json b/web/i18n/locales/fa-IR/layout.json similarity index 100% rename from web/i18n/fa-IR/layout.json rename to web/i18n/locales/fa-IR/layout.json diff --git a/web/i18n/fa-IR/login.json b/web/i18n/locales/fa-IR/login.json similarity index 100% rename from web/i18n/fa-IR/login.json rename to web/i18n/locales/fa-IR/login.json diff --git a/web/i18n/fa-IR/oauth.json b/web/i18n/locales/fa-IR/oauth.json similarity index 100% rename from web/i18n/fa-IR/oauth.json rename to web/i18n/locales/fa-IR/oauth.json diff --git a/web/i18n/fa-IR/permission-keys.json b/web/i18n/locales/fa-IR/permission-keys.json similarity index 100% rename from web/i18n/fa-IR/permission-keys.json rename to web/i18n/locales/fa-IR/permission-keys.json diff --git a/web/i18n/fa-IR/permission.json b/web/i18n/locales/fa-IR/permission.json similarity index 100% rename from web/i18n/fa-IR/permission.json rename to web/i18n/locales/fa-IR/permission.json diff --git a/web/i18n/fa-IR/pipeline.json b/web/i18n/locales/fa-IR/pipeline.json similarity index 100% rename from web/i18n/fa-IR/pipeline.json rename to web/i18n/locales/fa-IR/pipeline.json diff --git a/web/i18n/fa-IR/plugin-tags.json b/web/i18n/locales/fa-IR/plugin-tags.json similarity index 100% rename from web/i18n/fa-IR/plugin-tags.json rename to web/i18n/locales/fa-IR/plugin-tags.json diff --git a/web/i18n/fa-IR/plugin-trigger.json b/web/i18n/locales/fa-IR/plugin-trigger.json similarity index 100% rename from web/i18n/fa-IR/plugin-trigger.json rename to web/i18n/locales/fa-IR/plugin-trigger.json diff --git a/web/i18n/fa-IR/plugin.json b/web/i18n/locales/fa-IR/plugin.json similarity index 100% rename from web/i18n/fa-IR/plugin.json rename to web/i18n/locales/fa-IR/plugin.json diff --git a/web/i18n/fa-IR/register.json b/web/i18n/locales/fa-IR/register.json similarity index 100% rename from web/i18n/fa-IR/register.json rename to web/i18n/locales/fa-IR/register.json diff --git a/web/i18n/fa-IR/run-log.json b/web/i18n/locales/fa-IR/run-log.json similarity index 100% rename from web/i18n/fa-IR/run-log.json rename to web/i18n/locales/fa-IR/run-log.json diff --git a/web/i18n/fa-IR/share.json b/web/i18n/locales/fa-IR/share.json similarity index 100% rename from web/i18n/fa-IR/share.json rename to web/i18n/locales/fa-IR/share.json diff --git a/web/i18n/fa-IR/skill.json b/web/i18n/locales/fa-IR/skill.json similarity index 100% rename from web/i18n/fa-IR/skill.json rename to web/i18n/locales/fa-IR/skill.json diff --git a/web/i18n/fa-IR/snippet.json b/web/i18n/locales/fa-IR/snippet.json similarity index 100% rename from web/i18n/fa-IR/snippet.json rename to web/i18n/locales/fa-IR/snippet.json diff --git a/web/i18n/fa-IR/time.json b/web/i18n/locales/fa-IR/time.json similarity index 100% rename from web/i18n/fa-IR/time.json rename to web/i18n/locales/fa-IR/time.json diff --git a/web/i18n/fa-IR/tools.json b/web/i18n/locales/fa-IR/tools.json similarity index 100% rename from web/i18n/fa-IR/tools.json rename to web/i18n/locales/fa-IR/tools.json diff --git a/web/i18n/fa-IR/workflow.json b/web/i18n/locales/fa-IR/workflow.json similarity index 100% rename from web/i18n/fa-IR/workflow.json rename to web/i18n/locales/fa-IR/workflow.json diff --git a/web/i18n/fr-FR/agent-v-2.json b/web/i18n/locales/fr-FR/agent-v-2.json similarity index 100% rename from web/i18n/fr-FR/agent-v-2.json rename to web/i18n/locales/fr-FR/agent-v-2.json diff --git a/web/i18n/fr-FR/app-annotation.json b/web/i18n/locales/fr-FR/app-annotation.json similarity index 100% rename from web/i18n/fr-FR/app-annotation.json rename to web/i18n/locales/fr-FR/app-annotation.json diff --git a/web/i18n/fr-FR/app-api.json b/web/i18n/locales/fr-FR/app-api.json similarity index 100% rename from web/i18n/fr-FR/app-api.json rename to web/i18n/locales/fr-FR/app-api.json diff --git a/web/i18n/fr-FR/app-debug.json b/web/i18n/locales/fr-FR/app-debug.json similarity index 100% rename from web/i18n/fr-FR/app-debug.json rename to web/i18n/locales/fr-FR/app-debug.json diff --git a/web/i18n/fr-FR/app-log.json b/web/i18n/locales/fr-FR/app-log.json similarity index 100% rename from web/i18n/fr-FR/app-log.json rename to web/i18n/locales/fr-FR/app-log.json diff --git a/web/i18n/fr-FR/app-overview.json b/web/i18n/locales/fr-FR/app-overview.json similarity index 100% rename from web/i18n/fr-FR/app-overview.json rename to web/i18n/locales/fr-FR/app-overview.json diff --git a/web/i18n/fr-FR/app.json b/web/i18n/locales/fr-FR/app.json similarity index 100% rename from web/i18n/fr-FR/app.json rename to web/i18n/locales/fr-FR/app.json diff --git a/web/i18n/fr-FR/billing.json b/web/i18n/locales/fr-FR/billing.json similarity index 100% rename from web/i18n/fr-FR/billing.json rename to web/i18n/locales/fr-FR/billing.json diff --git a/web/i18n/fr-FR/common.json b/web/i18n/locales/fr-FR/common.json similarity index 100% rename from web/i18n/fr-FR/common.json rename to web/i18n/locales/fr-FR/common.json diff --git a/web/i18n/fr-FR/custom.json b/web/i18n/locales/fr-FR/custom.json similarity index 100% rename from web/i18n/fr-FR/custom.json rename to web/i18n/locales/fr-FR/custom.json diff --git a/web/i18n/fr-FR/dataset-creation.json b/web/i18n/locales/fr-FR/dataset-creation.json similarity index 100% rename from web/i18n/fr-FR/dataset-creation.json rename to web/i18n/locales/fr-FR/dataset-creation.json diff --git a/web/i18n/fr-FR/dataset-documents.json b/web/i18n/locales/fr-FR/dataset-documents.json similarity index 100% rename from web/i18n/fr-FR/dataset-documents.json rename to web/i18n/locales/fr-FR/dataset-documents.json diff --git a/web/i18n/fr-FR/dataset-hit-testing.json b/web/i18n/locales/fr-FR/dataset-hit-testing.json similarity index 100% rename from web/i18n/fr-FR/dataset-hit-testing.json rename to web/i18n/locales/fr-FR/dataset-hit-testing.json diff --git a/web/i18n/fr-FR/dataset-pipeline.json b/web/i18n/locales/fr-FR/dataset-pipeline.json similarity index 100% rename from web/i18n/fr-FR/dataset-pipeline.json rename to web/i18n/locales/fr-FR/dataset-pipeline.json diff --git a/web/i18n/fr-FR/dataset-settings.json b/web/i18n/locales/fr-FR/dataset-settings.json similarity index 100% rename from web/i18n/fr-FR/dataset-settings.json rename to web/i18n/locales/fr-FR/dataset-settings.json diff --git a/web/i18n/fr-FR/dataset.json b/web/i18n/locales/fr-FR/dataset.json similarity index 100% rename from web/i18n/fr-FR/dataset.json rename to web/i18n/locales/fr-FR/dataset.json diff --git a/web/i18n/fr-FR/deployments.json b/web/i18n/locales/fr-FR/deployments.json similarity index 100% rename from web/i18n/fr-FR/deployments.json rename to web/i18n/locales/fr-FR/deployments.json diff --git a/web/i18n/fr-FR/device-flow.json b/web/i18n/locales/fr-FR/device-flow.json similarity index 100% rename from web/i18n/fr-FR/device-flow.json rename to web/i18n/locales/fr-FR/device-flow.json diff --git a/web/i18n/fr-FR/education.json b/web/i18n/locales/fr-FR/education.json similarity index 100% rename from web/i18n/fr-FR/education.json rename to web/i18n/locales/fr-FR/education.json diff --git a/web/i18n/fr-FR/explore.json b/web/i18n/locales/fr-FR/explore.json similarity index 100% rename from web/i18n/fr-FR/explore.json rename to web/i18n/locales/fr-FR/explore.json diff --git a/web/i18n/fr-FR/layout.json b/web/i18n/locales/fr-FR/layout.json similarity index 100% rename from web/i18n/fr-FR/layout.json rename to web/i18n/locales/fr-FR/layout.json diff --git a/web/i18n/fr-FR/login.json b/web/i18n/locales/fr-FR/login.json similarity index 100% rename from web/i18n/fr-FR/login.json rename to web/i18n/locales/fr-FR/login.json diff --git a/web/i18n/fr-FR/oauth.json b/web/i18n/locales/fr-FR/oauth.json similarity index 100% rename from web/i18n/fr-FR/oauth.json rename to web/i18n/locales/fr-FR/oauth.json diff --git a/web/i18n/fr-FR/permission-keys.json b/web/i18n/locales/fr-FR/permission-keys.json similarity index 100% rename from web/i18n/fr-FR/permission-keys.json rename to web/i18n/locales/fr-FR/permission-keys.json diff --git a/web/i18n/fr-FR/permission.json b/web/i18n/locales/fr-FR/permission.json similarity index 100% rename from web/i18n/fr-FR/permission.json rename to web/i18n/locales/fr-FR/permission.json diff --git a/web/i18n/fr-FR/pipeline.json b/web/i18n/locales/fr-FR/pipeline.json similarity index 100% rename from web/i18n/fr-FR/pipeline.json rename to web/i18n/locales/fr-FR/pipeline.json diff --git a/web/i18n/fr-FR/plugin-tags.json b/web/i18n/locales/fr-FR/plugin-tags.json similarity index 100% rename from web/i18n/fr-FR/plugin-tags.json rename to web/i18n/locales/fr-FR/plugin-tags.json diff --git a/web/i18n/fr-FR/plugin-trigger.json b/web/i18n/locales/fr-FR/plugin-trigger.json similarity index 100% rename from web/i18n/fr-FR/plugin-trigger.json rename to web/i18n/locales/fr-FR/plugin-trigger.json diff --git a/web/i18n/fr-FR/plugin.json b/web/i18n/locales/fr-FR/plugin.json similarity index 100% rename from web/i18n/fr-FR/plugin.json rename to web/i18n/locales/fr-FR/plugin.json diff --git a/web/i18n/fr-FR/register.json b/web/i18n/locales/fr-FR/register.json similarity index 100% rename from web/i18n/fr-FR/register.json rename to web/i18n/locales/fr-FR/register.json diff --git a/web/i18n/fr-FR/run-log.json b/web/i18n/locales/fr-FR/run-log.json similarity index 100% rename from web/i18n/fr-FR/run-log.json rename to web/i18n/locales/fr-FR/run-log.json diff --git a/web/i18n/fr-FR/share.json b/web/i18n/locales/fr-FR/share.json similarity index 100% rename from web/i18n/fr-FR/share.json rename to web/i18n/locales/fr-FR/share.json diff --git a/web/i18n/fr-FR/skill.json b/web/i18n/locales/fr-FR/skill.json similarity index 100% rename from web/i18n/fr-FR/skill.json rename to web/i18n/locales/fr-FR/skill.json diff --git a/web/i18n/fr-FR/snippet.json b/web/i18n/locales/fr-FR/snippet.json similarity index 100% rename from web/i18n/fr-FR/snippet.json rename to web/i18n/locales/fr-FR/snippet.json diff --git a/web/i18n/fr-FR/time.json b/web/i18n/locales/fr-FR/time.json similarity index 100% rename from web/i18n/fr-FR/time.json rename to web/i18n/locales/fr-FR/time.json diff --git a/web/i18n/fr-FR/tools.json b/web/i18n/locales/fr-FR/tools.json similarity index 100% rename from web/i18n/fr-FR/tools.json rename to web/i18n/locales/fr-FR/tools.json diff --git a/web/i18n/fr-FR/workflow.json b/web/i18n/locales/fr-FR/workflow.json similarity index 100% rename from web/i18n/fr-FR/workflow.json rename to web/i18n/locales/fr-FR/workflow.json diff --git a/web/i18n/hi-IN/agent-v-2.json b/web/i18n/locales/hi-IN/agent-v-2.json similarity index 100% rename from web/i18n/hi-IN/agent-v-2.json rename to web/i18n/locales/hi-IN/agent-v-2.json diff --git a/web/i18n/hi-IN/app-annotation.json b/web/i18n/locales/hi-IN/app-annotation.json similarity index 100% rename from web/i18n/hi-IN/app-annotation.json rename to web/i18n/locales/hi-IN/app-annotation.json diff --git a/web/i18n/hi-IN/app-api.json b/web/i18n/locales/hi-IN/app-api.json similarity index 100% rename from web/i18n/hi-IN/app-api.json rename to web/i18n/locales/hi-IN/app-api.json diff --git a/web/i18n/hi-IN/app-debug.json b/web/i18n/locales/hi-IN/app-debug.json similarity index 100% rename from web/i18n/hi-IN/app-debug.json rename to web/i18n/locales/hi-IN/app-debug.json diff --git a/web/i18n/hi-IN/app-log.json b/web/i18n/locales/hi-IN/app-log.json similarity index 100% rename from web/i18n/hi-IN/app-log.json rename to web/i18n/locales/hi-IN/app-log.json diff --git a/web/i18n/hi-IN/app-overview.json b/web/i18n/locales/hi-IN/app-overview.json similarity index 100% rename from web/i18n/hi-IN/app-overview.json rename to web/i18n/locales/hi-IN/app-overview.json diff --git a/web/i18n/hi-IN/app.json b/web/i18n/locales/hi-IN/app.json similarity index 100% rename from web/i18n/hi-IN/app.json rename to web/i18n/locales/hi-IN/app.json diff --git a/web/i18n/hi-IN/billing.json b/web/i18n/locales/hi-IN/billing.json similarity index 100% rename from web/i18n/hi-IN/billing.json rename to web/i18n/locales/hi-IN/billing.json diff --git a/web/i18n/hi-IN/common.json b/web/i18n/locales/hi-IN/common.json similarity index 100% rename from web/i18n/hi-IN/common.json rename to web/i18n/locales/hi-IN/common.json diff --git a/web/i18n/hi-IN/custom.json b/web/i18n/locales/hi-IN/custom.json similarity index 100% rename from web/i18n/hi-IN/custom.json rename to web/i18n/locales/hi-IN/custom.json diff --git a/web/i18n/hi-IN/dataset-creation.json b/web/i18n/locales/hi-IN/dataset-creation.json similarity index 100% rename from web/i18n/hi-IN/dataset-creation.json rename to web/i18n/locales/hi-IN/dataset-creation.json diff --git a/web/i18n/hi-IN/dataset-documents.json b/web/i18n/locales/hi-IN/dataset-documents.json similarity index 100% rename from web/i18n/hi-IN/dataset-documents.json rename to web/i18n/locales/hi-IN/dataset-documents.json diff --git a/web/i18n/hi-IN/dataset-hit-testing.json b/web/i18n/locales/hi-IN/dataset-hit-testing.json similarity index 100% rename from web/i18n/hi-IN/dataset-hit-testing.json rename to web/i18n/locales/hi-IN/dataset-hit-testing.json diff --git a/web/i18n/hi-IN/dataset-pipeline.json b/web/i18n/locales/hi-IN/dataset-pipeline.json similarity index 100% rename from web/i18n/hi-IN/dataset-pipeline.json rename to web/i18n/locales/hi-IN/dataset-pipeline.json diff --git a/web/i18n/hi-IN/dataset-settings.json b/web/i18n/locales/hi-IN/dataset-settings.json similarity index 100% rename from web/i18n/hi-IN/dataset-settings.json rename to web/i18n/locales/hi-IN/dataset-settings.json diff --git a/web/i18n/hi-IN/dataset.json b/web/i18n/locales/hi-IN/dataset.json similarity index 100% rename from web/i18n/hi-IN/dataset.json rename to web/i18n/locales/hi-IN/dataset.json diff --git a/web/i18n/hi-IN/deployments.json b/web/i18n/locales/hi-IN/deployments.json similarity index 100% rename from web/i18n/hi-IN/deployments.json rename to web/i18n/locales/hi-IN/deployments.json diff --git a/web/i18n/hi-IN/device-flow.json b/web/i18n/locales/hi-IN/device-flow.json similarity index 100% rename from web/i18n/hi-IN/device-flow.json rename to web/i18n/locales/hi-IN/device-flow.json diff --git a/web/i18n/hi-IN/education.json b/web/i18n/locales/hi-IN/education.json similarity index 100% rename from web/i18n/hi-IN/education.json rename to web/i18n/locales/hi-IN/education.json diff --git a/web/i18n/hi-IN/explore.json b/web/i18n/locales/hi-IN/explore.json similarity index 100% rename from web/i18n/hi-IN/explore.json rename to web/i18n/locales/hi-IN/explore.json diff --git a/web/i18n/hi-IN/layout.json b/web/i18n/locales/hi-IN/layout.json similarity index 100% rename from web/i18n/hi-IN/layout.json rename to web/i18n/locales/hi-IN/layout.json diff --git a/web/i18n/hi-IN/login.json b/web/i18n/locales/hi-IN/login.json similarity index 100% rename from web/i18n/hi-IN/login.json rename to web/i18n/locales/hi-IN/login.json diff --git a/web/i18n/hi-IN/oauth.json b/web/i18n/locales/hi-IN/oauth.json similarity index 100% rename from web/i18n/hi-IN/oauth.json rename to web/i18n/locales/hi-IN/oauth.json diff --git a/web/i18n/hi-IN/permission-keys.json b/web/i18n/locales/hi-IN/permission-keys.json similarity index 100% rename from web/i18n/hi-IN/permission-keys.json rename to web/i18n/locales/hi-IN/permission-keys.json diff --git a/web/i18n/hi-IN/permission.json b/web/i18n/locales/hi-IN/permission.json similarity index 100% rename from web/i18n/hi-IN/permission.json rename to web/i18n/locales/hi-IN/permission.json diff --git a/web/i18n/hi-IN/pipeline.json b/web/i18n/locales/hi-IN/pipeline.json similarity index 100% rename from web/i18n/hi-IN/pipeline.json rename to web/i18n/locales/hi-IN/pipeline.json diff --git a/web/i18n/hi-IN/plugin-tags.json b/web/i18n/locales/hi-IN/plugin-tags.json similarity index 100% rename from web/i18n/hi-IN/plugin-tags.json rename to web/i18n/locales/hi-IN/plugin-tags.json diff --git a/web/i18n/hi-IN/plugin-trigger.json b/web/i18n/locales/hi-IN/plugin-trigger.json similarity index 100% rename from web/i18n/hi-IN/plugin-trigger.json rename to web/i18n/locales/hi-IN/plugin-trigger.json diff --git a/web/i18n/hi-IN/plugin.json b/web/i18n/locales/hi-IN/plugin.json similarity index 100% rename from web/i18n/hi-IN/plugin.json rename to web/i18n/locales/hi-IN/plugin.json diff --git a/web/i18n/hi-IN/register.json b/web/i18n/locales/hi-IN/register.json similarity index 100% rename from web/i18n/hi-IN/register.json rename to web/i18n/locales/hi-IN/register.json diff --git a/web/i18n/hi-IN/run-log.json b/web/i18n/locales/hi-IN/run-log.json similarity index 100% rename from web/i18n/hi-IN/run-log.json rename to web/i18n/locales/hi-IN/run-log.json diff --git a/web/i18n/hi-IN/share.json b/web/i18n/locales/hi-IN/share.json similarity index 100% rename from web/i18n/hi-IN/share.json rename to web/i18n/locales/hi-IN/share.json diff --git a/web/i18n/hi-IN/skill.json b/web/i18n/locales/hi-IN/skill.json similarity index 100% rename from web/i18n/hi-IN/skill.json rename to web/i18n/locales/hi-IN/skill.json diff --git a/web/i18n/hi-IN/snippet.json b/web/i18n/locales/hi-IN/snippet.json similarity index 100% rename from web/i18n/hi-IN/snippet.json rename to web/i18n/locales/hi-IN/snippet.json diff --git a/web/i18n/hi-IN/time.json b/web/i18n/locales/hi-IN/time.json similarity index 100% rename from web/i18n/hi-IN/time.json rename to web/i18n/locales/hi-IN/time.json diff --git a/web/i18n/hi-IN/tools.json b/web/i18n/locales/hi-IN/tools.json similarity index 100% rename from web/i18n/hi-IN/tools.json rename to web/i18n/locales/hi-IN/tools.json diff --git a/web/i18n/hi-IN/workflow.json b/web/i18n/locales/hi-IN/workflow.json similarity index 100% rename from web/i18n/hi-IN/workflow.json rename to web/i18n/locales/hi-IN/workflow.json diff --git a/web/i18n/id-ID/agent-v-2.json b/web/i18n/locales/id-ID/agent-v-2.json similarity index 100% rename from web/i18n/id-ID/agent-v-2.json rename to web/i18n/locales/id-ID/agent-v-2.json diff --git a/web/i18n/id-ID/app-annotation.json b/web/i18n/locales/id-ID/app-annotation.json similarity index 100% rename from web/i18n/id-ID/app-annotation.json rename to web/i18n/locales/id-ID/app-annotation.json diff --git a/web/i18n/id-ID/app-api.json b/web/i18n/locales/id-ID/app-api.json similarity index 100% rename from web/i18n/id-ID/app-api.json rename to web/i18n/locales/id-ID/app-api.json diff --git a/web/i18n/id-ID/app-debug.json b/web/i18n/locales/id-ID/app-debug.json similarity index 100% rename from web/i18n/id-ID/app-debug.json rename to web/i18n/locales/id-ID/app-debug.json diff --git a/web/i18n/id-ID/app-log.json b/web/i18n/locales/id-ID/app-log.json similarity index 100% rename from web/i18n/id-ID/app-log.json rename to web/i18n/locales/id-ID/app-log.json diff --git a/web/i18n/id-ID/app-overview.json b/web/i18n/locales/id-ID/app-overview.json similarity index 100% rename from web/i18n/id-ID/app-overview.json rename to web/i18n/locales/id-ID/app-overview.json diff --git a/web/i18n/id-ID/app.json b/web/i18n/locales/id-ID/app.json similarity index 100% rename from web/i18n/id-ID/app.json rename to web/i18n/locales/id-ID/app.json diff --git a/web/i18n/id-ID/billing.json b/web/i18n/locales/id-ID/billing.json similarity index 100% rename from web/i18n/id-ID/billing.json rename to web/i18n/locales/id-ID/billing.json diff --git a/web/i18n/id-ID/common.json b/web/i18n/locales/id-ID/common.json similarity index 100% rename from web/i18n/id-ID/common.json rename to web/i18n/locales/id-ID/common.json diff --git a/web/i18n/id-ID/custom.json b/web/i18n/locales/id-ID/custom.json similarity index 100% rename from web/i18n/id-ID/custom.json rename to web/i18n/locales/id-ID/custom.json diff --git a/web/i18n/id-ID/dataset-creation.json b/web/i18n/locales/id-ID/dataset-creation.json similarity index 100% rename from web/i18n/id-ID/dataset-creation.json rename to web/i18n/locales/id-ID/dataset-creation.json diff --git a/web/i18n/id-ID/dataset-documents.json b/web/i18n/locales/id-ID/dataset-documents.json similarity index 100% rename from web/i18n/id-ID/dataset-documents.json rename to web/i18n/locales/id-ID/dataset-documents.json diff --git a/web/i18n/id-ID/dataset-hit-testing.json b/web/i18n/locales/id-ID/dataset-hit-testing.json similarity index 100% rename from web/i18n/id-ID/dataset-hit-testing.json rename to web/i18n/locales/id-ID/dataset-hit-testing.json diff --git a/web/i18n/id-ID/dataset-pipeline.json b/web/i18n/locales/id-ID/dataset-pipeline.json similarity index 100% rename from web/i18n/id-ID/dataset-pipeline.json rename to web/i18n/locales/id-ID/dataset-pipeline.json diff --git a/web/i18n/id-ID/dataset-settings.json b/web/i18n/locales/id-ID/dataset-settings.json similarity index 100% rename from web/i18n/id-ID/dataset-settings.json rename to web/i18n/locales/id-ID/dataset-settings.json diff --git a/web/i18n/id-ID/dataset.json b/web/i18n/locales/id-ID/dataset.json similarity index 100% rename from web/i18n/id-ID/dataset.json rename to web/i18n/locales/id-ID/dataset.json diff --git a/web/i18n/id-ID/deployments.json b/web/i18n/locales/id-ID/deployments.json similarity index 100% rename from web/i18n/id-ID/deployments.json rename to web/i18n/locales/id-ID/deployments.json diff --git a/web/i18n/id-ID/device-flow.json b/web/i18n/locales/id-ID/device-flow.json similarity index 100% rename from web/i18n/id-ID/device-flow.json rename to web/i18n/locales/id-ID/device-flow.json diff --git a/web/i18n/id-ID/education.json b/web/i18n/locales/id-ID/education.json similarity index 100% rename from web/i18n/id-ID/education.json rename to web/i18n/locales/id-ID/education.json diff --git a/web/i18n/id-ID/explore.json b/web/i18n/locales/id-ID/explore.json similarity index 100% rename from web/i18n/id-ID/explore.json rename to web/i18n/locales/id-ID/explore.json diff --git a/web/i18n/id-ID/layout.json b/web/i18n/locales/id-ID/layout.json similarity index 100% rename from web/i18n/id-ID/layout.json rename to web/i18n/locales/id-ID/layout.json diff --git a/web/i18n/id-ID/login.json b/web/i18n/locales/id-ID/login.json similarity index 100% rename from web/i18n/id-ID/login.json rename to web/i18n/locales/id-ID/login.json diff --git a/web/i18n/id-ID/oauth.json b/web/i18n/locales/id-ID/oauth.json similarity index 100% rename from web/i18n/id-ID/oauth.json rename to web/i18n/locales/id-ID/oauth.json diff --git a/web/i18n/id-ID/permission-keys.json b/web/i18n/locales/id-ID/permission-keys.json similarity index 100% rename from web/i18n/id-ID/permission-keys.json rename to web/i18n/locales/id-ID/permission-keys.json diff --git a/web/i18n/id-ID/permission.json b/web/i18n/locales/id-ID/permission.json similarity index 100% rename from web/i18n/id-ID/permission.json rename to web/i18n/locales/id-ID/permission.json diff --git a/web/i18n/id-ID/pipeline.json b/web/i18n/locales/id-ID/pipeline.json similarity index 100% rename from web/i18n/id-ID/pipeline.json rename to web/i18n/locales/id-ID/pipeline.json diff --git a/web/i18n/id-ID/plugin-tags.json b/web/i18n/locales/id-ID/plugin-tags.json similarity index 100% rename from web/i18n/id-ID/plugin-tags.json rename to web/i18n/locales/id-ID/plugin-tags.json diff --git a/web/i18n/id-ID/plugin-trigger.json b/web/i18n/locales/id-ID/plugin-trigger.json similarity index 100% rename from web/i18n/id-ID/plugin-trigger.json rename to web/i18n/locales/id-ID/plugin-trigger.json diff --git a/web/i18n/id-ID/plugin.json b/web/i18n/locales/id-ID/plugin.json similarity index 100% rename from web/i18n/id-ID/plugin.json rename to web/i18n/locales/id-ID/plugin.json diff --git a/web/i18n/id-ID/register.json b/web/i18n/locales/id-ID/register.json similarity index 100% rename from web/i18n/id-ID/register.json rename to web/i18n/locales/id-ID/register.json diff --git a/web/i18n/id-ID/run-log.json b/web/i18n/locales/id-ID/run-log.json similarity index 100% rename from web/i18n/id-ID/run-log.json rename to web/i18n/locales/id-ID/run-log.json diff --git a/web/i18n/id-ID/share.json b/web/i18n/locales/id-ID/share.json similarity index 100% rename from web/i18n/id-ID/share.json rename to web/i18n/locales/id-ID/share.json diff --git a/web/i18n/id-ID/skill.json b/web/i18n/locales/id-ID/skill.json similarity index 100% rename from web/i18n/id-ID/skill.json rename to web/i18n/locales/id-ID/skill.json diff --git a/web/i18n/id-ID/snippet.json b/web/i18n/locales/id-ID/snippet.json similarity index 100% rename from web/i18n/id-ID/snippet.json rename to web/i18n/locales/id-ID/snippet.json diff --git a/web/i18n/id-ID/time.json b/web/i18n/locales/id-ID/time.json similarity index 100% rename from web/i18n/id-ID/time.json rename to web/i18n/locales/id-ID/time.json diff --git a/web/i18n/id-ID/tools.json b/web/i18n/locales/id-ID/tools.json similarity index 100% rename from web/i18n/id-ID/tools.json rename to web/i18n/locales/id-ID/tools.json diff --git a/web/i18n/id-ID/workflow.json b/web/i18n/locales/id-ID/workflow.json similarity index 100% rename from web/i18n/id-ID/workflow.json rename to web/i18n/locales/id-ID/workflow.json diff --git a/web/i18n/it-IT/agent-v-2.json b/web/i18n/locales/it-IT/agent-v-2.json similarity index 100% rename from web/i18n/it-IT/agent-v-2.json rename to web/i18n/locales/it-IT/agent-v-2.json diff --git a/web/i18n/it-IT/app-annotation.json b/web/i18n/locales/it-IT/app-annotation.json similarity index 100% rename from web/i18n/it-IT/app-annotation.json rename to web/i18n/locales/it-IT/app-annotation.json diff --git a/web/i18n/it-IT/app-api.json b/web/i18n/locales/it-IT/app-api.json similarity index 100% rename from web/i18n/it-IT/app-api.json rename to web/i18n/locales/it-IT/app-api.json diff --git a/web/i18n/it-IT/app-debug.json b/web/i18n/locales/it-IT/app-debug.json similarity index 100% rename from web/i18n/it-IT/app-debug.json rename to web/i18n/locales/it-IT/app-debug.json diff --git a/web/i18n/it-IT/app-log.json b/web/i18n/locales/it-IT/app-log.json similarity index 100% rename from web/i18n/it-IT/app-log.json rename to web/i18n/locales/it-IT/app-log.json diff --git a/web/i18n/it-IT/app-overview.json b/web/i18n/locales/it-IT/app-overview.json similarity index 100% rename from web/i18n/it-IT/app-overview.json rename to web/i18n/locales/it-IT/app-overview.json diff --git a/web/i18n/it-IT/app.json b/web/i18n/locales/it-IT/app.json similarity index 100% rename from web/i18n/it-IT/app.json rename to web/i18n/locales/it-IT/app.json diff --git a/web/i18n/it-IT/billing.json b/web/i18n/locales/it-IT/billing.json similarity index 100% rename from web/i18n/it-IT/billing.json rename to web/i18n/locales/it-IT/billing.json diff --git a/web/i18n/it-IT/common.json b/web/i18n/locales/it-IT/common.json similarity index 100% rename from web/i18n/it-IT/common.json rename to web/i18n/locales/it-IT/common.json diff --git a/web/i18n/it-IT/custom.json b/web/i18n/locales/it-IT/custom.json similarity index 100% rename from web/i18n/it-IT/custom.json rename to web/i18n/locales/it-IT/custom.json diff --git a/web/i18n/it-IT/dataset-creation.json b/web/i18n/locales/it-IT/dataset-creation.json similarity index 100% rename from web/i18n/it-IT/dataset-creation.json rename to web/i18n/locales/it-IT/dataset-creation.json diff --git a/web/i18n/it-IT/dataset-documents.json b/web/i18n/locales/it-IT/dataset-documents.json similarity index 100% rename from web/i18n/it-IT/dataset-documents.json rename to web/i18n/locales/it-IT/dataset-documents.json diff --git a/web/i18n/it-IT/dataset-hit-testing.json b/web/i18n/locales/it-IT/dataset-hit-testing.json similarity index 100% rename from web/i18n/it-IT/dataset-hit-testing.json rename to web/i18n/locales/it-IT/dataset-hit-testing.json diff --git a/web/i18n/it-IT/dataset-pipeline.json b/web/i18n/locales/it-IT/dataset-pipeline.json similarity index 100% rename from web/i18n/it-IT/dataset-pipeline.json rename to web/i18n/locales/it-IT/dataset-pipeline.json diff --git a/web/i18n/it-IT/dataset-settings.json b/web/i18n/locales/it-IT/dataset-settings.json similarity index 100% rename from web/i18n/it-IT/dataset-settings.json rename to web/i18n/locales/it-IT/dataset-settings.json diff --git a/web/i18n/it-IT/dataset.json b/web/i18n/locales/it-IT/dataset.json similarity index 100% rename from web/i18n/it-IT/dataset.json rename to web/i18n/locales/it-IT/dataset.json diff --git a/web/i18n/it-IT/deployments.json b/web/i18n/locales/it-IT/deployments.json similarity index 100% rename from web/i18n/it-IT/deployments.json rename to web/i18n/locales/it-IT/deployments.json diff --git a/web/i18n/it-IT/device-flow.json b/web/i18n/locales/it-IT/device-flow.json similarity index 100% rename from web/i18n/it-IT/device-flow.json rename to web/i18n/locales/it-IT/device-flow.json diff --git a/web/i18n/it-IT/education.json b/web/i18n/locales/it-IT/education.json similarity index 100% rename from web/i18n/it-IT/education.json rename to web/i18n/locales/it-IT/education.json diff --git a/web/i18n/it-IT/explore.json b/web/i18n/locales/it-IT/explore.json similarity index 100% rename from web/i18n/it-IT/explore.json rename to web/i18n/locales/it-IT/explore.json diff --git a/web/i18n/it-IT/layout.json b/web/i18n/locales/it-IT/layout.json similarity index 100% rename from web/i18n/it-IT/layout.json rename to web/i18n/locales/it-IT/layout.json diff --git a/web/i18n/it-IT/login.json b/web/i18n/locales/it-IT/login.json similarity index 100% rename from web/i18n/it-IT/login.json rename to web/i18n/locales/it-IT/login.json diff --git a/web/i18n/it-IT/oauth.json b/web/i18n/locales/it-IT/oauth.json similarity index 100% rename from web/i18n/it-IT/oauth.json rename to web/i18n/locales/it-IT/oauth.json diff --git a/web/i18n/it-IT/permission-keys.json b/web/i18n/locales/it-IT/permission-keys.json similarity index 100% rename from web/i18n/it-IT/permission-keys.json rename to web/i18n/locales/it-IT/permission-keys.json diff --git a/web/i18n/it-IT/permission.json b/web/i18n/locales/it-IT/permission.json similarity index 100% rename from web/i18n/it-IT/permission.json rename to web/i18n/locales/it-IT/permission.json diff --git a/web/i18n/it-IT/pipeline.json b/web/i18n/locales/it-IT/pipeline.json similarity index 100% rename from web/i18n/it-IT/pipeline.json rename to web/i18n/locales/it-IT/pipeline.json diff --git a/web/i18n/it-IT/plugin-tags.json b/web/i18n/locales/it-IT/plugin-tags.json similarity index 100% rename from web/i18n/it-IT/plugin-tags.json rename to web/i18n/locales/it-IT/plugin-tags.json diff --git a/web/i18n/it-IT/plugin-trigger.json b/web/i18n/locales/it-IT/plugin-trigger.json similarity index 100% rename from web/i18n/it-IT/plugin-trigger.json rename to web/i18n/locales/it-IT/plugin-trigger.json diff --git a/web/i18n/it-IT/plugin.json b/web/i18n/locales/it-IT/plugin.json similarity index 100% rename from web/i18n/it-IT/plugin.json rename to web/i18n/locales/it-IT/plugin.json diff --git a/web/i18n/it-IT/register.json b/web/i18n/locales/it-IT/register.json similarity index 100% rename from web/i18n/it-IT/register.json rename to web/i18n/locales/it-IT/register.json diff --git a/web/i18n/it-IT/run-log.json b/web/i18n/locales/it-IT/run-log.json similarity index 100% rename from web/i18n/it-IT/run-log.json rename to web/i18n/locales/it-IT/run-log.json diff --git a/web/i18n/it-IT/share.json b/web/i18n/locales/it-IT/share.json similarity index 100% rename from web/i18n/it-IT/share.json rename to web/i18n/locales/it-IT/share.json diff --git a/web/i18n/it-IT/skill.json b/web/i18n/locales/it-IT/skill.json similarity index 100% rename from web/i18n/it-IT/skill.json rename to web/i18n/locales/it-IT/skill.json diff --git a/web/i18n/it-IT/snippet.json b/web/i18n/locales/it-IT/snippet.json similarity index 100% rename from web/i18n/it-IT/snippet.json rename to web/i18n/locales/it-IT/snippet.json diff --git a/web/i18n/it-IT/time.json b/web/i18n/locales/it-IT/time.json similarity index 100% rename from web/i18n/it-IT/time.json rename to web/i18n/locales/it-IT/time.json diff --git a/web/i18n/it-IT/tools.json b/web/i18n/locales/it-IT/tools.json similarity index 100% rename from web/i18n/it-IT/tools.json rename to web/i18n/locales/it-IT/tools.json diff --git a/web/i18n/it-IT/workflow.json b/web/i18n/locales/it-IT/workflow.json similarity index 100% rename from web/i18n/it-IT/workflow.json rename to web/i18n/locales/it-IT/workflow.json diff --git a/web/i18n/ja-JP/agent-v-2.json b/web/i18n/locales/ja-JP/agent-v-2.json similarity index 100% rename from web/i18n/ja-JP/agent-v-2.json rename to web/i18n/locales/ja-JP/agent-v-2.json diff --git a/web/i18n/ja-JP/app-annotation.json b/web/i18n/locales/ja-JP/app-annotation.json similarity index 100% rename from web/i18n/ja-JP/app-annotation.json rename to web/i18n/locales/ja-JP/app-annotation.json diff --git a/web/i18n/ja-JP/app-api.json b/web/i18n/locales/ja-JP/app-api.json similarity index 100% rename from web/i18n/ja-JP/app-api.json rename to web/i18n/locales/ja-JP/app-api.json diff --git a/web/i18n/ja-JP/app-debug.json b/web/i18n/locales/ja-JP/app-debug.json similarity index 100% rename from web/i18n/ja-JP/app-debug.json rename to web/i18n/locales/ja-JP/app-debug.json diff --git a/web/i18n/ja-JP/app-log.json b/web/i18n/locales/ja-JP/app-log.json similarity index 100% rename from web/i18n/ja-JP/app-log.json rename to web/i18n/locales/ja-JP/app-log.json diff --git a/web/i18n/ja-JP/app-overview.json b/web/i18n/locales/ja-JP/app-overview.json similarity index 100% rename from web/i18n/ja-JP/app-overview.json rename to web/i18n/locales/ja-JP/app-overview.json diff --git a/web/i18n/ja-JP/app.json b/web/i18n/locales/ja-JP/app.json similarity index 100% rename from web/i18n/ja-JP/app.json rename to web/i18n/locales/ja-JP/app.json diff --git a/web/i18n/ja-JP/billing.json b/web/i18n/locales/ja-JP/billing.json similarity index 100% rename from web/i18n/ja-JP/billing.json rename to web/i18n/locales/ja-JP/billing.json diff --git a/web/i18n/ja-JP/common.json b/web/i18n/locales/ja-JP/common.json similarity index 100% rename from web/i18n/ja-JP/common.json rename to web/i18n/locales/ja-JP/common.json diff --git a/web/i18n/ja-JP/custom.json b/web/i18n/locales/ja-JP/custom.json similarity index 100% rename from web/i18n/ja-JP/custom.json rename to web/i18n/locales/ja-JP/custom.json diff --git a/web/i18n/ja-JP/dataset-creation.json b/web/i18n/locales/ja-JP/dataset-creation.json similarity index 100% rename from web/i18n/ja-JP/dataset-creation.json rename to web/i18n/locales/ja-JP/dataset-creation.json diff --git a/web/i18n/ja-JP/dataset-documents.json b/web/i18n/locales/ja-JP/dataset-documents.json similarity index 100% rename from web/i18n/ja-JP/dataset-documents.json rename to web/i18n/locales/ja-JP/dataset-documents.json diff --git a/web/i18n/ja-JP/dataset-hit-testing.json b/web/i18n/locales/ja-JP/dataset-hit-testing.json similarity index 100% rename from web/i18n/ja-JP/dataset-hit-testing.json rename to web/i18n/locales/ja-JP/dataset-hit-testing.json diff --git a/web/i18n/ja-JP/dataset-pipeline.json b/web/i18n/locales/ja-JP/dataset-pipeline.json similarity index 100% rename from web/i18n/ja-JP/dataset-pipeline.json rename to web/i18n/locales/ja-JP/dataset-pipeline.json diff --git a/web/i18n/ja-JP/dataset-settings.json b/web/i18n/locales/ja-JP/dataset-settings.json similarity index 100% rename from web/i18n/ja-JP/dataset-settings.json rename to web/i18n/locales/ja-JP/dataset-settings.json diff --git a/web/i18n/ja-JP/dataset.json b/web/i18n/locales/ja-JP/dataset.json similarity index 100% rename from web/i18n/ja-JP/dataset.json rename to web/i18n/locales/ja-JP/dataset.json diff --git a/web/i18n/ja-JP/deployments.json b/web/i18n/locales/ja-JP/deployments.json similarity index 100% rename from web/i18n/ja-JP/deployments.json rename to web/i18n/locales/ja-JP/deployments.json diff --git a/web/i18n/ja-JP/device-flow.json b/web/i18n/locales/ja-JP/device-flow.json similarity index 100% rename from web/i18n/ja-JP/device-flow.json rename to web/i18n/locales/ja-JP/device-flow.json diff --git a/web/i18n/ja-JP/education.json b/web/i18n/locales/ja-JP/education.json similarity index 100% rename from web/i18n/ja-JP/education.json rename to web/i18n/locales/ja-JP/education.json diff --git a/web/i18n/ja-JP/explore.json b/web/i18n/locales/ja-JP/explore.json similarity index 100% rename from web/i18n/ja-JP/explore.json rename to web/i18n/locales/ja-JP/explore.json diff --git a/web/i18n/ja-JP/layout.json b/web/i18n/locales/ja-JP/layout.json similarity index 100% rename from web/i18n/ja-JP/layout.json rename to web/i18n/locales/ja-JP/layout.json diff --git a/web/i18n/ja-JP/login.json b/web/i18n/locales/ja-JP/login.json similarity index 100% rename from web/i18n/ja-JP/login.json rename to web/i18n/locales/ja-JP/login.json diff --git a/web/i18n/ja-JP/oauth.json b/web/i18n/locales/ja-JP/oauth.json similarity index 100% rename from web/i18n/ja-JP/oauth.json rename to web/i18n/locales/ja-JP/oauth.json diff --git a/web/i18n/ja-JP/permission-keys.json b/web/i18n/locales/ja-JP/permission-keys.json similarity index 100% rename from web/i18n/ja-JP/permission-keys.json rename to web/i18n/locales/ja-JP/permission-keys.json diff --git a/web/i18n/ja-JP/permission.json b/web/i18n/locales/ja-JP/permission.json similarity index 100% rename from web/i18n/ja-JP/permission.json rename to web/i18n/locales/ja-JP/permission.json diff --git a/web/i18n/ja-JP/pipeline.json b/web/i18n/locales/ja-JP/pipeline.json similarity index 100% rename from web/i18n/ja-JP/pipeline.json rename to web/i18n/locales/ja-JP/pipeline.json diff --git a/web/i18n/ja-JP/plugin-tags.json b/web/i18n/locales/ja-JP/plugin-tags.json similarity index 100% rename from web/i18n/ja-JP/plugin-tags.json rename to web/i18n/locales/ja-JP/plugin-tags.json diff --git a/web/i18n/ja-JP/plugin-trigger.json b/web/i18n/locales/ja-JP/plugin-trigger.json similarity index 100% rename from web/i18n/ja-JP/plugin-trigger.json rename to web/i18n/locales/ja-JP/plugin-trigger.json diff --git a/web/i18n/ja-JP/plugin.json b/web/i18n/locales/ja-JP/plugin.json similarity index 100% rename from web/i18n/ja-JP/plugin.json rename to web/i18n/locales/ja-JP/plugin.json diff --git a/web/i18n/ja-JP/register.json b/web/i18n/locales/ja-JP/register.json similarity index 100% rename from web/i18n/ja-JP/register.json rename to web/i18n/locales/ja-JP/register.json diff --git a/web/i18n/ja-JP/run-log.json b/web/i18n/locales/ja-JP/run-log.json similarity index 100% rename from web/i18n/ja-JP/run-log.json rename to web/i18n/locales/ja-JP/run-log.json diff --git a/web/i18n/ja-JP/share.json b/web/i18n/locales/ja-JP/share.json similarity index 100% rename from web/i18n/ja-JP/share.json rename to web/i18n/locales/ja-JP/share.json diff --git a/web/i18n/ja-JP/skill.json b/web/i18n/locales/ja-JP/skill.json similarity index 100% rename from web/i18n/ja-JP/skill.json rename to web/i18n/locales/ja-JP/skill.json diff --git a/web/i18n/ja-JP/snippet.json b/web/i18n/locales/ja-JP/snippet.json similarity index 100% rename from web/i18n/ja-JP/snippet.json rename to web/i18n/locales/ja-JP/snippet.json diff --git a/web/i18n/ja-JP/time.json b/web/i18n/locales/ja-JP/time.json similarity index 100% rename from web/i18n/ja-JP/time.json rename to web/i18n/locales/ja-JP/time.json diff --git a/web/i18n/ja-JP/tools.json b/web/i18n/locales/ja-JP/tools.json similarity index 100% rename from web/i18n/ja-JP/tools.json rename to web/i18n/locales/ja-JP/tools.json diff --git a/web/i18n/ja-JP/workflow.json b/web/i18n/locales/ja-JP/workflow.json similarity index 100% rename from web/i18n/ja-JP/workflow.json rename to web/i18n/locales/ja-JP/workflow.json diff --git a/web/i18n/ko-KR/agent-v-2.json b/web/i18n/locales/ko-KR/agent-v-2.json similarity index 100% rename from web/i18n/ko-KR/agent-v-2.json rename to web/i18n/locales/ko-KR/agent-v-2.json diff --git a/web/i18n/ko-KR/app-annotation.json b/web/i18n/locales/ko-KR/app-annotation.json similarity index 100% rename from web/i18n/ko-KR/app-annotation.json rename to web/i18n/locales/ko-KR/app-annotation.json diff --git a/web/i18n/ko-KR/app-api.json b/web/i18n/locales/ko-KR/app-api.json similarity index 100% rename from web/i18n/ko-KR/app-api.json rename to web/i18n/locales/ko-KR/app-api.json diff --git a/web/i18n/ko-KR/app-debug.json b/web/i18n/locales/ko-KR/app-debug.json similarity index 100% rename from web/i18n/ko-KR/app-debug.json rename to web/i18n/locales/ko-KR/app-debug.json diff --git a/web/i18n/ko-KR/app-log.json b/web/i18n/locales/ko-KR/app-log.json similarity index 100% rename from web/i18n/ko-KR/app-log.json rename to web/i18n/locales/ko-KR/app-log.json diff --git a/web/i18n/ko-KR/app-overview.json b/web/i18n/locales/ko-KR/app-overview.json similarity index 100% rename from web/i18n/ko-KR/app-overview.json rename to web/i18n/locales/ko-KR/app-overview.json diff --git a/web/i18n/ko-KR/app.json b/web/i18n/locales/ko-KR/app.json similarity index 100% rename from web/i18n/ko-KR/app.json rename to web/i18n/locales/ko-KR/app.json diff --git a/web/i18n/ko-KR/billing.json b/web/i18n/locales/ko-KR/billing.json similarity index 100% rename from web/i18n/ko-KR/billing.json rename to web/i18n/locales/ko-KR/billing.json diff --git a/web/i18n/ko-KR/common.json b/web/i18n/locales/ko-KR/common.json similarity index 100% rename from web/i18n/ko-KR/common.json rename to web/i18n/locales/ko-KR/common.json diff --git a/web/i18n/ko-KR/custom.json b/web/i18n/locales/ko-KR/custom.json similarity index 100% rename from web/i18n/ko-KR/custom.json rename to web/i18n/locales/ko-KR/custom.json diff --git a/web/i18n/ko-KR/dataset-creation.json b/web/i18n/locales/ko-KR/dataset-creation.json similarity index 100% rename from web/i18n/ko-KR/dataset-creation.json rename to web/i18n/locales/ko-KR/dataset-creation.json diff --git a/web/i18n/ko-KR/dataset-documents.json b/web/i18n/locales/ko-KR/dataset-documents.json similarity index 100% rename from web/i18n/ko-KR/dataset-documents.json rename to web/i18n/locales/ko-KR/dataset-documents.json diff --git a/web/i18n/ko-KR/dataset-hit-testing.json b/web/i18n/locales/ko-KR/dataset-hit-testing.json similarity index 100% rename from web/i18n/ko-KR/dataset-hit-testing.json rename to web/i18n/locales/ko-KR/dataset-hit-testing.json diff --git a/web/i18n/ko-KR/dataset-pipeline.json b/web/i18n/locales/ko-KR/dataset-pipeline.json similarity index 100% rename from web/i18n/ko-KR/dataset-pipeline.json rename to web/i18n/locales/ko-KR/dataset-pipeline.json diff --git a/web/i18n/ko-KR/dataset-settings.json b/web/i18n/locales/ko-KR/dataset-settings.json similarity index 100% rename from web/i18n/ko-KR/dataset-settings.json rename to web/i18n/locales/ko-KR/dataset-settings.json diff --git a/web/i18n/ko-KR/dataset.json b/web/i18n/locales/ko-KR/dataset.json similarity index 100% rename from web/i18n/ko-KR/dataset.json rename to web/i18n/locales/ko-KR/dataset.json diff --git a/web/i18n/ko-KR/deployments.json b/web/i18n/locales/ko-KR/deployments.json similarity index 100% rename from web/i18n/ko-KR/deployments.json rename to web/i18n/locales/ko-KR/deployments.json diff --git a/web/i18n/ko-KR/device-flow.json b/web/i18n/locales/ko-KR/device-flow.json similarity index 100% rename from web/i18n/ko-KR/device-flow.json rename to web/i18n/locales/ko-KR/device-flow.json diff --git a/web/i18n/ko-KR/education.json b/web/i18n/locales/ko-KR/education.json similarity index 100% rename from web/i18n/ko-KR/education.json rename to web/i18n/locales/ko-KR/education.json diff --git a/web/i18n/ko-KR/explore.json b/web/i18n/locales/ko-KR/explore.json similarity index 100% rename from web/i18n/ko-KR/explore.json rename to web/i18n/locales/ko-KR/explore.json diff --git a/web/i18n/ko-KR/layout.json b/web/i18n/locales/ko-KR/layout.json similarity index 100% rename from web/i18n/ko-KR/layout.json rename to web/i18n/locales/ko-KR/layout.json diff --git a/web/i18n/ko-KR/login.json b/web/i18n/locales/ko-KR/login.json similarity index 100% rename from web/i18n/ko-KR/login.json rename to web/i18n/locales/ko-KR/login.json diff --git a/web/i18n/ko-KR/oauth.json b/web/i18n/locales/ko-KR/oauth.json similarity index 100% rename from web/i18n/ko-KR/oauth.json rename to web/i18n/locales/ko-KR/oauth.json diff --git a/web/i18n/ko-KR/permission-keys.json b/web/i18n/locales/ko-KR/permission-keys.json similarity index 100% rename from web/i18n/ko-KR/permission-keys.json rename to web/i18n/locales/ko-KR/permission-keys.json diff --git a/web/i18n/ko-KR/permission.json b/web/i18n/locales/ko-KR/permission.json similarity index 100% rename from web/i18n/ko-KR/permission.json rename to web/i18n/locales/ko-KR/permission.json diff --git a/web/i18n/ko-KR/pipeline.json b/web/i18n/locales/ko-KR/pipeline.json similarity index 100% rename from web/i18n/ko-KR/pipeline.json rename to web/i18n/locales/ko-KR/pipeline.json diff --git a/web/i18n/ko-KR/plugin-tags.json b/web/i18n/locales/ko-KR/plugin-tags.json similarity index 100% rename from web/i18n/ko-KR/plugin-tags.json rename to web/i18n/locales/ko-KR/plugin-tags.json diff --git a/web/i18n/ko-KR/plugin-trigger.json b/web/i18n/locales/ko-KR/plugin-trigger.json similarity index 100% rename from web/i18n/ko-KR/plugin-trigger.json rename to web/i18n/locales/ko-KR/plugin-trigger.json diff --git a/web/i18n/ko-KR/plugin.json b/web/i18n/locales/ko-KR/plugin.json similarity index 100% rename from web/i18n/ko-KR/plugin.json rename to web/i18n/locales/ko-KR/plugin.json diff --git a/web/i18n/ko-KR/register.json b/web/i18n/locales/ko-KR/register.json similarity index 100% rename from web/i18n/ko-KR/register.json rename to web/i18n/locales/ko-KR/register.json diff --git a/web/i18n/ko-KR/run-log.json b/web/i18n/locales/ko-KR/run-log.json similarity index 100% rename from web/i18n/ko-KR/run-log.json rename to web/i18n/locales/ko-KR/run-log.json diff --git a/web/i18n/ko-KR/share.json b/web/i18n/locales/ko-KR/share.json similarity index 100% rename from web/i18n/ko-KR/share.json rename to web/i18n/locales/ko-KR/share.json diff --git a/web/i18n/ko-KR/skill.json b/web/i18n/locales/ko-KR/skill.json similarity index 100% rename from web/i18n/ko-KR/skill.json rename to web/i18n/locales/ko-KR/skill.json diff --git a/web/i18n/ko-KR/snippet.json b/web/i18n/locales/ko-KR/snippet.json similarity index 100% rename from web/i18n/ko-KR/snippet.json rename to web/i18n/locales/ko-KR/snippet.json diff --git a/web/i18n/ko-KR/time.json b/web/i18n/locales/ko-KR/time.json similarity index 100% rename from web/i18n/ko-KR/time.json rename to web/i18n/locales/ko-KR/time.json diff --git a/web/i18n/ko-KR/tools.json b/web/i18n/locales/ko-KR/tools.json similarity index 100% rename from web/i18n/ko-KR/tools.json rename to web/i18n/locales/ko-KR/tools.json diff --git a/web/i18n/ko-KR/workflow.json b/web/i18n/locales/ko-KR/workflow.json similarity index 100% rename from web/i18n/ko-KR/workflow.json rename to web/i18n/locales/ko-KR/workflow.json diff --git a/web/i18n/lo-LA/agent-v-2.json b/web/i18n/locales/lo-LA/agent-v-2.json similarity index 100% rename from web/i18n/lo-LA/agent-v-2.json rename to web/i18n/locales/lo-LA/agent-v-2.json diff --git a/web/i18n/lo-LA/app-annotation.json b/web/i18n/locales/lo-LA/app-annotation.json similarity index 100% rename from web/i18n/lo-LA/app-annotation.json rename to web/i18n/locales/lo-LA/app-annotation.json diff --git a/web/i18n/lo-LA/app-api.json b/web/i18n/locales/lo-LA/app-api.json similarity index 100% rename from web/i18n/lo-LA/app-api.json rename to web/i18n/locales/lo-LA/app-api.json diff --git a/web/i18n/lo-LA/app-debug.json b/web/i18n/locales/lo-LA/app-debug.json similarity index 100% rename from web/i18n/lo-LA/app-debug.json rename to web/i18n/locales/lo-LA/app-debug.json diff --git a/web/i18n/lo-LA/app-log.json b/web/i18n/locales/lo-LA/app-log.json similarity index 100% rename from web/i18n/lo-LA/app-log.json rename to web/i18n/locales/lo-LA/app-log.json diff --git a/web/i18n/lo-LA/app-overview.json b/web/i18n/locales/lo-LA/app-overview.json similarity index 100% rename from web/i18n/lo-LA/app-overview.json rename to web/i18n/locales/lo-LA/app-overview.json diff --git a/web/i18n/lo-LA/app.json b/web/i18n/locales/lo-LA/app.json similarity index 100% rename from web/i18n/lo-LA/app.json rename to web/i18n/locales/lo-LA/app.json diff --git a/web/i18n/lo-LA/billing.json b/web/i18n/locales/lo-LA/billing.json similarity index 100% rename from web/i18n/lo-LA/billing.json rename to web/i18n/locales/lo-LA/billing.json diff --git a/web/i18n/lo-LA/common.json b/web/i18n/locales/lo-LA/common.json similarity index 100% rename from web/i18n/lo-LA/common.json rename to web/i18n/locales/lo-LA/common.json diff --git a/web/i18n/lo-LA/custom.json b/web/i18n/locales/lo-LA/custom.json similarity index 100% rename from web/i18n/lo-LA/custom.json rename to web/i18n/locales/lo-LA/custom.json diff --git a/web/i18n/lo-LA/dataset-creation.json b/web/i18n/locales/lo-LA/dataset-creation.json similarity index 100% rename from web/i18n/lo-LA/dataset-creation.json rename to web/i18n/locales/lo-LA/dataset-creation.json diff --git a/web/i18n/lo-LA/dataset-documents.json b/web/i18n/locales/lo-LA/dataset-documents.json similarity index 100% rename from web/i18n/lo-LA/dataset-documents.json rename to web/i18n/locales/lo-LA/dataset-documents.json diff --git a/web/i18n/lo-LA/dataset-hit-testing.json b/web/i18n/locales/lo-LA/dataset-hit-testing.json similarity index 100% rename from web/i18n/lo-LA/dataset-hit-testing.json rename to web/i18n/locales/lo-LA/dataset-hit-testing.json diff --git a/web/i18n/lo-LA/dataset-pipeline.json b/web/i18n/locales/lo-LA/dataset-pipeline.json similarity index 100% rename from web/i18n/lo-LA/dataset-pipeline.json rename to web/i18n/locales/lo-LA/dataset-pipeline.json diff --git a/web/i18n/lo-LA/dataset-settings.json b/web/i18n/locales/lo-LA/dataset-settings.json similarity index 100% rename from web/i18n/lo-LA/dataset-settings.json rename to web/i18n/locales/lo-LA/dataset-settings.json diff --git a/web/i18n/lo-LA/dataset.json b/web/i18n/locales/lo-LA/dataset.json similarity index 100% rename from web/i18n/lo-LA/dataset.json rename to web/i18n/locales/lo-LA/dataset.json diff --git a/web/i18n/lo-LA/deployments.json b/web/i18n/locales/lo-LA/deployments.json similarity index 100% rename from web/i18n/lo-LA/deployments.json rename to web/i18n/locales/lo-LA/deployments.json diff --git a/web/i18n/lo-LA/device-flow.json b/web/i18n/locales/lo-LA/device-flow.json similarity index 100% rename from web/i18n/lo-LA/device-flow.json rename to web/i18n/locales/lo-LA/device-flow.json diff --git a/web/i18n/lo-LA/education.json b/web/i18n/locales/lo-LA/education.json similarity index 100% rename from web/i18n/lo-LA/education.json rename to web/i18n/locales/lo-LA/education.json diff --git a/web/i18n/lo-LA/explore.json b/web/i18n/locales/lo-LA/explore.json similarity index 100% rename from web/i18n/lo-LA/explore.json rename to web/i18n/locales/lo-LA/explore.json diff --git a/web/i18n/lo-LA/layout.json b/web/i18n/locales/lo-LA/layout.json similarity index 100% rename from web/i18n/lo-LA/layout.json rename to web/i18n/locales/lo-LA/layout.json diff --git a/web/i18n/lo-LA/login.json b/web/i18n/locales/lo-LA/login.json similarity index 100% rename from web/i18n/lo-LA/login.json rename to web/i18n/locales/lo-LA/login.json diff --git a/web/i18n/lo-LA/oauth.json b/web/i18n/locales/lo-LA/oauth.json similarity index 100% rename from web/i18n/lo-LA/oauth.json rename to web/i18n/locales/lo-LA/oauth.json diff --git a/web/i18n/lo-LA/permission-keys.json b/web/i18n/locales/lo-LA/permission-keys.json similarity index 100% rename from web/i18n/lo-LA/permission-keys.json rename to web/i18n/locales/lo-LA/permission-keys.json diff --git a/web/i18n/lo-LA/permission.json b/web/i18n/locales/lo-LA/permission.json similarity index 100% rename from web/i18n/lo-LA/permission.json rename to web/i18n/locales/lo-LA/permission.json diff --git a/web/i18n/lo-LA/pipeline.json b/web/i18n/locales/lo-LA/pipeline.json similarity index 100% rename from web/i18n/lo-LA/pipeline.json rename to web/i18n/locales/lo-LA/pipeline.json diff --git a/web/i18n/lo-LA/plugin-tags.json b/web/i18n/locales/lo-LA/plugin-tags.json similarity index 100% rename from web/i18n/lo-LA/plugin-tags.json rename to web/i18n/locales/lo-LA/plugin-tags.json diff --git a/web/i18n/lo-LA/plugin-trigger.json b/web/i18n/locales/lo-LA/plugin-trigger.json similarity index 100% rename from web/i18n/lo-LA/plugin-trigger.json rename to web/i18n/locales/lo-LA/plugin-trigger.json diff --git a/web/i18n/lo-LA/plugin.json b/web/i18n/locales/lo-LA/plugin.json similarity index 100% rename from web/i18n/lo-LA/plugin.json rename to web/i18n/locales/lo-LA/plugin.json diff --git a/web/i18n/lo-LA/register.json b/web/i18n/locales/lo-LA/register.json similarity index 100% rename from web/i18n/lo-LA/register.json rename to web/i18n/locales/lo-LA/register.json diff --git a/web/i18n/lo-LA/run-log.json b/web/i18n/locales/lo-LA/run-log.json similarity index 100% rename from web/i18n/lo-LA/run-log.json rename to web/i18n/locales/lo-LA/run-log.json diff --git a/web/i18n/lo-LA/share.json b/web/i18n/locales/lo-LA/share.json similarity index 100% rename from web/i18n/lo-LA/share.json rename to web/i18n/locales/lo-LA/share.json diff --git a/web/i18n/lo-LA/skill.json b/web/i18n/locales/lo-LA/skill.json similarity index 100% rename from web/i18n/lo-LA/skill.json rename to web/i18n/locales/lo-LA/skill.json diff --git a/web/i18n/lo-LA/snippet.json b/web/i18n/locales/lo-LA/snippet.json similarity index 100% rename from web/i18n/lo-LA/snippet.json rename to web/i18n/locales/lo-LA/snippet.json diff --git a/web/i18n/lo-LA/time.json b/web/i18n/locales/lo-LA/time.json similarity index 100% rename from web/i18n/lo-LA/time.json rename to web/i18n/locales/lo-LA/time.json diff --git a/web/i18n/lo-LA/tools.json b/web/i18n/locales/lo-LA/tools.json similarity index 100% rename from web/i18n/lo-LA/tools.json rename to web/i18n/locales/lo-LA/tools.json diff --git a/web/i18n/lo-LA/workflow.json b/web/i18n/locales/lo-LA/workflow.json similarity index 100% rename from web/i18n/lo-LA/workflow.json rename to web/i18n/locales/lo-LA/workflow.json diff --git a/web/i18n/nl-NL/agent-v-2.json b/web/i18n/locales/nl-NL/agent-v-2.json similarity index 100% rename from web/i18n/nl-NL/agent-v-2.json rename to web/i18n/locales/nl-NL/agent-v-2.json diff --git a/web/i18n/nl-NL/app-annotation.json b/web/i18n/locales/nl-NL/app-annotation.json similarity index 100% rename from web/i18n/nl-NL/app-annotation.json rename to web/i18n/locales/nl-NL/app-annotation.json diff --git a/web/i18n/nl-NL/app-api.json b/web/i18n/locales/nl-NL/app-api.json similarity index 100% rename from web/i18n/nl-NL/app-api.json rename to web/i18n/locales/nl-NL/app-api.json diff --git a/web/i18n/nl-NL/app-debug.json b/web/i18n/locales/nl-NL/app-debug.json similarity index 100% rename from web/i18n/nl-NL/app-debug.json rename to web/i18n/locales/nl-NL/app-debug.json diff --git a/web/i18n/nl-NL/app-log.json b/web/i18n/locales/nl-NL/app-log.json similarity index 100% rename from web/i18n/nl-NL/app-log.json rename to web/i18n/locales/nl-NL/app-log.json diff --git a/web/i18n/nl-NL/app-overview.json b/web/i18n/locales/nl-NL/app-overview.json similarity index 100% rename from web/i18n/nl-NL/app-overview.json rename to web/i18n/locales/nl-NL/app-overview.json diff --git a/web/i18n/nl-NL/app.json b/web/i18n/locales/nl-NL/app.json similarity index 100% rename from web/i18n/nl-NL/app.json rename to web/i18n/locales/nl-NL/app.json diff --git a/web/i18n/nl-NL/billing.json b/web/i18n/locales/nl-NL/billing.json similarity index 100% rename from web/i18n/nl-NL/billing.json rename to web/i18n/locales/nl-NL/billing.json diff --git a/web/i18n/nl-NL/common.json b/web/i18n/locales/nl-NL/common.json similarity index 100% rename from web/i18n/nl-NL/common.json rename to web/i18n/locales/nl-NL/common.json diff --git a/web/i18n/nl-NL/custom.json b/web/i18n/locales/nl-NL/custom.json similarity index 100% rename from web/i18n/nl-NL/custom.json rename to web/i18n/locales/nl-NL/custom.json diff --git a/web/i18n/nl-NL/dataset-creation.json b/web/i18n/locales/nl-NL/dataset-creation.json similarity index 100% rename from web/i18n/nl-NL/dataset-creation.json rename to web/i18n/locales/nl-NL/dataset-creation.json diff --git a/web/i18n/nl-NL/dataset-documents.json b/web/i18n/locales/nl-NL/dataset-documents.json similarity index 100% rename from web/i18n/nl-NL/dataset-documents.json rename to web/i18n/locales/nl-NL/dataset-documents.json diff --git a/web/i18n/nl-NL/dataset-hit-testing.json b/web/i18n/locales/nl-NL/dataset-hit-testing.json similarity index 100% rename from web/i18n/nl-NL/dataset-hit-testing.json rename to web/i18n/locales/nl-NL/dataset-hit-testing.json diff --git a/web/i18n/nl-NL/dataset-pipeline.json b/web/i18n/locales/nl-NL/dataset-pipeline.json similarity index 100% rename from web/i18n/nl-NL/dataset-pipeline.json rename to web/i18n/locales/nl-NL/dataset-pipeline.json diff --git a/web/i18n/nl-NL/dataset-settings.json b/web/i18n/locales/nl-NL/dataset-settings.json similarity index 100% rename from web/i18n/nl-NL/dataset-settings.json rename to web/i18n/locales/nl-NL/dataset-settings.json diff --git a/web/i18n/nl-NL/dataset.json b/web/i18n/locales/nl-NL/dataset.json similarity index 100% rename from web/i18n/nl-NL/dataset.json rename to web/i18n/locales/nl-NL/dataset.json diff --git a/web/i18n/nl-NL/deployments.json b/web/i18n/locales/nl-NL/deployments.json similarity index 100% rename from web/i18n/nl-NL/deployments.json rename to web/i18n/locales/nl-NL/deployments.json diff --git a/web/i18n/nl-NL/device-flow.json b/web/i18n/locales/nl-NL/device-flow.json similarity index 100% rename from web/i18n/nl-NL/device-flow.json rename to web/i18n/locales/nl-NL/device-flow.json diff --git a/web/i18n/nl-NL/education.json b/web/i18n/locales/nl-NL/education.json similarity index 100% rename from web/i18n/nl-NL/education.json rename to web/i18n/locales/nl-NL/education.json diff --git a/web/i18n/nl-NL/explore.json b/web/i18n/locales/nl-NL/explore.json similarity index 100% rename from web/i18n/nl-NL/explore.json rename to web/i18n/locales/nl-NL/explore.json diff --git a/web/i18n/nl-NL/layout.json b/web/i18n/locales/nl-NL/layout.json similarity index 100% rename from web/i18n/nl-NL/layout.json rename to web/i18n/locales/nl-NL/layout.json diff --git a/web/i18n/nl-NL/login.json b/web/i18n/locales/nl-NL/login.json similarity index 100% rename from web/i18n/nl-NL/login.json rename to web/i18n/locales/nl-NL/login.json diff --git a/web/i18n/nl-NL/oauth.json b/web/i18n/locales/nl-NL/oauth.json similarity index 100% rename from web/i18n/nl-NL/oauth.json rename to web/i18n/locales/nl-NL/oauth.json diff --git a/web/i18n/nl-NL/permission-keys.json b/web/i18n/locales/nl-NL/permission-keys.json similarity index 100% rename from web/i18n/nl-NL/permission-keys.json rename to web/i18n/locales/nl-NL/permission-keys.json diff --git a/web/i18n/nl-NL/permission.json b/web/i18n/locales/nl-NL/permission.json similarity index 100% rename from web/i18n/nl-NL/permission.json rename to web/i18n/locales/nl-NL/permission.json diff --git a/web/i18n/nl-NL/pipeline.json b/web/i18n/locales/nl-NL/pipeline.json similarity index 100% rename from web/i18n/nl-NL/pipeline.json rename to web/i18n/locales/nl-NL/pipeline.json diff --git a/web/i18n/nl-NL/plugin-tags.json b/web/i18n/locales/nl-NL/plugin-tags.json similarity index 100% rename from web/i18n/nl-NL/plugin-tags.json rename to web/i18n/locales/nl-NL/plugin-tags.json diff --git a/web/i18n/nl-NL/plugin-trigger.json b/web/i18n/locales/nl-NL/plugin-trigger.json similarity index 100% rename from web/i18n/nl-NL/plugin-trigger.json rename to web/i18n/locales/nl-NL/plugin-trigger.json diff --git a/web/i18n/nl-NL/plugin.json b/web/i18n/locales/nl-NL/plugin.json similarity index 100% rename from web/i18n/nl-NL/plugin.json rename to web/i18n/locales/nl-NL/plugin.json diff --git a/web/i18n/nl-NL/register.json b/web/i18n/locales/nl-NL/register.json similarity index 100% rename from web/i18n/nl-NL/register.json rename to web/i18n/locales/nl-NL/register.json diff --git a/web/i18n/nl-NL/run-log.json b/web/i18n/locales/nl-NL/run-log.json similarity index 100% rename from web/i18n/nl-NL/run-log.json rename to web/i18n/locales/nl-NL/run-log.json diff --git a/web/i18n/nl-NL/share.json b/web/i18n/locales/nl-NL/share.json similarity index 100% rename from web/i18n/nl-NL/share.json rename to web/i18n/locales/nl-NL/share.json diff --git a/web/i18n/nl-NL/skill.json b/web/i18n/locales/nl-NL/skill.json similarity index 100% rename from web/i18n/nl-NL/skill.json rename to web/i18n/locales/nl-NL/skill.json diff --git a/web/i18n/nl-NL/snippet.json b/web/i18n/locales/nl-NL/snippet.json similarity index 100% rename from web/i18n/nl-NL/snippet.json rename to web/i18n/locales/nl-NL/snippet.json diff --git a/web/i18n/nl-NL/time.json b/web/i18n/locales/nl-NL/time.json similarity index 100% rename from web/i18n/nl-NL/time.json rename to web/i18n/locales/nl-NL/time.json diff --git a/web/i18n/nl-NL/tools.json b/web/i18n/locales/nl-NL/tools.json similarity index 100% rename from web/i18n/nl-NL/tools.json rename to web/i18n/locales/nl-NL/tools.json diff --git a/web/i18n/nl-NL/workflow.json b/web/i18n/locales/nl-NL/workflow.json similarity index 100% rename from web/i18n/nl-NL/workflow.json rename to web/i18n/locales/nl-NL/workflow.json diff --git a/web/i18n/pl-PL/agent-v-2.json b/web/i18n/locales/pl-PL/agent-v-2.json similarity index 100% rename from web/i18n/pl-PL/agent-v-2.json rename to web/i18n/locales/pl-PL/agent-v-2.json diff --git a/web/i18n/pl-PL/app-annotation.json b/web/i18n/locales/pl-PL/app-annotation.json similarity index 100% rename from web/i18n/pl-PL/app-annotation.json rename to web/i18n/locales/pl-PL/app-annotation.json diff --git a/web/i18n/pl-PL/app-api.json b/web/i18n/locales/pl-PL/app-api.json similarity index 100% rename from web/i18n/pl-PL/app-api.json rename to web/i18n/locales/pl-PL/app-api.json diff --git a/web/i18n/pl-PL/app-debug.json b/web/i18n/locales/pl-PL/app-debug.json similarity index 100% rename from web/i18n/pl-PL/app-debug.json rename to web/i18n/locales/pl-PL/app-debug.json diff --git a/web/i18n/pl-PL/app-log.json b/web/i18n/locales/pl-PL/app-log.json similarity index 100% rename from web/i18n/pl-PL/app-log.json rename to web/i18n/locales/pl-PL/app-log.json diff --git a/web/i18n/pl-PL/app-overview.json b/web/i18n/locales/pl-PL/app-overview.json similarity index 100% rename from web/i18n/pl-PL/app-overview.json rename to web/i18n/locales/pl-PL/app-overview.json diff --git a/web/i18n/pl-PL/app.json b/web/i18n/locales/pl-PL/app.json similarity index 100% rename from web/i18n/pl-PL/app.json rename to web/i18n/locales/pl-PL/app.json diff --git a/web/i18n/pl-PL/billing.json b/web/i18n/locales/pl-PL/billing.json similarity index 100% rename from web/i18n/pl-PL/billing.json rename to web/i18n/locales/pl-PL/billing.json diff --git a/web/i18n/pl-PL/common.json b/web/i18n/locales/pl-PL/common.json similarity index 100% rename from web/i18n/pl-PL/common.json rename to web/i18n/locales/pl-PL/common.json diff --git a/web/i18n/pl-PL/custom.json b/web/i18n/locales/pl-PL/custom.json similarity index 100% rename from web/i18n/pl-PL/custom.json rename to web/i18n/locales/pl-PL/custom.json diff --git a/web/i18n/pl-PL/dataset-creation.json b/web/i18n/locales/pl-PL/dataset-creation.json similarity index 100% rename from web/i18n/pl-PL/dataset-creation.json rename to web/i18n/locales/pl-PL/dataset-creation.json diff --git a/web/i18n/pl-PL/dataset-documents.json b/web/i18n/locales/pl-PL/dataset-documents.json similarity index 100% rename from web/i18n/pl-PL/dataset-documents.json rename to web/i18n/locales/pl-PL/dataset-documents.json diff --git a/web/i18n/pl-PL/dataset-hit-testing.json b/web/i18n/locales/pl-PL/dataset-hit-testing.json similarity index 100% rename from web/i18n/pl-PL/dataset-hit-testing.json rename to web/i18n/locales/pl-PL/dataset-hit-testing.json diff --git a/web/i18n/pl-PL/dataset-pipeline.json b/web/i18n/locales/pl-PL/dataset-pipeline.json similarity index 100% rename from web/i18n/pl-PL/dataset-pipeline.json rename to web/i18n/locales/pl-PL/dataset-pipeline.json diff --git a/web/i18n/pl-PL/dataset-settings.json b/web/i18n/locales/pl-PL/dataset-settings.json similarity index 100% rename from web/i18n/pl-PL/dataset-settings.json rename to web/i18n/locales/pl-PL/dataset-settings.json diff --git a/web/i18n/pl-PL/dataset.json b/web/i18n/locales/pl-PL/dataset.json similarity index 100% rename from web/i18n/pl-PL/dataset.json rename to web/i18n/locales/pl-PL/dataset.json diff --git a/web/i18n/pl-PL/deployments.json b/web/i18n/locales/pl-PL/deployments.json similarity index 100% rename from web/i18n/pl-PL/deployments.json rename to web/i18n/locales/pl-PL/deployments.json diff --git a/web/i18n/pl-PL/device-flow.json b/web/i18n/locales/pl-PL/device-flow.json similarity index 100% rename from web/i18n/pl-PL/device-flow.json rename to web/i18n/locales/pl-PL/device-flow.json diff --git a/web/i18n/pl-PL/education.json b/web/i18n/locales/pl-PL/education.json similarity index 100% rename from web/i18n/pl-PL/education.json rename to web/i18n/locales/pl-PL/education.json diff --git a/web/i18n/pl-PL/explore.json b/web/i18n/locales/pl-PL/explore.json similarity index 100% rename from web/i18n/pl-PL/explore.json rename to web/i18n/locales/pl-PL/explore.json diff --git a/web/i18n/pl-PL/layout.json b/web/i18n/locales/pl-PL/layout.json similarity index 100% rename from web/i18n/pl-PL/layout.json rename to web/i18n/locales/pl-PL/layout.json diff --git a/web/i18n/pl-PL/login.json b/web/i18n/locales/pl-PL/login.json similarity index 100% rename from web/i18n/pl-PL/login.json rename to web/i18n/locales/pl-PL/login.json diff --git a/web/i18n/pl-PL/oauth.json b/web/i18n/locales/pl-PL/oauth.json similarity index 100% rename from web/i18n/pl-PL/oauth.json rename to web/i18n/locales/pl-PL/oauth.json diff --git a/web/i18n/pl-PL/permission-keys.json b/web/i18n/locales/pl-PL/permission-keys.json similarity index 100% rename from web/i18n/pl-PL/permission-keys.json rename to web/i18n/locales/pl-PL/permission-keys.json diff --git a/web/i18n/pl-PL/permission.json b/web/i18n/locales/pl-PL/permission.json similarity index 100% rename from web/i18n/pl-PL/permission.json rename to web/i18n/locales/pl-PL/permission.json diff --git a/web/i18n/pl-PL/pipeline.json b/web/i18n/locales/pl-PL/pipeline.json similarity index 100% rename from web/i18n/pl-PL/pipeline.json rename to web/i18n/locales/pl-PL/pipeline.json diff --git a/web/i18n/pl-PL/plugin-tags.json b/web/i18n/locales/pl-PL/plugin-tags.json similarity index 100% rename from web/i18n/pl-PL/plugin-tags.json rename to web/i18n/locales/pl-PL/plugin-tags.json diff --git a/web/i18n/pl-PL/plugin-trigger.json b/web/i18n/locales/pl-PL/plugin-trigger.json similarity index 100% rename from web/i18n/pl-PL/plugin-trigger.json rename to web/i18n/locales/pl-PL/plugin-trigger.json diff --git a/web/i18n/pl-PL/plugin.json b/web/i18n/locales/pl-PL/plugin.json similarity index 100% rename from web/i18n/pl-PL/plugin.json rename to web/i18n/locales/pl-PL/plugin.json diff --git a/web/i18n/pl-PL/register.json b/web/i18n/locales/pl-PL/register.json similarity index 100% rename from web/i18n/pl-PL/register.json rename to web/i18n/locales/pl-PL/register.json diff --git a/web/i18n/pl-PL/run-log.json b/web/i18n/locales/pl-PL/run-log.json similarity index 100% rename from web/i18n/pl-PL/run-log.json rename to web/i18n/locales/pl-PL/run-log.json diff --git a/web/i18n/pl-PL/share.json b/web/i18n/locales/pl-PL/share.json similarity index 100% rename from web/i18n/pl-PL/share.json rename to web/i18n/locales/pl-PL/share.json diff --git a/web/i18n/pl-PL/skill.json b/web/i18n/locales/pl-PL/skill.json similarity index 100% rename from web/i18n/pl-PL/skill.json rename to web/i18n/locales/pl-PL/skill.json diff --git a/web/i18n/pl-PL/snippet.json b/web/i18n/locales/pl-PL/snippet.json similarity index 100% rename from web/i18n/pl-PL/snippet.json rename to web/i18n/locales/pl-PL/snippet.json diff --git a/web/i18n/pl-PL/time.json b/web/i18n/locales/pl-PL/time.json similarity index 100% rename from web/i18n/pl-PL/time.json rename to web/i18n/locales/pl-PL/time.json diff --git a/web/i18n/pl-PL/tools.json b/web/i18n/locales/pl-PL/tools.json similarity index 100% rename from web/i18n/pl-PL/tools.json rename to web/i18n/locales/pl-PL/tools.json diff --git a/web/i18n/pl-PL/workflow.json b/web/i18n/locales/pl-PL/workflow.json similarity index 100% rename from web/i18n/pl-PL/workflow.json rename to web/i18n/locales/pl-PL/workflow.json diff --git a/web/i18n/pt-BR/agent-v-2.json b/web/i18n/locales/pt-BR/agent-v-2.json similarity index 100% rename from web/i18n/pt-BR/agent-v-2.json rename to web/i18n/locales/pt-BR/agent-v-2.json diff --git a/web/i18n/pt-BR/app-annotation.json b/web/i18n/locales/pt-BR/app-annotation.json similarity index 100% rename from web/i18n/pt-BR/app-annotation.json rename to web/i18n/locales/pt-BR/app-annotation.json diff --git a/web/i18n/pt-BR/app-api.json b/web/i18n/locales/pt-BR/app-api.json similarity index 100% rename from web/i18n/pt-BR/app-api.json rename to web/i18n/locales/pt-BR/app-api.json diff --git a/web/i18n/pt-BR/app-debug.json b/web/i18n/locales/pt-BR/app-debug.json similarity index 100% rename from web/i18n/pt-BR/app-debug.json rename to web/i18n/locales/pt-BR/app-debug.json diff --git a/web/i18n/pt-BR/app-log.json b/web/i18n/locales/pt-BR/app-log.json similarity index 100% rename from web/i18n/pt-BR/app-log.json rename to web/i18n/locales/pt-BR/app-log.json diff --git a/web/i18n/pt-BR/app-overview.json b/web/i18n/locales/pt-BR/app-overview.json similarity index 100% rename from web/i18n/pt-BR/app-overview.json rename to web/i18n/locales/pt-BR/app-overview.json diff --git a/web/i18n/pt-BR/app.json b/web/i18n/locales/pt-BR/app.json similarity index 100% rename from web/i18n/pt-BR/app.json rename to web/i18n/locales/pt-BR/app.json diff --git a/web/i18n/pt-BR/billing.json b/web/i18n/locales/pt-BR/billing.json similarity index 100% rename from web/i18n/pt-BR/billing.json rename to web/i18n/locales/pt-BR/billing.json diff --git a/web/i18n/pt-BR/common.json b/web/i18n/locales/pt-BR/common.json similarity index 100% rename from web/i18n/pt-BR/common.json rename to web/i18n/locales/pt-BR/common.json diff --git a/web/i18n/pt-BR/custom.json b/web/i18n/locales/pt-BR/custom.json similarity index 100% rename from web/i18n/pt-BR/custom.json rename to web/i18n/locales/pt-BR/custom.json diff --git a/web/i18n/pt-BR/dataset-creation.json b/web/i18n/locales/pt-BR/dataset-creation.json similarity index 100% rename from web/i18n/pt-BR/dataset-creation.json rename to web/i18n/locales/pt-BR/dataset-creation.json diff --git a/web/i18n/pt-BR/dataset-documents.json b/web/i18n/locales/pt-BR/dataset-documents.json similarity index 100% rename from web/i18n/pt-BR/dataset-documents.json rename to web/i18n/locales/pt-BR/dataset-documents.json diff --git a/web/i18n/pt-BR/dataset-hit-testing.json b/web/i18n/locales/pt-BR/dataset-hit-testing.json similarity index 100% rename from web/i18n/pt-BR/dataset-hit-testing.json rename to web/i18n/locales/pt-BR/dataset-hit-testing.json diff --git a/web/i18n/pt-BR/dataset-pipeline.json b/web/i18n/locales/pt-BR/dataset-pipeline.json similarity index 100% rename from web/i18n/pt-BR/dataset-pipeline.json rename to web/i18n/locales/pt-BR/dataset-pipeline.json diff --git a/web/i18n/pt-BR/dataset-settings.json b/web/i18n/locales/pt-BR/dataset-settings.json similarity index 100% rename from web/i18n/pt-BR/dataset-settings.json rename to web/i18n/locales/pt-BR/dataset-settings.json diff --git a/web/i18n/pt-BR/dataset.json b/web/i18n/locales/pt-BR/dataset.json similarity index 100% rename from web/i18n/pt-BR/dataset.json rename to web/i18n/locales/pt-BR/dataset.json diff --git a/web/i18n/pt-BR/deployments.json b/web/i18n/locales/pt-BR/deployments.json similarity index 100% rename from web/i18n/pt-BR/deployments.json rename to web/i18n/locales/pt-BR/deployments.json diff --git a/web/i18n/pt-BR/device-flow.json b/web/i18n/locales/pt-BR/device-flow.json similarity index 100% rename from web/i18n/pt-BR/device-flow.json rename to web/i18n/locales/pt-BR/device-flow.json diff --git a/web/i18n/pt-BR/education.json b/web/i18n/locales/pt-BR/education.json similarity index 100% rename from web/i18n/pt-BR/education.json rename to web/i18n/locales/pt-BR/education.json diff --git a/web/i18n/pt-BR/explore.json b/web/i18n/locales/pt-BR/explore.json similarity index 100% rename from web/i18n/pt-BR/explore.json rename to web/i18n/locales/pt-BR/explore.json diff --git a/web/i18n/pt-BR/layout.json b/web/i18n/locales/pt-BR/layout.json similarity index 100% rename from web/i18n/pt-BR/layout.json rename to web/i18n/locales/pt-BR/layout.json diff --git a/web/i18n/pt-BR/login.json b/web/i18n/locales/pt-BR/login.json similarity index 100% rename from web/i18n/pt-BR/login.json rename to web/i18n/locales/pt-BR/login.json diff --git a/web/i18n/pt-BR/oauth.json b/web/i18n/locales/pt-BR/oauth.json similarity index 100% rename from web/i18n/pt-BR/oauth.json rename to web/i18n/locales/pt-BR/oauth.json diff --git a/web/i18n/pt-BR/permission-keys.json b/web/i18n/locales/pt-BR/permission-keys.json similarity index 100% rename from web/i18n/pt-BR/permission-keys.json rename to web/i18n/locales/pt-BR/permission-keys.json diff --git a/web/i18n/pt-BR/permission.json b/web/i18n/locales/pt-BR/permission.json similarity index 100% rename from web/i18n/pt-BR/permission.json rename to web/i18n/locales/pt-BR/permission.json diff --git a/web/i18n/pt-BR/pipeline.json b/web/i18n/locales/pt-BR/pipeline.json similarity index 100% rename from web/i18n/pt-BR/pipeline.json rename to web/i18n/locales/pt-BR/pipeline.json diff --git a/web/i18n/pt-BR/plugin-tags.json b/web/i18n/locales/pt-BR/plugin-tags.json similarity index 100% rename from web/i18n/pt-BR/plugin-tags.json rename to web/i18n/locales/pt-BR/plugin-tags.json diff --git a/web/i18n/pt-BR/plugin-trigger.json b/web/i18n/locales/pt-BR/plugin-trigger.json similarity index 100% rename from web/i18n/pt-BR/plugin-trigger.json rename to web/i18n/locales/pt-BR/plugin-trigger.json diff --git a/web/i18n/pt-BR/plugin.json b/web/i18n/locales/pt-BR/plugin.json similarity index 100% rename from web/i18n/pt-BR/plugin.json rename to web/i18n/locales/pt-BR/plugin.json diff --git a/web/i18n/pt-BR/register.json b/web/i18n/locales/pt-BR/register.json similarity index 100% rename from web/i18n/pt-BR/register.json rename to web/i18n/locales/pt-BR/register.json diff --git a/web/i18n/pt-BR/run-log.json b/web/i18n/locales/pt-BR/run-log.json similarity index 100% rename from web/i18n/pt-BR/run-log.json rename to web/i18n/locales/pt-BR/run-log.json diff --git a/web/i18n/pt-BR/share.json b/web/i18n/locales/pt-BR/share.json similarity index 100% rename from web/i18n/pt-BR/share.json rename to web/i18n/locales/pt-BR/share.json diff --git a/web/i18n/pt-BR/skill.json b/web/i18n/locales/pt-BR/skill.json similarity index 100% rename from web/i18n/pt-BR/skill.json rename to web/i18n/locales/pt-BR/skill.json diff --git a/web/i18n/pt-BR/snippet.json b/web/i18n/locales/pt-BR/snippet.json similarity index 100% rename from web/i18n/pt-BR/snippet.json rename to web/i18n/locales/pt-BR/snippet.json diff --git a/web/i18n/pt-BR/time.json b/web/i18n/locales/pt-BR/time.json similarity index 100% rename from web/i18n/pt-BR/time.json rename to web/i18n/locales/pt-BR/time.json diff --git a/web/i18n/pt-BR/tools.json b/web/i18n/locales/pt-BR/tools.json similarity index 100% rename from web/i18n/pt-BR/tools.json rename to web/i18n/locales/pt-BR/tools.json diff --git a/web/i18n/pt-BR/workflow.json b/web/i18n/locales/pt-BR/workflow.json similarity index 100% rename from web/i18n/pt-BR/workflow.json rename to web/i18n/locales/pt-BR/workflow.json diff --git a/web/i18n/ro-RO/agent-v-2.json b/web/i18n/locales/ro-RO/agent-v-2.json similarity index 100% rename from web/i18n/ro-RO/agent-v-2.json rename to web/i18n/locales/ro-RO/agent-v-2.json diff --git a/web/i18n/ro-RO/app-annotation.json b/web/i18n/locales/ro-RO/app-annotation.json similarity index 100% rename from web/i18n/ro-RO/app-annotation.json rename to web/i18n/locales/ro-RO/app-annotation.json diff --git a/web/i18n/ro-RO/app-api.json b/web/i18n/locales/ro-RO/app-api.json similarity index 100% rename from web/i18n/ro-RO/app-api.json rename to web/i18n/locales/ro-RO/app-api.json diff --git a/web/i18n/ro-RO/app-debug.json b/web/i18n/locales/ro-RO/app-debug.json similarity index 100% rename from web/i18n/ro-RO/app-debug.json rename to web/i18n/locales/ro-RO/app-debug.json diff --git a/web/i18n/ro-RO/app-log.json b/web/i18n/locales/ro-RO/app-log.json similarity index 100% rename from web/i18n/ro-RO/app-log.json rename to web/i18n/locales/ro-RO/app-log.json diff --git a/web/i18n/ro-RO/app-overview.json b/web/i18n/locales/ro-RO/app-overview.json similarity index 100% rename from web/i18n/ro-RO/app-overview.json rename to web/i18n/locales/ro-RO/app-overview.json diff --git a/web/i18n/ro-RO/app.json b/web/i18n/locales/ro-RO/app.json similarity index 100% rename from web/i18n/ro-RO/app.json rename to web/i18n/locales/ro-RO/app.json diff --git a/web/i18n/ro-RO/billing.json b/web/i18n/locales/ro-RO/billing.json similarity index 100% rename from web/i18n/ro-RO/billing.json rename to web/i18n/locales/ro-RO/billing.json diff --git a/web/i18n/ro-RO/common.json b/web/i18n/locales/ro-RO/common.json similarity index 100% rename from web/i18n/ro-RO/common.json rename to web/i18n/locales/ro-RO/common.json diff --git a/web/i18n/ro-RO/custom.json b/web/i18n/locales/ro-RO/custom.json similarity index 100% rename from web/i18n/ro-RO/custom.json rename to web/i18n/locales/ro-RO/custom.json diff --git a/web/i18n/ro-RO/dataset-creation.json b/web/i18n/locales/ro-RO/dataset-creation.json similarity index 100% rename from web/i18n/ro-RO/dataset-creation.json rename to web/i18n/locales/ro-RO/dataset-creation.json diff --git a/web/i18n/ro-RO/dataset-documents.json b/web/i18n/locales/ro-RO/dataset-documents.json similarity index 100% rename from web/i18n/ro-RO/dataset-documents.json rename to web/i18n/locales/ro-RO/dataset-documents.json diff --git a/web/i18n/ro-RO/dataset-hit-testing.json b/web/i18n/locales/ro-RO/dataset-hit-testing.json similarity index 100% rename from web/i18n/ro-RO/dataset-hit-testing.json rename to web/i18n/locales/ro-RO/dataset-hit-testing.json diff --git a/web/i18n/ro-RO/dataset-pipeline.json b/web/i18n/locales/ro-RO/dataset-pipeline.json similarity index 100% rename from web/i18n/ro-RO/dataset-pipeline.json rename to web/i18n/locales/ro-RO/dataset-pipeline.json diff --git a/web/i18n/ro-RO/dataset-settings.json b/web/i18n/locales/ro-RO/dataset-settings.json similarity index 100% rename from web/i18n/ro-RO/dataset-settings.json rename to web/i18n/locales/ro-RO/dataset-settings.json diff --git a/web/i18n/ro-RO/dataset.json b/web/i18n/locales/ro-RO/dataset.json similarity index 100% rename from web/i18n/ro-RO/dataset.json rename to web/i18n/locales/ro-RO/dataset.json diff --git a/web/i18n/ro-RO/deployments.json b/web/i18n/locales/ro-RO/deployments.json similarity index 100% rename from web/i18n/ro-RO/deployments.json rename to web/i18n/locales/ro-RO/deployments.json diff --git a/web/i18n/ro-RO/device-flow.json b/web/i18n/locales/ro-RO/device-flow.json similarity index 100% rename from web/i18n/ro-RO/device-flow.json rename to web/i18n/locales/ro-RO/device-flow.json diff --git a/web/i18n/ro-RO/education.json b/web/i18n/locales/ro-RO/education.json similarity index 100% rename from web/i18n/ro-RO/education.json rename to web/i18n/locales/ro-RO/education.json diff --git a/web/i18n/ro-RO/explore.json b/web/i18n/locales/ro-RO/explore.json similarity index 100% rename from web/i18n/ro-RO/explore.json rename to web/i18n/locales/ro-RO/explore.json diff --git a/web/i18n/ro-RO/layout.json b/web/i18n/locales/ro-RO/layout.json similarity index 100% rename from web/i18n/ro-RO/layout.json rename to web/i18n/locales/ro-RO/layout.json diff --git a/web/i18n/ro-RO/login.json b/web/i18n/locales/ro-RO/login.json similarity index 100% rename from web/i18n/ro-RO/login.json rename to web/i18n/locales/ro-RO/login.json diff --git a/web/i18n/ro-RO/oauth.json b/web/i18n/locales/ro-RO/oauth.json similarity index 100% rename from web/i18n/ro-RO/oauth.json rename to web/i18n/locales/ro-RO/oauth.json diff --git a/web/i18n/ro-RO/permission-keys.json b/web/i18n/locales/ro-RO/permission-keys.json similarity index 100% rename from web/i18n/ro-RO/permission-keys.json rename to web/i18n/locales/ro-RO/permission-keys.json diff --git a/web/i18n/ro-RO/permission.json b/web/i18n/locales/ro-RO/permission.json similarity index 100% rename from web/i18n/ro-RO/permission.json rename to web/i18n/locales/ro-RO/permission.json diff --git a/web/i18n/ro-RO/pipeline.json b/web/i18n/locales/ro-RO/pipeline.json similarity index 100% rename from web/i18n/ro-RO/pipeline.json rename to web/i18n/locales/ro-RO/pipeline.json diff --git a/web/i18n/ro-RO/plugin-tags.json b/web/i18n/locales/ro-RO/plugin-tags.json similarity index 100% rename from web/i18n/ro-RO/plugin-tags.json rename to web/i18n/locales/ro-RO/plugin-tags.json diff --git a/web/i18n/ro-RO/plugin-trigger.json b/web/i18n/locales/ro-RO/plugin-trigger.json similarity index 100% rename from web/i18n/ro-RO/plugin-trigger.json rename to web/i18n/locales/ro-RO/plugin-trigger.json diff --git a/web/i18n/ro-RO/plugin.json b/web/i18n/locales/ro-RO/plugin.json similarity index 100% rename from web/i18n/ro-RO/plugin.json rename to web/i18n/locales/ro-RO/plugin.json diff --git a/web/i18n/ro-RO/register.json b/web/i18n/locales/ro-RO/register.json similarity index 100% rename from web/i18n/ro-RO/register.json rename to web/i18n/locales/ro-RO/register.json diff --git a/web/i18n/ro-RO/run-log.json b/web/i18n/locales/ro-RO/run-log.json similarity index 100% rename from web/i18n/ro-RO/run-log.json rename to web/i18n/locales/ro-RO/run-log.json diff --git a/web/i18n/ro-RO/share.json b/web/i18n/locales/ro-RO/share.json similarity index 100% rename from web/i18n/ro-RO/share.json rename to web/i18n/locales/ro-RO/share.json diff --git a/web/i18n/ro-RO/skill.json b/web/i18n/locales/ro-RO/skill.json similarity index 100% rename from web/i18n/ro-RO/skill.json rename to web/i18n/locales/ro-RO/skill.json diff --git a/web/i18n/ro-RO/snippet.json b/web/i18n/locales/ro-RO/snippet.json similarity index 100% rename from web/i18n/ro-RO/snippet.json rename to web/i18n/locales/ro-RO/snippet.json diff --git a/web/i18n/ro-RO/time.json b/web/i18n/locales/ro-RO/time.json similarity index 100% rename from web/i18n/ro-RO/time.json rename to web/i18n/locales/ro-RO/time.json diff --git a/web/i18n/ro-RO/tools.json b/web/i18n/locales/ro-RO/tools.json similarity index 100% rename from web/i18n/ro-RO/tools.json rename to web/i18n/locales/ro-RO/tools.json diff --git a/web/i18n/ro-RO/workflow.json b/web/i18n/locales/ro-RO/workflow.json similarity index 100% rename from web/i18n/ro-RO/workflow.json rename to web/i18n/locales/ro-RO/workflow.json diff --git a/web/i18n/ru-RU/agent-v-2.json b/web/i18n/locales/ru-RU/agent-v-2.json similarity index 100% rename from web/i18n/ru-RU/agent-v-2.json rename to web/i18n/locales/ru-RU/agent-v-2.json diff --git a/web/i18n/ru-RU/app-annotation.json b/web/i18n/locales/ru-RU/app-annotation.json similarity index 100% rename from web/i18n/ru-RU/app-annotation.json rename to web/i18n/locales/ru-RU/app-annotation.json diff --git a/web/i18n/ru-RU/app-api.json b/web/i18n/locales/ru-RU/app-api.json similarity index 100% rename from web/i18n/ru-RU/app-api.json rename to web/i18n/locales/ru-RU/app-api.json diff --git a/web/i18n/ru-RU/app-debug.json b/web/i18n/locales/ru-RU/app-debug.json similarity index 100% rename from web/i18n/ru-RU/app-debug.json rename to web/i18n/locales/ru-RU/app-debug.json diff --git a/web/i18n/ru-RU/app-log.json b/web/i18n/locales/ru-RU/app-log.json similarity index 100% rename from web/i18n/ru-RU/app-log.json rename to web/i18n/locales/ru-RU/app-log.json diff --git a/web/i18n/ru-RU/app-overview.json b/web/i18n/locales/ru-RU/app-overview.json similarity index 100% rename from web/i18n/ru-RU/app-overview.json rename to web/i18n/locales/ru-RU/app-overview.json diff --git a/web/i18n/ru-RU/app.json b/web/i18n/locales/ru-RU/app.json similarity index 100% rename from web/i18n/ru-RU/app.json rename to web/i18n/locales/ru-RU/app.json diff --git a/web/i18n/ru-RU/billing.json b/web/i18n/locales/ru-RU/billing.json similarity index 100% rename from web/i18n/ru-RU/billing.json rename to web/i18n/locales/ru-RU/billing.json diff --git a/web/i18n/ru-RU/common.json b/web/i18n/locales/ru-RU/common.json similarity index 100% rename from web/i18n/ru-RU/common.json rename to web/i18n/locales/ru-RU/common.json diff --git a/web/i18n/ru-RU/custom.json b/web/i18n/locales/ru-RU/custom.json similarity index 100% rename from web/i18n/ru-RU/custom.json rename to web/i18n/locales/ru-RU/custom.json diff --git a/web/i18n/ru-RU/dataset-creation.json b/web/i18n/locales/ru-RU/dataset-creation.json similarity index 100% rename from web/i18n/ru-RU/dataset-creation.json rename to web/i18n/locales/ru-RU/dataset-creation.json diff --git a/web/i18n/ru-RU/dataset-documents.json b/web/i18n/locales/ru-RU/dataset-documents.json similarity index 100% rename from web/i18n/ru-RU/dataset-documents.json rename to web/i18n/locales/ru-RU/dataset-documents.json diff --git a/web/i18n/ru-RU/dataset-hit-testing.json b/web/i18n/locales/ru-RU/dataset-hit-testing.json similarity index 100% rename from web/i18n/ru-RU/dataset-hit-testing.json rename to web/i18n/locales/ru-RU/dataset-hit-testing.json diff --git a/web/i18n/ru-RU/dataset-pipeline.json b/web/i18n/locales/ru-RU/dataset-pipeline.json similarity index 100% rename from web/i18n/ru-RU/dataset-pipeline.json rename to web/i18n/locales/ru-RU/dataset-pipeline.json diff --git a/web/i18n/ru-RU/dataset-settings.json b/web/i18n/locales/ru-RU/dataset-settings.json similarity index 100% rename from web/i18n/ru-RU/dataset-settings.json rename to web/i18n/locales/ru-RU/dataset-settings.json diff --git a/web/i18n/ru-RU/dataset.json b/web/i18n/locales/ru-RU/dataset.json similarity index 100% rename from web/i18n/ru-RU/dataset.json rename to web/i18n/locales/ru-RU/dataset.json diff --git a/web/i18n/ru-RU/deployments.json b/web/i18n/locales/ru-RU/deployments.json similarity index 100% rename from web/i18n/ru-RU/deployments.json rename to web/i18n/locales/ru-RU/deployments.json diff --git a/web/i18n/ru-RU/device-flow.json b/web/i18n/locales/ru-RU/device-flow.json similarity index 100% rename from web/i18n/ru-RU/device-flow.json rename to web/i18n/locales/ru-RU/device-flow.json diff --git a/web/i18n/ru-RU/education.json b/web/i18n/locales/ru-RU/education.json similarity index 100% rename from web/i18n/ru-RU/education.json rename to web/i18n/locales/ru-RU/education.json diff --git a/web/i18n/ru-RU/explore.json b/web/i18n/locales/ru-RU/explore.json similarity index 100% rename from web/i18n/ru-RU/explore.json rename to web/i18n/locales/ru-RU/explore.json diff --git a/web/i18n/ru-RU/layout.json b/web/i18n/locales/ru-RU/layout.json similarity index 100% rename from web/i18n/ru-RU/layout.json rename to web/i18n/locales/ru-RU/layout.json diff --git a/web/i18n/ru-RU/login.json b/web/i18n/locales/ru-RU/login.json similarity index 100% rename from web/i18n/ru-RU/login.json rename to web/i18n/locales/ru-RU/login.json diff --git a/web/i18n/ru-RU/oauth.json b/web/i18n/locales/ru-RU/oauth.json similarity index 100% rename from web/i18n/ru-RU/oauth.json rename to web/i18n/locales/ru-RU/oauth.json diff --git a/web/i18n/ru-RU/permission-keys.json b/web/i18n/locales/ru-RU/permission-keys.json similarity index 100% rename from web/i18n/ru-RU/permission-keys.json rename to web/i18n/locales/ru-RU/permission-keys.json diff --git a/web/i18n/ru-RU/permission.json b/web/i18n/locales/ru-RU/permission.json similarity index 100% rename from web/i18n/ru-RU/permission.json rename to web/i18n/locales/ru-RU/permission.json diff --git a/web/i18n/ru-RU/pipeline.json b/web/i18n/locales/ru-RU/pipeline.json similarity index 100% rename from web/i18n/ru-RU/pipeline.json rename to web/i18n/locales/ru-RU/pipeline.json diff --git a/web/i18n/ru-RU/plugin-tags.json b/web/i18n/locales/ru-RU/plugin-tags.json similarity index 100% rename from web/i18n/ru-RU/plugin-tags.json rename to web/i18n/locales/ru-RU/plugin-tags.json diff --git a/web/i18n/ru-RU/plugin-trigger.json b/web/i18n/locales/ru-RU/plugin-trigger.json similarity index 100% rename from web/i18n/ru-RU/plugin-trigger.json rename to web/i18n/locales/ru-RU/plugin-trigger.json diff --git a/web/i18n/ru-RU/plugin.json b/web/i18n/locales/ru-RU/plugin.json similarity index 100% rename from web/i18n/ru-RU/plugin.json rename to web/i18n/locales/ru-RU/plugin.json diff --git a/web/i18n/ru-RU/register.json b/web/i18n/locales/ru-RU/register.json similarity index 100% rename from web/i18n/ru-RU/register.json rename to web/i18n/locales/ru-RU/register.json diff --git a/web/i18n/ru-RU/run-log.json b/web/i18n/locales/ru-RU/run-log.json similarity index 100% rename from web/i18n/ru-RU/run-log.json rename to web/i18n/locales/ru-RU/run-log.json diff --git a/web/i18n/ru-RU/share.json b/web/i18n/locales/ru-RU/share.json similarity index 100% rename from web/i18n/ru-RU/share.json rename to web/i18n/locales/ru-RU/share.json diff --git a/web/i18n/ru-RU/skill.json b/web/i18n/locales/ru-RU/skill.json similarity index 100% rename from web/i18n/ru-RU/skill.json rename to web/i18n/locales/ru-RU/skill.json diff --git a/web/i18n/ru-RU/snippet.json b/web/i18n/locales/ru-RU/snippet.json similarity index 100% rename from web/i18n/ru-RU/snippet.json rename to web/i18n/locales/ru-RU/snippet.json diff --git a/web/i18n/ru-RU/time.json b/web/i18n/locales/ru-RU/time.json similarity index 100% rename from web/i18n/ru-RU/time.json rename to web/i18n/locales/ru-RU/time.json diff --git a/web/i18n/ru-RU/tools.json b/web/i18n/locales/ru-RU/tools.json similarity index 100% rename from web/i18n/ru-RU/tools.json rename to web/i18n/locales/ru-RU/tools.json diff --git a/web/i18n/ru-RU/workflow.json b/web/i18n/locales/ru-RU/workflow.json similarity index 100% rename from web/i18n/ru-RU/workflow.json rename to web/i18n/locales/ru-RU/workflow.json diff --git a/web/i18n/sl-SI/agent-v-2.json b/web/i18n/locales/sl-SI/agent-v-2.json similarity index 100% rename from web/i18n/sl-SI/agent-v-2.json rename to web/i18n/locales/sl-SI/agent-v-2.json diff --git a/web/i18n/sl-SI/app-annotation.json b/web/i18n/locales/sl-SI/app-annotation.json similarity index 100% rename from web/i18n/sl-SI/app-annotation.json rename to web/i18n/locales/sl-SI/app-annotation.json diff --git a/web/i18n/sl-SI/app-api.json b/web/i18n/locales/sl-SI/app-api.json similarity index 100% rename from web/i18n/sl-SI/app-api.json rename to web/i18n/locales/sl-SI/app-api.json diff --git a/web/i18n/sl-SI/app-debug.json b/web/i18n/locales/sl-SI/app-debug.json similarity index 100% rename from web/i18n/sl-SI/app-debug.json rename to web/i18n/locales/sl-SI/app-debug.json diff --git a/web/i18n/sl-SI/app-log.json b/web/i18n/locales/sl-SI/app-log.json similarity index 100% rename from web/i18n/sl-SI/app-log.json rename to web/i18n/locales/sl-SI/app-log.json diff --git a/web/i18n/sl-SI/app-overview.json b/web/i18n/locales/sl-SI/app-overview.json similarity index 100% rename from web/i18n/sl-SI/app-overview.json rename to web/i18n/locales/sl-SI/app-overview.json diff --git a/web/i18n/sl-SI/app.json b/web/i18n/locales/sl-SI/app.json similarity index 100% rename from web/i18n/sl-SI/app.json rename to web/i18n/locales/sl-SI/app.json diff --git a/web/i18n/sl-SI/billing.json b/web/i18n/locales/sl-SI/billing.json similarity index 100% rename from web/i18n/sl-SI/billing.json rename to web/i18n/locales/sl-SI/billing.json diff --git a/web/i18n/sl-SI/common.json b/web/i18n/locales/sl-SI/common.json similarity index 100% rename from web/i18n/sl-SI/common.json rename to web/i18n/locales/sl-SI/common.json diff --git a/web/i18n/sl-SI/custom.json b/web/i18n/locales/sl-SI/custom.json similarity index 100% rename from web/i18n/sl-SI/custom.json rename to web/i18n/locales/sl-SI/custom.json diff --git a/web/i18n/sl-SI/dataset-creation.json b/web/i18n/locales/sl-SI/dataset-creation.json similarity index 100% rename from web/i18n/sl-SI/dataset-creation.json rename to web/i18n/locales/sl-SI/dataset-creation.json diff --git a/web/i18n/sl-SI/dataset-documents.json b/web/i18n/locales/sl-SI/dataset-documents.json similarity index 100% rename from web/i18n/sl-SI/dataset-documents.json rename to web/i18n/locales/sl-SI/dataset-documents.json diff --git a/web/i18n/sl-SI/dataset-hit-testing.json b/web/i18n/locales/sl-SI/dataset-hit-testing.json similarity index 100% rename from web/i18n/sl-SI/dataset-hit-testing.json rename to web/i18n/locales/sl-SI/dataset-hit-testing.json diff --git a/web/i18n/sl-SI/dataset-pipeline.json b/web/i18n/locales/sl-SI/dataset-pipeline.json similarity index 100% rename from web/i18n/sl-SI/dataset-pipeline.json rename to web/i18n/locales/sl-SI/dataset-pipeline.json diff --git a/web/i18n/sl-SI/dataset-settings.json b/web/i18n/locales/sl-SI/dataset-settings.json similarity index 100% rename from web/i18n/sl-SI/dataset-settings.json rename to web/i18n/locales/sl-SI/dataset-settings.json diff --git a/web/i18n/sl-SI/dataset.json b/web/i18n/locales/sl-SI/dataset.json similarity index 100% rename from web/i18n/sl-SI/dataset.json rename to web/i18n/locales/sl-SI/dataset.json diff --git a/web/i18n/sl-SI/deployments.json b/web/i18n/locales/sl-SI/deployments.json similarity index 100% rename from web/i18n/sl-SI/deployments.json rename to web/i18n/locales/sl-SI/deployments.json diff --git a/web/i18n/sl-SI/device-flow.json b/web/i18n/locales/sl-SI/device-flow.json similarity index 100% rename from web/i18n/sl-SI/device-flow.json rename to web/i18n/locales/sl-SI/device-flow.json diff --git a/web/i18n/sl-SI/education.json b/web/i18n/locales/sl-SI/education.json similarity index 100% rename from web/i18n/sl-SI/education.json rename to web/i18n/locales/sl-SI/education.json diff --git a/web/i18n/sl-SI/explore.json b/web/i18n/locales/sl-SI/explore.json similarity index 100% rename from web/i18n/sl-SI/explore.json rename to web/i18n/locales/sl-SI/explore.json diff --git a/web/i18n/sl-SI/layout.json b/web/i18n/locales/sl-SI/layout.json similarity index 100% rename from web/i18n/sl-SI/layout.json rename to web/i18n/locales/sl-SI/layout.json diff --git a/web/i18n/sl-SI/login.json b/web/i18n/locales/sl-SI/login.json similarity index 100% rename from web/i18n/sl-SI/login.json rename to web/i18n/locales/sl-SI/login.json diff --git a/web/i18n/sl-SI/oauth.json b/web/i18n/locales/sl-SI/oauth.json similarity index 100% rename from web/i18n/sl-SI/oauth.json rename to web/i18n/locales/sl-SI/oauth.json diff --git a/web/i18n/sl-SI/permission-keys.json b/web/i18n/locales/sl-SI/permission-keys.json similarity index 100% rename from web/i18n/sl-SI/permission-keys.json rename to web/i18n/locales/sl-SI/permission-keys.json diff --git a/web/i18n/sl-SI/permission.json b/web/i18n/locales/sl-SI/permission.json similarity index 100% rename from web/i18n/sl-SI/permission.json rename to web/i18n/locales/sl-SI/permission.json diff --git a/web/i18n/sl-SI/pipeline.json b/web/i18n/locales/sl-SI/pipeline.json similarity index 100% rename from web/i18n/sl-SI/pipeline.json rename to web/i18n/locales/sl-SI/pipeline.json diff --git a/web/i18n/sl-SI/plugin-tags.json b/web/i18n/locales/sl-SI/plugin-tags.json similarity index 100% rename from web/i18n/sl-SI/plugin-tags.json rename to web/i18n/locales/sl-SI/plugin-tags.json diff --git a/web/i18n/sl-SI/plugin-trigger.json b/web/i18n/locales/sl-SI/plugin-trigger.json similarity index 100% rename from web/i18n/sl-SI/plugin-trigger.json rename to web/i18n/locales/sl-SI/plugin-trigger.json diff --git a/web/i18n/sl-SI/plugin.json b/web/i18n/locales/sl-SI/plugin.json similarity index 100% rename from web/i18n/sl-SI/plugin.json rename to web/i18n/locales/sl-SI/plugin.json diff --git a/web/i18n/sl-SI/register.json b/web/i18n/locales/sl-SI/register.json similarity index 100% rename from web/i18n/sl-SI/register.json rename to web/i18n/locales/sl-SI/register.json diff --git a/web/i18n/sl-SI/run-log.json b/web/i18n/locales/sl-SI/run-log.json similarity index 100% rename from web/i18n/sl-SI/run-log.json rename to web/i18n/locales/sl-SI/run-log.json diff --git a/web/i18n/sl-SI/share.json b/web/i18n/locales/sl-SI/share.json similarity index 100% rename from web/i18n/sl-SI/share.json rename to web/i18n/locales/sl-SI/share.json diff --git a/web/i18n/sl-SI/skill.json b/web/i18n/locales/sl-SI/skill.json similarity index 100% rename from web/i18n/sl-SI/skill.json rename to web/i18n/locales/sl-SI/skill.json diff --git a/web/i18n/sl-SI/snippet.json b/web/i18n/locales/sl-SI/snippet.json similarity index 100% rename from web/i18n/sl-SI/snippet.json rename to web/i18n/locales/sl-SI/snippet.json diff --git a/web/i18n/sl-SI/time.json b/web/i18n/locales/sl-SI/time.json similarity index 100% rename from web/i18n/sl-SI/time.json rename to web/i18n/locales/sl-SI/time.json diff --git a/web/i18n/sl-SI/tools.json b/web/i18n/locales/sl-SI/tools.json similarity index 100% rename from web/i18n/sl-SI/tools.json rename to web/i18n/locales/sl-SI/tools.json diff --git a/web/i18n/sl-SI/workflow.json b/web/i18n/locales/sl-SI/workflow.json similarity index 100% rename from web/i18n/sl-SI/workflow.json rename to web/i18n/locales/sl-SI/workflow.json diff --git a/web/i18n/th-TH/agent-v-2.json b/web/i18n/locales/th-TH/agent-v-2.json similarity index 100% rename from web/i18n/th-TH/agent-v-2.json rename to web/i18n/locales/th-TH/agent-v-2.json diff --git a/web/i18n/th-TH/app-annotation.json b/web/i18n/locales/th-TH/app-annotation.json similarity index 100% rename from web/i18n/th-TH/app-annotation.json rename to web/i18n/locales/th-TH/app-annotation.json diff --git a/web/i18n/th-TH/app-api.json b/web/i18n/locales/th-TH/app-api.json similarity index 100% rename from web/i18n/th-TH/app-api.json rename to web/i18n/locales/th-TH/app-api.json diff --git a/web/i18n/th-TH/app-debug.json b/web/i18n/locales/th-TH/app-debug.json similarity index 100% rename from web/i18n/th-TH/app-debug.json rename to web/i18n/locales/th-TH/app-debug.json diff --git a/web/i18n/th-TH/app-log.json b/web/i18n/locales/th-TH/app-log.json similarity index 100% rename from web/i18n/th-TH/app-log.json rename to web/i18n/locales/th-TH/app-log.json diff --git a/web/i18n/th-TH/app-overview.json b/web/i18n/locales/th-TH/app-overview.json similarity index 100% rename from web/i18n/th-TH/app-overview.json rename to web/i18n/locales/th-TH/app-overview.json diff --git a/web/i18n/th-TH/app.json b/web/i18n/locales/th-TH/app.json similarity index 100% rename from web/i18n/th-TH/app.json rename to web/i18n/locales/th-TH/app.json diff --git a/web/i18n/th-TH/billing.json b/web/i18n/locales/th-TH/billing.json similarity index 100% rename from web/i18n/th-TH/billing.json rename to web/i18n/locales/th-TH/billing.json diff --git a/web/i18n/th-TH/common.json b/web/i18n/locales/th-TH/common.json similarity index 100% rename from web/i18n/th-TH/common.json rename to web/i18n/locales/th-TH/common.json diff --git a/web/i18n/th-TH/custom.json b/web/i18n/locales/th-TH/custom.json similarity index 100% rename from web/i18n/th-TH/custom.json rename to web/i18n/locales/th-TH/custom.json diff --git a/web/i18n/th-TH/dataset-creation.json b/web/i18n/locales/th-TH/dataset-creation.json similarity index 100% rename from web/i18n/th-TH/dataset-creation.json rename to web/i18n/locales/th-TH/dataset-creation.json diff --git a/web/i18n/th-TH/dataset-documents.json b/web/i18n/locales/th-TH/dataset-documents.json similarity index 100% rename from web/i18n/th-TH/dataset-documents.json rename to web/i18n/locales/th-TH/dataset-documents.json diff --git a/web/i18n/th-TH/dataset-hit-testing.json b/web/i18n/locales/th-TH/dataset-hit-testing.json similarity index 100% rename from web/i18n/th-TH/dataset-hit-testing.json rename to web/i18n/locales/th-TH/dataset-hit-testing.json diff --git a/web/i18n/th-TH/dataset-pipeline.json b/web/i18n/locales/th-TH/dataset-pipeline.json similarity index 100% rename from web/i18n/th-TH/dataset-pipeline.json rename to web/i18n/locales/th-TH/dataset-pipeline.json diff --git a/web/i18n/th-TH/dataset-settings.json b/web/i18n/locales/th-TH/dataset-settings.json similarity index 100% rename from web/i18n/th-TH/dataset-settings.json rename to web/i18n/locales/th-TH/dataset-settings.json diff --git a/web/i18n/th-TH/dataset.json b/web/i18n/locales/th-TH/dataset.json similarity index 100% rename from web/i18n/th-TH/dataset.json rename to web/i18n/locales/th-TH/dataset.json diff --git a/web/i18n/th-TH/deployments.json b/web/i18n/locales/th-TH/deployments.json similarity index 100% rename from web/i18n/th-TH/deployments.json rename to web/i18n/locales/th-TH/deployments.json diff --git a/web/i18n/th-TH/device-flow.json b/web/i18n/locales/th-TH/device-flow.json similarity index 100% rename from web/i18n/th-TH/device-flow.json rename to web/i18n/locales/th-TH/device-flow.json diff --git a/web/i18n/th-TH/education.json b/web/i18n/locales/th-TH/education.json similarity index 100% rename from web/i18n/th-TH/education.json rename to web/i18n/locales/th-TH/education.json diff --git a/web/i18n/th-TH/explore.json b/web/i18n/locales/th-TH/explore.json similarity index 100% rename from web/i18n/th-TH/explore.json rename to web/i18n/locales/th-TH/explore.json diff --git a/web/i18n/th-TH/layout.json b/web/i18n/locales/th-TH/layout.json similarity index 100% rename from web/i18n/th-TH/layout.json rename to web/i18n/locales/th-TH/layout.json diff --git a/web/i18n/th-TH/login.json b/web/i18n/locales/th-TH/login.json similarity index 100% rename from web/i18n/th-TH/login.json rename to web/i18n/locales/th-TH/login.json diff --git a/web/i18n/th-TH/oauth.json b/web/i18n/locales/th-TH/oauth.json similarity index 100% rename from web/i18n/th-TH/oauth.json rename to web/i18n/locales/th-TH/oauth.json diff --git a/web/i18n/th-TH/permission-keys.json b/web/i18n/locales/th-TH/permission-keys.json similarity index 100% rename from web/i18n/th-TH/permission-keys.json rename to web/i18n/locales/th-TH/permission-keys.json diff --git a/web/i18n/th-TH/permission.json b/web/i18n/locales/th-TH/permission.json similarity index 100% rename from web/i18n/th-TH/permission.json rename to web/i18n/locales/th-TH/permission.json diff --git a/web/i18n/th-TH/pipeline.json b/web/i18n/locales/th-TH/pipeline.json similarity index 100% rename from web/i18n/th-TH/pipeline.json rename to web/i18n/locales/th-TH/pipeline.json diff --git a/web/i18n/th-TH/plugin-tags.json b/web/i18n/locales/th-TH/plugin-tags.json similarity index 100% rename from web/i18n/th-TH/plugin-tags.json rename to web/i18n/locales/th-TH/plugin-tags.json diff --git a/web/i18n/th-TH/plugin-trigger.json b/web/i18n/locales/th-TH/plugin-trigger.json similarity index 100% rename from web/i18n/th-TH/plugin-trigger.json rename to web/i18n/locales/th-TH/plugin-trigger.json diff --git a/web/i18n/th-TH/plugin.json b/web/i18n/locales/th-TH/plugin.json similarity index 100% rename from web/i18n/th-TH/plugin.json rename to web/i18n/locales/th-TH/plugin.json diff --git a/web/i18n/th-TH/register.json b/web/i18n/locales/th-TH/register.json similarity index 100% rename from web/i18n/th-TH/register.json rename to web/i18n/locales/th-TH/register.json diff --git a/web/i18n/th-TH/run-log.json b/web/i18n/locales/th-TH/run-log.json similarity index 100% rename from web/i18n/th-TH/run-log.json rename to web/i18n/locales/th-TH/run-log.json diff --git a/web/i18n/th-TH/share.json b/web/i18n/locales/th-TH/share.json similarity index 100% rename from web/i18n/th-TH/share.json rename to web/i18n/locales/th-TH/share.json diff --git a/web/i18n/th-TH/skill.json b/web/i18n/locales/th-TH/skill.json similarity index 100% rename from web/i18n/th-TH/skill.json rename to web/i18n/locales/th-TH/skill.json diff --git a/web/i18n/th-TH/snippet.json b/web/i18n/locales/th-TH/snippet.json similarity index 100% rename from web/i18n/th-TH/snippet.json rename to web/i18n/locales/th-TH/snippet.json diff --git a/web/i18n/th-TH/time.json b/web/i18n/locales/th-TH/time.json similarity index 100% rename from web/i18n/th-TH/time.json rename to web/i18n/locales/th-TH/time.json diff --git a/web/i18n/th-TH/tools.json b/web/i18n/locales/th-TH/tools.json similarity index 100% rename from web/i18n/th-TH/tools.json rename to web/i18n/locales/th-TH/tools.json diff --git a/web/i18n/th-TH/workflow.json b/web/i18n/locales/th-TH/workflow.json similarity index 100% rename from web/i18n/th-TH/workflow.json rename to web/i18n/locales/th-TH/workflow.json diff --git a/web/i18n/tr-TR/agent-v-2.json b/web/i18n/locales/tr-TR/agent-v-2.json similarity index 100% rename from web/i18n/tr-TR/agent-v-2.json rename to web/i18n/locales/tr-TR/agent-v-2.json diff --git a/web/i18n/tr-TR/app-annotation.json b/web/i18n/locales/tr-TR/app-annotation.json similarity index 100% rename from web/i18n/tr-TR/app-annotation.json rename to web/i18n/locales/tr-TR/app-annotation.json diff --git a/web/i18n/tr-TR/app-api.json b/web/i18n/locales/tr-TR/app-api.json similarity index 100% rename from web/i18n/tr-TR/app-api.json rename to web/i18n/locales/tr-TR/app-api.json diff --git a/web/i18n/tr-TR/app-debug.json b/web/i18n/locales/tr-TR/app-debug.json similarity index 100% rename from web/i18n/tr-TR/app-debug.json rename to web/i18n/locales/tr-TR/app-debug.json diff --git a/web/i18n/tr-TR/app-log.json b/web/i18n/locales/tr-TR/app-log.json similarity index 100% rename from web/i18n/tr-TR/app-log.json rename to web/i18n/locales/tr-TR/app-log.json diff --git a/web/i18n/tr-TR/app-overview.json b/web/i18n/locales/tr-TR/app-overview.json similarity index 100% rename from web/i18n/tr-TR/app-overview.json rename to web/i18n/locales/tr-TR/app-overview.json diff --git a/web/i18n/tr-TR/app.json b/web/i18n/locales/tr-TR/app.json similarity index 100% rename from web/i18n/tr-TR/app.json rename to web/i18n/locales/tr-TR/app.json diff --git a/web/i18n/tr-TR/billing.json b/web/i18n/locales/tr-TR/billing.json similarity index 100% rename from web/i18n/tr-TR/billing.json rename to web/i18n/locales/tr-TR/billing.json diff --git a/web/i18n/tr-TR/common.json b/web/i18n/locales/tr-TR/common.json similarity index 100% rename from web/i18n/tr-TR/common.json rename to web/i18n/locales/tr-TR/common.json diff --git a/web/i18n/tr-TR/custom.json b/web/i18n/locales/tr-TR/custom.json similarity index 100% rename from web/i18n/tr-TR/custom.json rename to web/i18n/locales/tr-TR/custom.json diff --git a/web/i18n/tr-TR/dataset-creation.json b/web/i18n/locales/tr-TR/dataset-creation.json similarity index 100% rename from web/i18n/tr-TR/dataset-creation.json rename to web/i18n/locales/tr-TR/dataset-creation.json diff --git a/web/i18n/tr-TR/dataset-documents.json b/web/i18n/locales/tr-TR/dataset-documents.json similarity index 100% rename from web/i18n/tr-TR/dataset-documents.json rename to web/i18n/locales/tr-TR/dataset-documents.json diff --git a/web/i18n/tr-TR/dataset-hit-testing.json b/web/i18n/locales/tr-TR/dataset-hit-testing.json similarity index 100% rename from web/i18n/tr-TR/dataset-hit-testing.json rename to web/i18n/locales/tr-TR/dataset-hit-testing.json diff --git a/web/i18n/tr-TR/dataset-pipeline.json b/web/i18n/locales/tr-TR/dataset-pipeline.json similarity index 100% rename from web/i18n/tr-TR/dataset-pipeline.json rename to web/i18n/locales/tr-TR/dataset-pipeline.json diff --git a/web/i18n/tr-TR/dataset-settings.json b/web/i18n/locales/tr-TR/dataset-settings.json similarity index 100% rename from web/i18n/tr-TR/dataset-settings.json rename to web/i18n/locales/tr-TR/dataset-settings.json diff --git a/web/i18n/tr-TR/dataset.json b/web/i18n/locales/tr-TR/dataset.json similarity index 100% rename from web/i18n/tr-TR/dataset.json rename to web/i18n/locales/tr-TR/dataset.json diff --git a/web/i18n/tr-TR/deployments.json b/web/i18n/locales/tr-TR/deployments.json similarity index 100% rename from web/i18n/tr-TR/deployments.json rename to web/i18n/locales/tr-TR/deployments.json diff --git a/web/i18n/tr-TR/device-flow.json b/web/i18n/locales/tr-TR/device-flow.json similarity index 100% rename from web/i18n/tr-TR/device-flow.json rename to web/i18n/locales/tr-TR/device-flow.json diff --git a/web/i18n/tr-TR/education.json b/web/i18n/locales/tr-TR/education.json similarity index 100% rename from web/i18n/tr-TR/education.json rename to web/i18n/locales/tr-TR/education.json diff --git a/web/i18n/tr-TR/explore.json b/web/i18n/locales/tr-TR/explore.json similarity index 100% rename from web/i18n/tr-TR/explore.json rename to web/i18n/locales/tr-TR/explore.json diff --git a/web/i18n/tr-TR/layout.json b/web/i18n/locales/tr-TR/layout.json similarity index 100% rename from web/i18n/tr-TR/layout.json rename to web/i18n/locales/tr-TR/layout.json diff --git a/web/i18n/tr-TR/login.json b/web/i18n/locales/tr-TR/login.json similarity index 100% rename from web/i18n/tr-TR/login.json rename to web/i18n/locales/tr-TR/login.json diff --git a/web/i18n/tr-TR/oauth.json b/web/i18n/locales/tr-TR/oauth.json similarity index 100% rename from web/i18n/tr-TR/oauth.json rename to web/i18n/locales/tr-TR/oauth.json diff --git a/web/i18n/tr-TR/permission-keys.json b/web/i18n/locales/tr-TR/permission-keys.json similarity index 100% rename from web/i18n/tr-TR/permission-keys.json rename to web/i18n/locales/tr-TR/permission-keys.json diff --git a/web/i18n/tr-TR/permission.json b/web/i18n/locales/tr-TR/permission.json similarity index 100% rename from web/i18n/tr-TR/permission.json rename to web/i18n/locales/tr-TR/permission.json diff --git a/web/i18n/tr-TR/pipeline.json b/web/i18n/locales/tr-TR/pipeline.json similarity index 100% rename from web/i18n/tr-TR/pipeline.json rename to web/i18n/locales/tr-TR/pipeline.json diff --git a/web/i18n/tr-TR/plugin-tags.json b/web/i18n/locales/tr-TR/plugin-tags.json similarity index 100% rename from web/i18n/tr-TR/plugin-tags.json rename to web/i18n/locales/tr-TR/plugin-tags.json diff --git a/web/i18n/tr-TR/plugin-trigger.json b/web/i18n/locales/tr-TR/plugin-trigger.json similarity index 100% rename from web/i18n/tr-TR/plugin-trigger.json rename to web/i18n/locales/tr-TR/plugin-trigger.json diff --git a/web/i18n/tr-TR/plugin.json b/web/i18n/locales/tr-TR/plugin.json similarity index 100% rename from web/i18n/tr-TR/plugin.json rename to web/i18n/locales/tr-TR/plugin.json diff --git a/web/i18n/tr-TR/register.json b/web/i18n/locales/tr-TR/register.json similarity index 100% rename from web/i18n/tr-TR/register.json rename to web/i18n/locales/tr-TR/register.json diff --git a/web/i18n/tr-TR/run-log.json b/web/i18n/locales/tr-TR/run-log.json similarity index 100% rename from web/i18n/tr-TR/run-log.json rename to web/i18n/locales/tr-TR/run-log.json diff --git a/web/i18n/tr-TR/share.json b/web/i18n/locales/tr-TR/share.json similarity index 100% rename from web/i18n/tr-TR/share.json rename to web/i18n/locales/tr-TR/share.json diff --git a/web/i18n/tr-TR/skill.json b/web/i18n/locales/tr-TR/skill.json similarity index 100% rename from web/i18n/tr-TR/skill.json rename to web/i18n/locales/tr-TR/skill.json diff --git a/web/i18n/tr-TR/snippet.json b/web/i18n/locales/tr-TR/snippet.json similarity index 100% rename from web/i18n/tr-TR/snippet.json rename to web/i18n/locales/tr-TR/snippet.json diff --git a/web/i18n/tr-TR/time.json b/web/i18n/locales/tr-TR/time.json similarity index 100% rename from web/i18n/tr-TR/time.json rename to web/i18n/locales/tr-TR/time.json diff --git a/web/i18n/tr-TR/tools.json b/web/i18n/locales/tr-TR/tools.json similarity index 100% rename from web/i18n/tr-TR/tools.json rename to web/i18n/locales/tr-TR/tools.json diff --git a/web/i18n/tr-TR/workflow.json b/web/i18n/locales/tr-TR/workflow.json similarity index 100% rename from web/i18n/tr-TR/workflow.json rename to web/i18n/locales/tr-TR/workflow.json diff --git a/web/i18n/uk-UA/agent-v-2.json b/web/i18n/locales/uk-UA/agent-v-2.json similarity index 100% rename from web/i18n/uk-UA/agent-v-2.json rename to web/i18n/locales/uk-UA/agent-v-2.json diff --git a/web/i18n/uk-UA/app-annotation.json b/web/i18n/locales/uk-UA/app-annotation.json similarity index 100% rename from web/i18n/uk-UA/app-annotation.json rename to web/i18n/locales/uk-UA/app-annotation.json diff --git a/web/i18n/uk-UA/app-api.json b/web/i18n/locales/uk-UA/app-api.json similarity index 100% rename from web/i18n/uk-UA/app-api.json rename to web/i18n/locales/uk-UA/app-api.json diff --git a/web/i18n/uk-UA/app-debug.json b/web/i18n/locales/uk-UA/app-debug.json similarity index 100% rename from web/i18n/uk-UA/app-debug.json rename to web/i18n/locales/uk-UA/app-debug.json diff --git a/web/i18n/uk-UA/app-log.json b/web/i18n/locales/uk-UA/app-log.json similarity index 100% rename from web/i18n/uk-UA/app-log.json rename to web/i18n/locales/uk-UA/app-log.json diff --git a/web/i18n/uk-UA/app-overview.json b/web/i18n/locales/uk-UA/app-overview.json similarity index 100% rename from web/i18n/uk-UA/app-overview.json rename to web/i18n/locales/uk-UA/app-overview.json diff --git a/web/i18n/uk-UA/app.json b/web/i18n/locales/uk-UA/app.json similarity index 100% rename from web/i18n/uk-UA/app.json rename to web/i18n/locales/uk-UA/app.json diff --git a/web/i18n/uk-UA/billing.json b/web/i18n/locales/uk-UA/billing.json similarity index 100% rename from web/i18n/uk-UA/billing.json rename to web/i18n/locales/uk-UA/billing.json diff --git a/web/i18n/uk-UA/common.json b/web/i18n/locales/uk-UA/common.json similarity index 100% rename from web/i18n/uk-UA/common.json rename to web/i18n/locales/uk-UA/common.json diff --git a/web/i18n/uk-UA/custom.json b/web/i18n/locales/uk-UA/custom.json similarity index 100% rename from web/i18n/uk-UA/custom.json rename to web/i18n/locales/uk-UA/custom.json diff --git a/web/i18n/uk-UA/dataset-creation.json b/web/i18n/locales/uk-UA/dataset-creation.json similarity index 100% rename from web/i18n/uk-UA/dataset-creation.json rename to web/i18n/locales/uk-UA/dataset-creation.json diff --git a/web/i18n/uk-UA/dataset-documents.json b/web/i18n/locales/uk-UA/dataset-documents.json similarity index 100% rename from web/i18n/uk-UA/dataset-documents.json rename to web/i18n/locales/uk-UA/dataset-documents.json diff --git a/web/i18n/uk-UA/dataset-hit-testing.json b/web/i18n/locales/uk-UA/dataset-hit-testing.json similarity index 100% rename from web/i18n/uk-UA/dataset-hit-testing.json rename to web/i18n/locales/uk-UA/dataset-hit-testing.json diff --git a/web/i18n/uk-UA/dataset-pipeline.json b/web/i18n/locales/uk-UA/dataset-pipeline.json similarity index 100% rename from web/i18n/uk-UA/dataset-pipeline.json rename to web/i18n/locales/uk-UA/dataset-pipeline.json diff --git a/web/i18n/uk-UA/dataset-settings.json b/web/i18n/locales/uk-UA/dataset-settings.json similarity index 100% rename from web/i18n/uk-UA/dataset-settings.json rename to web/i18n/locales/uk-UA/dataset-settings.json diff --git a/web/i18n/uk-UA/dataset.json b/web/i18n/locales/uk-UA/dataset.json similarity index 100% rename from web/i18n/uk-UA/dataset.json rename to web/i18n/locales/uk-UA/dataset.json diff --git a/web/i18n/uk-UA/deployments.json b/web/i18n/locales/uk-UA/deployments.json similarity index 100% rename from web/i18n/uk-UA/deployments.json rename to web/i18n/locales/uk-UA/deployments.json diff --git a/web/i18n/uk-UA/device-flow.json b/web/i18n/locales/uk-UA/device-flow.json similarity index 100% rename from web/i18n/uk-UA/device-flow.json rename to web/i18n/locales/uk-UA/device-flow.json diff --git a/web/i18n/uk-UA/education.json b/web/i18n/locales/uk-UA/education.json similarity index 100% rename from web/i18n/uk-UA/education.json rename to web/i18n/locales/uk-UA/education.json diff --git a/web/i18n/uk-UA/explore.json b/web/i18n/locales/uk-UA/explore.json similarity index 100% rename from web/i18n/uk-UA/explore.json rename to web/i18n/locales/uk-UA/explore.json diff --git a/web/i18n/uk-UA/layout.json b/web/i18n/locales/uk-UA/layout.json similarity index 100% rename from web/i18n/uk-UA/layout.json rename to web/i18n/locales/uk-UA/layout.json diff --git a/web/i18n/uk-UA/login.json b/web/i18n/locales/uk-UA/login.json similarity index 100% rename from web/i18n/uk-UA/login.json rename to web/i18n/locales/uk-UA/login.json diff --git a/web/i18n/uk-UA/oauth.json b/web/i18n/locales/uk-UA/oauth.json similarity index 100% rename from web/i18n/uk-UA/oauth.json rename to web/i18n/locales/uk-UA/oauth.json diff --git a/web/i18n/uk-UA/permission-keys.json b/web/i18n/locales/uk-UA/permission-keys.json similarity index 100% rename from web/i18n/uk-UA/permission-keys.json rename to web/i18n/locales/uk-UA/permission-keys.json diff --git a/web/i18n/uk-UA/permission.json b/web/i18n/locales/uk-UA/permission.json similarity index 100% rename from web/i18n/uk-UA/permission.json rename to web/i18n/locales/uk-UA/permission.json diff --git a/web/i18n/uk-UA/pipeline.json b/web/i18n/locales/uk-UA/pipeline.json similarity index 100% rename from web/i18n/uk-UA/pipeline.json rename to web/i18n/locales/uk-UA/pipeline.json diff --git a/web/i18n/uk-UA/plugin-tags.json b/web/i18n/locales/uk-UA/plugin-tags.json similarity index 100% rename from web/i18n/uk-UA/plugin-tags.json rename to web/i18n/locales/uk-UA/plugin-tags.json diff --git a/web/i18n/uk-UA/plugin-trigger.json b/web/i18n/locales/uk-UA/plugin-trigger.json similarity index 100% rename from web/i18n/uk-UA/plugin-trigger.json rename to web/i18n/locales/uk-UA/plugin-trigger.json diff --git a/web/i18n/uk-UA/plugin.json b/web/i18n/locales/uk-UA/plugin.json similarity index 100% rename from web/i18n/uk-UA/plugin.json rename to web/i18n/locales/uk-UA/plugin.json diff --git a/web/i18n/uk-UA/register.json b/web/i18n/locales/uk-UA/register.json similarity index 100% rename from web/i18n/uk-UA/register.json rename to web/i18n/locales/uk-UA/register.json diff --git a/web/i18n/uk-UA/run-log.json b/web/i18n/locales/uk-UA/run-log.json similarity index 100% rename from web/i18n/uk-UA/run-log.json rename to web/i18n/locales/uk-UA/run-log.json diff --git a/web/i18n/uk-UA/share.json b/web/i18n/locales/uk-UA/share.json similarity index 100% rename from web/i18n/uk-UA/share.json rename to web/i18n/locales/uk-UA/share.json diff --git a/web/i18n/uk-UA/skill.json b/web/i18n/locales/uk-UA/skill.json similarity index 100% rename from web/i18n/uk-UA/skill.json rename to web/i18n/locales/uk-UA/skill.json diff --git a/web/i18n/uk-UA/snippet.json b/web/i18n/locales/uk-UA/snippet.json similarity index 100% rename from web/i18n/uk-UA/snippet.json rename to web/i18n/locales/uk-UA/snippet.json diff --git a/web/i18n/uk-UA/time.json b/web/i18n/locales/uk-UA/time.json similarity index 100% rename from web/i18n/uk-UA/time.json rename to web/i18n/locales/uk-UA/time.json diff --git a/web/i18n/uk-UA/tools.json b/web/i18n/locales/uk-UA/tools.json similarity index 100% rename from web/i18n/uk-UA/tools.json rename to web/i18n/locales/uk-UA/tools.json diff --git a/web/i18n/uk-UA/workflow.json b/web/i18n/locales/uk-UA/workflow.json similarity index 100% rename from web/i18n/uk-UA/workflow.json rename to web/i18n/locales/uk-UA/workflow.json diff --git a/web/i18n/vi-VN/agent-v-2.json b/web/i18n/locales/vi-VN/agent-v-2.json similarity index 100% rename from web/i18n/vi-VN/agent-v-2.json rename to web/i18n/locales/vi-VN/agent-v-2.json diff --git a/web/i18n/vi-VN/app-annotation.json b/web/i18n/locales/vi-VN/app-annotation.json similarity index 100% rename from web/i18n/vi-VN/app-annotation.json rename to web/i18n/locales/vi-VN/app-annotation.json diff --git a/web/i18n/vi-VN/app-api.json b/web/i18n/locales/vi-VN/app-api.json similarity index 100% rename from web/i18n/vi-VN/app-api.json rename to web/i18n/locales/vi-VN/app-api.json diff --git a/web/i18n/vi-VN/app-debug.json b/web/i18n/locales/vi-VN/app-debug.json similarity index 100% rename from web/i18n/vi-VN/app-debug.json rename to web/i18n/locales/vi-VN/app-debug.json diff --git a/web/i18n/vi-VN/app-log.json b/web/i18n/locales/vi-VN/app-log.json similarity index 100% rename from web/i18n/vi-VN/app-log.json rename to web/i18n/locales/vi-VN/app-log.json diff --git a/web/i18n/vi-VN/app-overview.json b/web/i18n/locales/vi-VN/app-overview.json similarity index 100% rename from web/i18n/vi-VN/app-overview.json rename to web/i18n/locales/vi-VN/app-overview.json diff --git a/web/i18n/vi-VN/app.json b/web/i18n/locales/vi-VN/app.json similarity index 100% rename from web/i18n/vi-VN/app.json rename to web/i18n/locales/vi-VN/app.json diff --git a/web/i18n/vi-VN/billing.json b/web/i18n/locales/vi-VN/billing.json similarity index 100% rename from web/i18n/vi-VN/billing.json rename to web/i18n/locales/vi-VN/billing.json diff --git a/web/i18n/vi-VN/common.json b/web/i18n/locales/vi-VN/common.json similarity index 100% rename from web/i18n/vi-VN/common.json rename to web/i18n/locales/vi-VN/common.json diff --git a/web/i18n/vi-VN/custom.json b/web/i18n/locales/vi-VN/custom.json similarity index 100% rename from web/i18n/vi-VN/custom.json rename to web/i18n/locales/vi-VN/custom.json diff --git a/web/i18n/vi-VN/dataset-creation.json b/web/i18n/locales/vi-VN/dataset-creation.json similarity index 100% rename from web/i18n/vi-VN/dataset-creation.json rename to web/i18n/locales/vi-VN/dataset-creation.json diff --git a/web/i18n/vi-VN/dataset-documents.json b/web/i18n/locales/vi-VN/dataset-documents.json similarity index 100% rename from web/i18n/vi-VN/dataset-documents.json rename to web/i18n/locales/vi-VN/dataset-documents.json diff --git a/web/i18n/vi-VN/dataset-hit-testing.json b/web/i18n/locales/vi-VN/dataset-hit-testing.json similarity index 100% rename from web/i18n/vi-VN/dataset-hit-testing.json rename to web/i18n/locales/vi-VN/dataset-hit-testing.json diff --git a/web/i18n/vi-VN/dataset-pipeline.json b/web/i18n/locales/vi-VN/dataset-pipeline.json similarity index 100% rename from web/i18n/vi-VN/dataset-pipeline.json rename to web/i18n/locales/vi-VN/dataset-pipeline.json diff --git a/web/i18n/vi-VN/dataset-settings.json b/web/i18n/locales/vi-VN/dataset-settings.json similarity index 100% rename from web/i18n/vi-VN/dataset-settings.json rename to web/i18n/locales/vi-VN/dataset-settings.json diff --git a/web/i18n/vi-VN/dataset.json b/web/i18n/locales/vi-VN/dataset.json similarity index 100% rename from web/i18n/vi-VN/dataset.json rename to web/i18n/locales/vi-VN/dataset.json diff --git a/web/i18n/vi-VN/deployments.json b/web/i18n/locales/vi-VN/deployments.json similarity index 100% rename from web/i18n/vi-VN/deployments.json rename to web/i18n/locales/vi-VN/deployments.json diff --git a/web/i18n/vi-VN/device-flow.json b/web/i18n/locales/vi-VN/device-flow.json similarity index 100% rename from web/i18n/vi-VN/device-flow.json rename to web/i18n/locales/vi-VN/device-flow.json diff --git a/web/i18n/vi-VN/education.json b/web/i18n/locales/vi-VN/education.json similarity index 100% rename from web/i18n/vi-VN/education.json rename to web/i18n/locales/vi-VN/education.json diff --git a/web/i18n/vi-VN/explore.json b/web/i18n/locales/vi-VN/explore.json similarity index 100% rename from web/i18n/vi-VN/explore.json rename to web/i18n/locales/vi-VN/explore.json diff --git a/web/i18n/vi-VN/layout.json b/web/i18n/locales/vi-VN/layout.json similarity index 100% rename from web/i18n/vi-VN/layout.json rename to web/i18n/locales/vi-VN/layout.json diff --git a/web/i18n/vi-VN/login.json b/web/i18n/locales/vi-VN/login.json similarity index 100% rename from web/i18n/vi-VN/login.json rename to web/i18n/locales/vi-VN/login.json diff --git a/web/i18n/vi-VN/oauth.json b/web/i18n/locales/vi-VN/oauth.json similarity index 100% rename from web/i18n/vi-VN/oauth.json rename to web/i18n/locales/vi-VN/oauth.json diff --git a/web/i18n/vi-VN/permission-keys.json b/web/i18n/locales/vi-VN/permission-keys.json similarity index 100% rename from web/i18n/vi-VN/permission-keys.json rename to web/i18n/locales/vi-VN/permission-keys.json diff --git a/web/i18n/vi-VN/permission.json b/web/i18n/locales/vi-VN/permission.json similarity index 100% rename from web/i18n/vi-VN/permission.json rename to web/i18n/locales/vi-VN/permission.json diff --git a/web/i18n/vi-VN/pipeline.json b/web/i18n/locales/vi-VN/pipeline.json similarity index 100% rename from web/i18n/vi-VN/pipeline.json rename to web/i18n/locales/vi-VN/pipeline.json diff --git a/web/i18n/vi-VN/plugin-tags.json b/web/i18n/locales/vi-VN/plugin-tags.json similarity index 100% rename from web/i18n/vi-VN/plugin-tags.json rename to web/i18n/locales/vi-VN/plugin-tags.json diff --git a/web/i18n/vi-VN/plugin-trigger.json b/web/i18n/locales/vi-VN/plugin-trigger.json similarity index 100% rename from web/i18n/vi-VN/plugin-trigger.json rename to web/i18n/locales/vi-VN/plugin-trigger.json diff --git a/web/i18n/vi-VN/plugin.json b/web/i18n/locales/vi-VN/plugin.json similarity index 100% rename from web/i18n/vi-VN/plugin.json rename to web/i18n/locales/vi-VN/plugin.json diff --git a/web/i18n/vi-VN/register.json b/web/i18n/locales/vi-VN/register.json similarity index 100% rename from web/i18n/vi-VN/register.json rename to web/i18n/locales/vi-VN/register.json diff --git a/web/i18n/vi-VN/run-log.json b/web/i18n/locales/vi-VN/run-log.json similarity index 100% rename from web/i18n/vi-VN/run-log.json rename to web/i18n/locales/vi-VN/run-log.json diff --git a/web/i18n/vi-VN/share.json b/web/i18n/locales/vi-VN/share.json similarity index 100% rename from web/i18n/vi-VN/share.json rename to web/i18n/locales/vi-VN/share.json diff --git a/web/i18n/vi-VN/skill.json b/web/i18n/locales/vi-VN/skill.json similarity index 100% rename from web/i18n/vi-VN/skill.json rename to web/i18n/locales/vi-VN/skill.json diff --git a/web/i18n/vi-VN/snippet.json b/web/i18n/locales/vi-VN/snippet.json similarity index 100% rename from web/i18n/vi-VN/snippet.json rename to web/i18n/locales/vi-VN/snippet.json diff --git a/web/i18n/vi-VN/time.json b/web/i18n/locales/vi-VN/time.json similarity index 100% rename from web/i18n/vi-VN/time.json rename to web/i18n/locales/vi-VN/time.json diff --git a/web/i18n/vi-VN/tools.json b/web/i18n/locales/vi-VN/tools.json similarity index 100% rename from web/i18n/vi-VN/tools.json rename to web/i18n/locales/vi-VN/tools.json diff --git a/web/i18n/vi-VN/workflow.json b/web/i18n/locales/vi-VN/workflow.json similarity index 100% rename from web/i18n/vi-VN/workflow.json rename to web/i18n/locales/vi-VN/workflow.json diff --git a/web/i18n/zh-Hans/agent-v-2.json b/web/i18n/locales/zh-Hans/agent-v-2.json similarity index 100% rename from web/i18n/zh-Hans/agent-v-2.json rename to web/i18n/locales/zh-Hans/agent-v-2.json diff --git a/web/i18n/zh-Hans/app-annotation.json b/web/i18n/locales/zh-Hans/app-annotation.json similarity index 100% rename from web/i18n/zh-Hans/app-annotation.json rename to web/i18n/locales/zh-Hans/app-annotation.json diff --git a/web/i18n/zh-Hans/app-api.json b/web/i18n/locales/zh-Hans/app-api.json similarity index 100% rename from web/i18n/zh-Hans/app-api.json rename to web/i18n/locales/zh-Hans/app-api.json diff --git a/web/i18n/zh-Hans/app-debug.json b/web/i18n/locales/zh-Hans/app-debug.json similarity index 100% rename from web/i18n/zh-Hans/app-debug.json rename to web/i18n/locales/zh-Hans/app-debug.json diff --git a/web/i18n/zh-Hans/app-log.json b/web/i18n/locales/zh-Hans/app-log.json similarity index 100% rename from web/i18n/zh-Hans/app-log.json rename to web/i18n/locales/zh-Hans/app-log.json diff --git a/web/i18n/zh-Hans/app-overview.json b/web/i18n/locales/zh-Hans/app-overview.json similarity index 100% rename from web/i18n/zh-Hans/app-overview.json rename to web/i18n/locales/zh-Hans/app-overview.json diff --git a/web/i18n/zh-Hans/app.json b/web/i18n/locales/zh-Hans/app.json similarity index 100% rename from web/i18n/zh-Hans/app.json rename to web/i18n/locales/zh-Hans/app.json diff --git a/web/i18n/zh-Hans/billing.json b/web/i18n/locales/zh-Hans/billing.json similarity index 100% rename from web/i18n/zh-Hans/billing.json rename to web/i18n/locales/zh-Hans/billing.json diff --git a/web/i18n/zh-Hans/common.json b/web/i18n/locales/zh-Hans/common.json similarity index 100% rename from web/i18n/zh-Hans/common.json rename to web/i18n/locales/zh-Hans/common.json diff --git a/web/i18n/zh-Hans/custom.json b/web/i18n/locales/zh-Hans/custom.json similarity index 100% rename from web/i18n/zh-Hans/custom.json rename to web/i18n/locales/zh-Hans/custom.json diff --git a/web/i18n/zh-Hans/dataset-creation.json b/web/i18n/locales/zh-Hans/dataset-creation.json similarity index 100% rename from web/i18n/zh-Hans/dataset-creation.json rename to web/i18n/locales/zh-Hans/dataset-creation.json diff --git a/web/i18n/zh-Hans/dataset-documents.json b/web/i18n/locales/zh-Hans/dataset-documents.json similarity index 100% rename from web/i18n/zh-Hans/dataset-documents.json rename to web/i18n/locales/zh-Hans/dataset-documents.json diff --git a/web/i18n/zh-Hans/dataset-hit-testing.json b/web/i18n/locales/zh-Hans/dataset-hit-testing.json similarity index 100% rename from web/i18n/zh-Hans/dataset-hit-testing.json rename to web/i18n/locales/zh-Hans/dataset-hit-testing.json diff --git a/web/i18n/zh-Hans/dataset-pipeline.json b/web/i18n/locales/zh-Hans/dataset-pipeline.json similarity index 100% rename from web/i18n/zh-Hans/dataset-pipeline.json rename to web/i18n/locales/zh-Hans/dataset-pipeline.json diff --git a/web/i18n/zh-Hans/dataset-settings.json b/web/i18n/locales/zh-Hans/dataset-settings.json similarity index 100% rename from web/i18n/zh-Hans/dataset-settings.json rename to web/i18n/locales/zh-Hans/dataset-settings.json diff --git a/web/i18n/zh-Hans/dataset.json b/web/i18n/locales/zh-Hans/dataset.json similarity index 100% rename from web/i18n/zh-Hans/dataset.json rename to web/i18n/locales/zh-Hans/dataset.json diff --git a/web/i18n/zh-Hans/deployments.json b/web/i18n/locales/zh-Hans/deployments.json similarity index 100% rename from web/i18n/zh-Hans/deployments.json rename to web/i18n/locales/zh-Hans/deployments.json diff --git a/web/i18n/zh-Hans/device-flow.json b/web/i18n/locales/zh-Hans/device-flow.json similarity index 100% rename from web/i18n/zh-Hans/device-flow.json rename to web/i18n/locales/zh-Hans/device-flow.json diff --git a/web/i18n/zh-Hans/education.json b/web/i18n/locales/zh-Hans/education.json similarity index 100% rename from web/i18n/zh-Hans/education.json rename to web/i18n/locales/zh-Hans/education.json diff --git a/web/i18n/zh-Hans/explore.json b/web/i18n/locales/zh-Hans/explore.json similarity index 100% rename from web/i18n/zh-Hans/explore.json rename to web/i18n/locales/zh-Hans/explore.json diff --git a/web/i18n/zh-Hans/layout.json b/web/i18n/locales/zh-Hans/layout.json similarity index 100% rename from web/i18n/zh-Hans/layout.json rename to web/i18n/locales/zh-Hans/layout.json diff --git a/web/i18n/zh-Hans/login.json b/web/i18n/locales/zh-Hans/login.json similarity index 100% rename from web/i18n/zh-Hans/login.json rename to web/i18n/locales/zh-Hans/login.json diff --git a/web/i18n/zh-Hans/oauth.json b/web/i18n/locales/zh-Hans/oauth.json similarity index 100% rename from web/i18n/zh-Hans/oauth.json rename to web/i18n/locales/zh-Hans/oauth.json diff --git a/web/i18n/zh-Hans/permission-keys.json b/web/i18n/locales/zh-Hans/permission-keys.json similarity index 100% rename from web/i18n/zh-Hans/permission-keys.json rename to web/i18n/locales/zh-Hans/permission-keys.json diff --git a/web/i18n/zh-Hans/permission.json b/web/i18n/locales/zh-Hans/permission.json similarity index 100% rename from web/i18n/zh-Hans/permission.json rename to web/i18n/locales/zh-Hans/permission.json diff --git a/web/i18n/zh-Hans/pipeline.json b/web/i18n/locales/zh-Hans/pipeline.json similarity index 100% rename from web/i18n/zh-Hans/pipeline.json rename to web/i18n/locales/zh-Hans/pipeline.json diff --git a/web/i18n/zh-Hans/plugin-tags.json b/web/i18n/locales/zh-Hans/plugin-tags.json similarity index 100% rename from web/i18n/zh-Hans/plugin-tags.json rename to web/i18n/locales/zh-Hans/plugin-tags.json diff --git a/web/i18n/zh-Hans/plugin-trigger.json b/web/i18n/locales/zh-Hans/plugin-trigger.json similarity index 100% rename from web/i18n/zh-Hans/plugin-trigger.json rename to web/i18n/locales/zh-Hans/plugin-trigger.json diff --git a/web/i18n/zh-Hans/plugin.json b/web/i18n/locales/zh-Hans/plugin.json similarity index 100% rename from web/i18n/zh-Hans/plugin.json rename to web/i18n/locales/zh-Hans/plugin.json diff --git a/web/i18n/zh-Hans/register.json b/web/i18n/locales/zh-Hans/register.json similarity index 100% rename from web/i18n/zh-Hans/register.json rename to web/i18n/locales/zh-Hans/register.json diff --git a/web/i18n/zh-Hans/run-log.json b/web/i18n/locales/zh-Hans/run-log.json similarity index 100% rename from web/i18n/zh-Hans/run-log.json rename to web/i18n/locales/zh-Hans/run-log.json diff --git a/web/i18n/zh-Hans/share.json b/web/i18n/locales/zh-Hans/share.json similarity index 100% rename from web/i18n/zh-Hans/share.json rename to web/i18n/locales/zh-Hans/share.json diff --git a/web/i18n/zh-Hans/skill.json b/web/i18n/locales/zh-Hans/skill.json similarity index 100% rename from web/i18n/zh-Hans/skill.json rename to web/i18n/locales/zh-Hans/skill.json diff --git a/web/i18n/zh-Hans/snippet.json b/web/i18n/locales/zh-Hans/snippet.json similarity index 100% rename from web/i18n/zh-Hans/snippet.json rename to web/i18n/locales/zh-Hans/snippet.json diff --git a/web/i18n/zh-Hans/time.json b/web/i18n/locales/zh-Hans/time.json similarity index 100% rename from web/i18n/zh-Hans/time.json rename to web/i18n/locales/zh-Hans/time.json diff --git a/web/i18n/zh-Hans/tools.json b/web/i18n/locales/zh-Hans/tools.json similarity index 100% rename from web/i18n/zh-Hans/tools.json rename to web/i18n/locales/zh-Hans/tools.json diff --git a/web/i18n/zh-Hans/workflow.json b/web/i18n/locales/zh-Hans/workflow.json similarity index 100% rename from web/i18n/zh-Hans/workflow.json rename to web/i18n/locales/zh-Hans/workflow.json diff --git a/web/i18n/zh-Hant/agent-v-2.json b/web/i18n/locales/zh-Hant/agent-v-2.json similarity index 100% rename from web/i18n/zh-Hant/agent-v-2.json rename to web/i18n/locales/zh-Hant/agent-v-2.json diff --git a/web/i18n/zh-Hant/app-annotation.json b/web/i18n/locales/zh-Hant/app-annotation.json similarity index 100% rename from web/i18n/zh-Hant/app-annotation.json rename to web/i18n/locales/zh-Hant/app-annotation.json diff --git a/web/i18n/zh-Hant/app-api.json b/web/i18n/locales/zh-Hant/app-api.json similarity index 100% rename from web/i18n/zh-Hant/app-api.json rename to web/i18n/locales/zh-Hant/app-api.json diff --git a/web/i18n/zh-Hant/app-debug.json b/web/i18n/locales/zh-Hant/app-debug.json similarity index 100% rename from web/i18n/zh-Hant/app-debug.json rename to web/i18n/locales/zh-Hant/app-debug.json diff --git a/web/i18n/zh-Hant/app-log.json b/web/i18n/locales/zh-Hant/app-log.json similarity index 100% rename from web/i18n/zh-Hant/app-log.json rename to web/i18n/locales/zh-Hant/app-log.json diff --git a/web/i18n/zh-Hant/app-overview.json b/web/i18n/locales/zh-Hant/app-overview.json similarity index 100% rename from web/i18n/zh-Hant/app-overview.json rename to web/i18n/locales/zh-Hant/app-overview.json diff --git a/web/i18n/zh-Hant/app.json b/web/i18n/locales/zh-Hant/app.json similarity index 100% rename from web/i18n/zh-Hant/app.json rename to web/i18n/locales/zh-Hant/app.json diff --git a/web/i18n/zh-Hant/billing.json b/web/i18n/locales/zh-Hant/billing.json similarity index 100% rename from web/i18n/zh-Hant/billing.json rename to web/i18n/locales/zh-Hant/billing.json diff --git a/web/i18n/zh-Hant/common.json b/web/i18n/locales/zh-Hant/common.json similarity index 100% rename from web/i18n/zh-Hant/common.json rename to web/i18n/locales/zh-Hant/common.json diff --git a/web/i18n/zh-Hant/custom.json b/web/i18n/locales/zh-Hant/custom.json similarity index 100% rename from web/i18n/zh-Hant/custom.json rename to web/i18n/locales/zh-Hant/custom.json diff --git a/web/i18n/zh-Hant/dataset-creation.json b/web/i18n/locales/zh-Hant/dataset-creation.json similarity index 100% rename from web/i18n/zh-Hant/dataset-creation.json rename to web/i18n/locales/zh-Hant/dataset-creation.json diff --git a/web/i18n/zh-Hant/dataset-documents.json b/web/i18n/locales/zh-Hant/dataset-documents.json similarity index 100% rename from web/i18n/zh-Hant/dataset-documents.json rename to web/i18n/locales/zh-Hant/dataset-documents.json diff --git a/web/i18n/zh-Hant/dataset-hit-testing.json b/web/i18n/locales/zh-Hant/dataset-hit-testing.json similarity index 100% rename from web/i18n/zh-Hant/dataset-hit-testing.json rename to web/i18n/locales/zh-Hant/dataset-hit-testing.json diff --git a/web/i18n/zh-Hant/dataset-pipeline.json b/web/i18n/locales/zh-Hant/dataset-pipeline.json similarity index 100% rename from web/i18n/zh-Hant/dataset-pipeline.json rename to web/i18n/locales/zh-Hant/dataset-pipeline.json diff --git a/web/i18n/zh-Hant/dataset-settings.json b/web/i18n/locales/zh-Hant/dataset-settings.json similarity index 100% rename from web/i18n/zh-Hant/dataset-settings.json rename to web/i18n/locales/zh-Hant/dataset-settings.json diff --git a/web/i18n/zh-Hant/dataset.json b/web/i18n/locales/zh-Hant/dataset.json similarity index 100% rename from web/i18n/zh-Hant/dataset.json rename to web/i18n/locales/zh-Hant/dataset.json diff --git a/web/i18n/zh-Hant/deployments.json b/web/i18n/locales/zh-Hant/deployments.json similarity index 100% rename from web/i18n/zh-Hant/deployments.json rename to web/i18n/locales/zh-Hant/deployments.json diff --git a/web/i18n/zh-Hant/device-flow.json b/web/i18n/locales/zh-Hant/device-flow.json similarity index 100% rename from web/i18n/zh-Hant/device-flow.json rename to web/i18n/locales/zh-Hant/device-flow.json diff --git a/web/i18n/zh-Hant/education.json b/web/i18n/locales/zh-Hant/education.json similarity index 100% rename from web/i18n/zh-Hant/education.json rename to web/i18n/locales/zh-Hant/education.json diff --git a/web/i18n/zh-Hant/explore.json b/web/i18n/locales/zh-Hant/explore.json similarity index 100% rename from web/i18n/zh-Hant/explore.json rename to web/i18n/locales/zh-Hant/explore.json diff --git a/web/i18n/zh-Hant/layout.json b/web/i18n/locales/zh-Hant/layout.json similarity index 100% rename from web/i18n/zh-Hant/layout.json rename to web/i18n/locales/zh-Hant/layout.json diff --git a/web/i18n/zh-Hant/login.json b/web/i18n/locales/zh-Hant/login.json similarity index 100% rename from web/i18n/zh-Hant/login.json rename to web/i18n/locales/zh-Hant/login.json diff --git a/web/i18n/zh-Hant/oauth.json b/web/i18n/locales/zh-Hant/oauth.json similarity index 100% rename from web/i18n/zh-Hant/oauth.json rename to web/i18n/locales/zh-Hant/oauth.json diff --git a/web/i18n/zh-Hant/permission-keys.json b/web/i18n/locales/zh-Hant/permission-keys.json similarity index 100% rename from web/i18n/zh-Hant/permission-keys.json rename to web/i18n/locales/zh-Hant/permission-keys.json diff --git a/web/i18n/zh-Hant/permission.json b/web/i18n/locales/zh-Hant/permission.json similarity index 100% rename from web/i18n/zh-Hant/permission.json rename to web/i18n/locales/zh-Hant/permission.json diff --git a/web/i18n/zh-Hant/pipeline.json b/web/i18n/locales/zh-Hant/pipeline.json similarity index 100% rename from web/i18n/zh-Hant/pipeline.json rename to web/i18n/locales/zh-Hant/pipeline.json diff --git a/web/i18n/zh-Hant/plugin-tags.json b/web/i18n/locales/zh-Hant/plugin-tags.json similarity index 100% rename from web/i18n/zh-Hant/plugin-tags.json rename to web/i18n/locales/zh-Hant/plugin-tags.json diff --git a/web/i18n/zh-Hant/plugin-trigger.json b/web/i18n/locales/zh-Hant/plugin-trigger.json similarity index 100% rename from web/i18n/zh-Hant/plugin-trigger.json rename to web/i18n/locales/zh-Hant/plugin-trigger.json diff --git a/web/i18n/zh-Hant/plugin.json b/web/i18n/locales/zh-Hant/plugin.json similarity index 100% rename from web/i18n/zh-Hant/plugin.json rename to web/i18n/locales/zh-Hant/plugin.json diff --git a/web/i18n/zh-Hant/register.json b/web/i18n/locales/zh-Hant/register.json similarity index 100% rename from web/i18n/zh-Hant/register.json rename to web/i18n/locales/zh-Hant/register.json diff --git a/web/i18n/zh-Hant/run-log.json b/web/i18n/locales/zh-Hant/run-log.json similarity index 100% rename from web/i18n/zh-Hant/run-log.json rename to web/i18n/locales/zh-Hant/run-log.json diff --git a/web/i18n/zh-Hant/share.json b/web/i18n/locales/zh-Hant/share.json similarity index 100% rename from web/i18n/zh-Hant/share.json rename to web/i18n/locales/zh-Hant/share.json diff --git a/web/i18n/zh-Hant/skill.json b/web/i18n/locales/zh-Hant/skill.json similarity index 100% rename from web/i18n/zh-Hant/skill.json rename to web/i18n/locales/zh-Hant/skill.json diff --git a/web/i18n/zh-Hant/snippet.json b/web/i18n/locales/zh-Hant/snippet.json similarity index 100% rename from web/i18n/zh-Hant/snippet.json rename to web/i18n/locales/zh-Hant/snippet.json diff --git a/web/i18n/zh-Hant/time.json b/web/i18n/locales/zh-Hant/time.json similarity index 100% rename from web/i18n/zh-Hant/time.json rename to web/i18n/locales/zh-Hant/time.json diff --git a/web/i18n/zh-Hant/tools.json b/web/i18n/locales/zh-Hant/tools.json similarity index 100% rename from web/i18n/zh-Hant/tools.json rename to web/i18n/locales/zh-Hant/tools.json diff --git a/web/i18n/zh-Hant/workflow.json b/web/i18n/locales/zh-Hant/workflow.json similarity index 100% rename from web/i18n/zh-Hant/workflow.json rename to web/i18n/locales/zh-Hant/workflow.json diff --git a/web/i18n-config/metadata.ts b/web/i18n/metadata.ts similarity index 100% rename from web/i18n-config/metadata.ts rename to web/i18n/metadata.ts diff --git a/web/i18n-config/resources.ts b/web/i18n/resources.ts similarity index 63% rename from web/i18n-config/resources.ts rename to web/i18n/resources.ts index cdd72e747f7..6447c457510 100644 --- a/web/i18n-config/resources.ts +++ b/web/i18n/resources.ts @@ -1,40 +1,40 @@ -import type agentV2 from '../i18n/en-US/agent-v-2.json' -import type appAnnotation from '../i18n/en-US/app-annotation.json' -import type appApi from '../i18n/en-US/app-api.json' -import type appDebug from '../i18n/en-US/app-debug.json' -import type appLog from '../i18n/en-US/app-log.json' -import type appOverview from '../i18n/en-US/app-overview.json' -import type app from '../i18n/en-US/app.json' -import type billing from '../i18n/en-US/billing.json' -import type common from '../i18n/en-US/common.json' -import type custom from '../i18n/en-US/custom.json' -import type datasetCreation from '../i18n/en-US/dataset-creation.json' -import type datasetDocuments from '../i18n/en-US/dataset-documents.json' -import type datasetHitTesting from '../i18n/en-US/dataset-hit-testing.json' -import type datasetPipeline from '../i18n/en-US/dataset-pipeline.json' -import type datasetSettings from '../i18n/en-US/dataset-settings.json' -import type dataset from '../i18n/en-US/dataset.json' -import type deployments from '../i18n/en-US/deployments.json' -import type deviceFlow from '../i18n/en-US/device-flow.json' -import type education from '../i18n/en-US/education.json' -import type explore from '../i18n/en-US/explore.json' -import type layout from '../i18n/en-US/layout.json' -import type login from '../i18n/en-US/login.json' -import type oauth from '../i18n/en-US/oauth.json' -import type permissionKeys from '../i18n/en-US/permission-keys.json' -import type permission from '../i18n/en-US/permission.json' -import type pipeline from '../i18n/en-US/pipeline.json' -import type pluginTags from '../i18n/en-US/plugin-tags.json' -import type pluginTrigger from '../i18n/en-US/plugin-trigger.json' -import type plugin from '../i18n/en-US/plugin.json' -import type register from '../i18n/en-US/register.json' -import type runLog from '../i18n/en-US/run-log.json' -import type share from '../i18n/en-US/share.json' -import type skill from '../i18n/en-US/skill.json' -import type snippet from '../i18n/en-US/snippet.json' -import type time from '../i18n/en-US/time.json' -import type tools from '../i18n/en-US/tools.json' -import type workflow from '../i18n/en-US/workflow.json' +import type agentV2 from './locales/en-US/agent-v-2.json' +import type appAnnotation from './locales/en-US/app-annotation.json' +import type appApi from './locales/en-US/app-api.json' +import type appDebug from './locales/en-US/app-debug.json' +import type appLog from './locales/en-US/app-log.json' +import type appOverview from './locales/en-US/app-overview.json' +import type app from './locales/en-US/app.json' +import type billing from './locales/en-US/billing.json' +import type common from './locales/en-US/common.json' +import type custom from './locales/en-US/custom.json' +import type datasetCreation from './locales/en-US/dataset-creation.json' +import type datasetDocuments from './locales/en-US/dataset-documents.json' +import type datasetHitTesting from './locales/en-US/dataset-hit-testing.json' +import type datasetPipeline from './locales/en-US/dataset-pipeline.json' +import type datasetSettings from './locales/en-US/dataset-settings.json' +import type dataset from './locales/en-US/dataset.json' +import type deployments from './locales/en-US/deployments.json' +import type deviceFlow from './locales/en-US/device-flow.json' +import type education from './locales/en-US/education.json' +import type explore from './locales/en-US/explore.json' +import type layout from './locales/en-US/layout.json' +import type login from './locales/en-US/login.json' +import type oauth from './locales/en-US/oauth.json' +import type permissionKeys from './locales/en-US/permission-keys.json' +import type permission from './locales/en-US/permission.json' +import type pipeline from './locales/en-US/pipeline.json' +import type pluginTags from './locales/en-US/plugin-tags.json' +import type pluginTrigger from './locales/en-US/plugin-trigger.json' +import type plugin from './locales/en-US/plugin.json' +import type register from './locales/en-US/register.json' +import type runLog from './locales/en-US/run-log.json' +import type share from './locales/en-US/share.json' +import type skill from './locales/en-US/skill.json' +import type snippet from './locales/en-US/snippet.json' +import type time from './locales/en-US/time.json' +import type tools from './locales/en-US/tools.json' +import type workflow from './locales/en-US/workflow.json' import { kebabCase } from 'string-ts' type RawResources = { diff --git a/web/i18n-config/server.ts b/web/i18n/server.ts similarity index 100% rename from web/i18n-config/server.ts rename to web/i18n/server.ts diff --git a/web/i18n-config/settings.ts b/web/i18n/settings.ts similarity index 100% rename from web/i18n-config/settings.ts rename to web/i18n/settings.ts diff --git a/web/models/access-control.ts b/web/models/access-control.ts index 72b7a1a4457..346c351b97d 100644 --- a/web/models/access-control.ts +++ b/web/models/access-control.ts @@ -1,4 +1,4 @@ -import type { AccessControlTemplateLanguage } from '@/i18n-config/language' +import type { AccessControlTemplateLanguage } from '@/i18n/language' export const SubjectType = { GROUP: 'group', diff --git a/web/models/common.ts b/web/models/common.ts index 692cc7c9b0a..1fbf40d6c9a 100644 --- a/web/models/common.ts +++ b/web/models/common.ts @@ -1,6 +1,6 @@ import type { GetAccountProfileResponse } from '@dify/contracts/api/console/account/types.gen' import type { Role } from './access-control' -import type { I18nText } from '@/i18n-config/language' +import type { I18nText } from '@/i18n/language' import type { Model } from '@/types/app' export type CommonResponse = { diff --git a/web/models/share.ts b/web/models/share.ts index 28463103d04..95116aaec1b 100644 --- a/web/models/share.ts +++ b/web/models/share.ts @@ -1,5 +1,5 @@ import type { AppMode } from '@dify/contracts/api/web/types.gen' -import type { Locale } from '@/i18n-config' +import type { Locale } from '@/i18n' import type { AppIconType } from '@/types/app' export type ConversationItem = { diff --git a/web/package.json b/web/package.json index 02249452527..4f87e9aff96 100644 --- a/web/package.json +++ b/web/package.json @@ -5,8 +5,8 @@ "type": "module", "imports": { "#i18n": { - "react-server": "./i18n-config/lib.server.ts", - "default": "./i18n-config/lib.client.ts" + "react-server": "./i18n/lib.server.ts", + "default": "./i18n/lib.client.ts" } }, "scripts": { diff --git a/web/plugins/eslint/rules/no-extra-keys.js b/web/plugins/eslint/rules/no-extra-keys.js index 024693417e5..147bd55dca5 100644 --- a/web/plugins/eslint/rules/no-extra-keys.js +++ b/web/plugins/eslint/rules/no-extra-keys.js @@ -18,7 +18,7 @@ export default { if (!filename.endsWith('.json')) return const parts = normalize(filename).split(sep) - // e.g., i18n/ar-TN/common.json -> jsonFile = common.json, lang = ar-TN + // e.g., i18n/locales/ar-TN/common.json -> jsonFile = common.json, lang = ar-TN const jsonFile = parts.at(-1) const lang = parts.at(-2) @@ -31,7 +31,7 @@ export default { try { currentJson = JSON.parse(sourceCode.text) // Look for the same filename in en-US folder - // e.g., i18n/ar-TN/common.json -> i18n/en-US/common.json + // e.g., i18n/locales/ar-TN/common.json -> i18n/locales/en-US/common.json const englishFilePath = path.join(path.dirname(filename), '..', 'en-US', jsonFile ?? '') englishJson = JSON.parse(fs.readFileSync(englishFilePath, 'utf8')) } catch (error) { diff --git a/web/plugins/vite/__tests__/i18n-graph.spec.ts b/web/plugins/vite/__tests__/i18n-graph.spec.ts index 73f54f237a6..f2f66f305ba 100644 --- a/web/plugins/vite/__tests__/i18n-graph.spec.ts +++ b/web/plugins/vite/__tests__/i18n-graph.spec.ts @@ -38,9 +38,12 @@ describe('translation graph analysis', () => { describe('Usage Analysis', () => { it('resolves generic metadata selectors using the namespace at each call site', () => { - writeJson('i18n/en-US/app.json', { resetPassword: 'Unused app key' }) - writeJson('i18n/en-US/login.json', { resetPassword: 'Reset password', unused: 'Unused' }) - writeJson('i18n/en-US/common.json', { title: 'Title', unused: 'Unused' }) + writeJson('i18n/locales/en-US/app.json', { resetPassword: 'Unused app key' }) + writeJson('i18n/locales/en-US/login.json', { + resetPassword: 'Reset password', + unused: 'Unused', + }) + writeJson('i18n/locales/en-US/common.json', { title: 'Title', unused: 'Unused' }) writeSource( 'src/metadata.ts', ` @@ -67,8 +70,8 @@ describe('translation graph analysis', () => { }) it('keeps possible matches across namespaces when a selector namespace cannot be resolved', () => { - writeJson('i18n/en-US/app.json', { title: 'App', unused: 'Unused' }) - writeJson('i18n/en-US/login.json', { title: 'Login', unused: 'Unused' }) + writeJson('i18n/locales/en-US/app.json', { title: 'App', unused: 'Unused' }) + writeJson('i18n/locales/en-US/login.json', { title: 'Login', unused: 'Unused' }) writeSource( 'src/metadata.ts', ` @@ -87,8 +90,8 @@ describe('translation graph analysis', () => { }) it('protects every possible namespace when the namespace is dynamic', () => { - writeJson('i18n/en-US/app.json', { used: 'App' }) - writeJson('i18n/en-US/common.json', { used: 'Common' }) + writeJson('i18n/locales/en-US/app.json', { used: 'App' }) + writeJson('i18n/locales/en-US/common.json', { used: 'Common' }) writeSource( 'src/dynamic-namespace.ts', ` @@ -107,8 +110,8 @@ describe('translation graph analysis', () => { }) it('matches dynamically namespaced keys without keeping unrelated keys', () => { - writeJson('i18n/en-US/app.json', { used: 'App', unused: 'Unused' }) - writeJson('i18n/en-US/common.json', { used: 'Common', unused: 'Unused' }) + writeJson('i18n/locales/en-US/app.json', { used: 'App', unused: 'Unused' }) + writeJson('i18n/locales/en-US/common.json', { used: 'Common', unused: 'Unused' }) writeSource( 'src/dynamic-namespace.ts', ` @@ -128,7 +131,7 @@ describe('translation graph analysis', () => { it('should keep flat keys selected by t and Trans', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'account.changeEmail.title': 'Change email', 'account.changeEmail.description': 'Description', 'account.changeEmail.unused': 'Unused', @@ -165,10 +168,10 @@ describe('translation graph analysis', () => { it('should use the default namespace for unresolved selectors', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'dynamic.app': 'Dynamic app key', }) - writeJson('i18n/en-US/common.json', { + writeJson('i18n/locales/en-US/common.json', { 'unused.common': 'Unused common key', }) writeSource( @@ -195,7 +198,7 @@ describe('translation graph analysis', () => { it('should resolve selectors stored in variables', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { members_one: '1 member', members_other: '{{count}} members', unused: 'Unused', @@ -224,7 +227,7 @@ describe('translation graph analysis', () => { it('should resolve finite selector maps with computed keys and optional entries', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { first: 'First', second: 'Second', unused: 'Unused', @@ -265,7 +268,7 @@ describe('translation graph analysis', () => { it('should protect a selector map namespace when any candidate is unresolved', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { hidden: 'Potentially used by the dynamic selector', used: 'Used', }) @@ -296,7 +299,7 @@ describe('translation graph analysis', () => { it('should protect known selector properties that dynamic entries can override', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { hidden: 'Potentially used by the dynamic selector', used: 'Used', }) @@ -336,7 +339,7 @@ describe('translation graph analysis', () => { it('should resolve statically computed selector map properties', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { unused: 'Unused', used: 'Used', }) @@ -369,7 +372,7 @@ describe('translation graph analysis', () => { it('should ignore dotted literals passed to unrelated generic functions', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { used: 'Used', unused: 'Unused', }) @@ -399,7 +402,7 @@ describe('translation graph analysis', () => { it('should analyze translation adapter consumers without protecting their namespace', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { used: 'Used', unused: 'Unused', }) @@ -435,10 +438,10 @@ describe('translation graph analysis', () => { it('should infer the namespace of a typed destructured translation parameter', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'unused.app': 'Unused app key', }) - writeJson('i18n/en-US/deployments.json', { + writeJson('i18n/locales/en-US/deployments.json', { unused: 'Unused deployment key', 'versions.deployTo': 'Deploy to {{name}}', }) @@ -471,11 +474,11 @@ describe('translation graph analysis', () => { it('should prefer checker namespaces for a translation parameter named t', () => { // Arrange - writeJson('i18n/en-US/agent-v-2.json', { + writeJson('i18n/locales/en-US/agent-v-2.json', { 'agentDetail.used': 'Used agent key', 'agentDetail.unused': 'Unused agent key', }) - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'unused.app': 'Unused app key', }) writeSource( @@ -506,12 +509,12 @@ describe('translation graph analysis', () => { it('should infer branded TFunction namespaces for direct and destructured parameters', () => { // Arrange - writeJson('i18n/en-US/agent-v-2.json', { + writeJson('i18n/locales/en-US/agent-v-2.json', { 'agentDetail.direct': 'Direct use', 'agentDetail.destructured': 'Destructured use', 'agentDetail.unused': 'Unused agent key', }) - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'unused.app': 'Unused app key', }) writeSource( @@ -545,11 +548,11 @@ describe('translation graph analysis', () => { it('should ignore typed selector forwarding inside an adapter block body', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { unused: 'Unused', used: 'Used', }) - writeJson('i18n/en-US/common.json', { + writeJson('i18n/locales/en-US/common.json', { 'unused.common': 'Unused common key', }) writeSource( @@ -590,7 +593,7 @@ describe('translation graph analysis', () => { it('should ignore a named adapter forwarding its typed selector parameter', () => { // Arrange - writeJson('i18n/en-US/workflow.json', { + writeJson('i18n/locales/en-US/workflow.json', { unused: 'Unused', used: 'Used', }) @@ -632,7 +635,7 @@ describe('translation graph analysis', () => { it('should resolve a selected field from nested selector map entries', () => { // Arrange - writeJson('i18n/en-US/plugin.json', { + writeJson('i18n/locales/en-US/plugin.json', { 'source.first': 'First source', 'source.second': 'Second source', unused: 'Unused', @@ -686,7 +689,7 @@ describe('translation graph analysis', () => { it('should conservatively protect untyped JavaScript translation adapters', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { hidden: 'Potentially used', used: 'Used', }) @@ -713,10 +716,10 @@ describe('translation graph analysis', () => { it('should protect the selected namespace for an open string-key adapter', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'unused.app': 'Unused app', }) - writeJson('i18n/en-US/permission-keys.json', { + writeJson('i18n/locales/en-US/permission-keys.json', { 'server.permission': 'Server permission', }) writeSource( @@ -744,7 +747,7 @@ describe('translation graph analysis', () => { it('should keep keys matching a dynamic selector pattern', () => { // Arrange - writeJson('i18n/en-US/plugin.json', { + writeJson('i18n/locales/en-US/plugin.json', { 'voice.language.enUS': 'English', 'voice.language.zhCN': 'Chinese', unrelated: 'Unrelated', @@ -772,7 +775,7 @@ describe('translation graph analysis', () => { it('should keep selector keys from a typed union', () => { // Arrange - writeJson('i18n/en-US/common.json', { + writeJson('i18n/locales/en-US/common.json', { 'status.ready': 'Ready', 'status.failed': 'Failed', 'status.unused': 'Unused', @@ -802,10 +805,10 @@ describe('translation graph analysis', () => { it('should keep selector keys from secondary namespaces', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'unused.app': 'Unused app', }) - writeJson('i18n/en-US/common.json', { + writeJson('i18n/locales/en-US/common.json', { 'operation.close': 'Close', 'unused.common': 'Unused common', }) @@ -833,10 +836,10 @@ describe('translation graph analysis', () => { it('should keep property and element access selectors from secondary namespaces', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'unused.app': 'Unused app', }) - writeJson('i18n/en-US/common.json', { + writeJson('i18n/locales/en-US/common.json', { close: 'Close', confirm: 'Confirm', unused: 'Unused', @@ -867,10 +870,10 @@ describe('translation graph analysis', () => { it('should only protect the selected namespace for an unresolved selector', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'unused.app': 'Unused app', }) - writeJson('i18n/en-US/common.json', { + writeJson('i18n/locales/en-US/common.json', { 'maybe.used': 'Maybe used', }) writeSource( @@ -897,13 +900,13 @@ describe('translation graph analysis', () => { it('should keep literal keys, aliased t functions, ns options, namespace separators, and Trans keys', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'literal.title': 'Title', withDefault: 'With default', 'trans.shared': 'Shared app', 'unused.app': 'Unused app', }) - writeJson('i18n/en-US/common.json', { + writeJson('i18n/locales/en-US/common.json', { 'operation.close': 'Close', 'trans.shared': 'Shared common', 'unused.common': 'Unused common', @@ -944,7 +947,7 @@ describe('translation graph analysis', () => { it('should expand resolvable dynamic keys and keep matching prefixes for unresolved dynamic keys', () => { // Arrange - writeJson('i18n/en-US/plugin.json', { + writeJson('i18n/locales/en-US/plugin.json', { 'notice.fullMessage': 'Full message', 'notice.reason.bad': 'Bad reason', 'notice.reason.legacy': 'Legacy reason', @@ -981,7 +984,7 @@ describe('translation graph analysis', () => { it('should protect an entire namespace when a dynamic key has no static prefix', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'maybe.used': 'Maybe used', 'otherwise.unused': 'Otherwise unused', }) @@ -1007,7 +1010,7 @@ describe('translation graph analysis', () => { it('should keep typed key prefixes without protecting the whole namespace', () => { // Arrange - writeJson('i18n/en-US/app-debug.json', { + writeJson('i18n/locales/en-US/app-debug.json', { 'duplicateError.name': 'Name', 'duplicateError.value': 'Value', 'outside.unused': 'Outside', @@ -1037,7 +1040,7 @@ describe('translation graph analysis', () => { it('should expand object map values when indexed with a dynamic key', () => { // Arrange - writeJson('i18n/en-US/common.json', { + writeJson('i18n/locales/en-US/common.json', { 'status.ready': 'Ready', 'status.failed': 'Failed', 'status.unused': 'Unused', @@ -1070,7 +1073,7 @@ describe('translation graph analysis', () => { it('should treat simple i18n key identity helpers as their literal argument', () => { // Arrange - writeJson('i18n/en-US/common.json', { + writeJson('i18n/locales/en-US/common.json', { 'mainNav.workspace.searchPlaceholder': 'Search', 'mainNav.workspace.unused': 'Unused', }) @@ -1099,7 +1102,7 @@ describe('translation graph analysis', () => { it('should keep i18next plural variants when the base key is referenced', () => { // Arrange - writeJson('i18n/en-US/deployments.json', { + writeJson('i18n/locales/en-US/deployments.json', { 'overview.environments_one': '1 environment', 'overview.environments_other': '{{count}} environments', 'overview.unused_one': '1 unused', @@ -1128,7 +1131,7 @@ describe('translation graph analysis', () => { it('should infer plural namespaces from typed TFunction parameters', () => { // Arrange - writeJson('i18n/en-US/deployments.json', { + writeJson('i18n/locales/en-US/deployments.json', { 'overview.chip.behind_one': '1 release behind', 'overview.chip.behind_other': '{{count}} releases behind', 'overview.chip.unused_one': '1 unused', @@ -1156,7 +1159,7 @@ describe('translation graph analysis', () => { it('should keep literals when conditional i18n key types expand into unions', () => { // Arrange - writeJson('i18n/en-US/agent-v-2.json', { + writeJson('i18n/locales/en-US/agent-v-2.json', { 'agentDetail.configure.tools.credential.authOne': 'Auth 1', 'agentDetail.configure.tools.unused': 'Unused', }) @@ -1198,7 +1201,7 @@ describe('translation graph analysis', () => { it('should collect keys from i18next instance t calls', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { 'gotoAnything.actions.createChatflow': 'Chatflow', 'gotoAnything.actions.createChatflowDesc': 'Create a chatflow', 'gotoAnything.actions.unused': 'Unused', @@ -1229,16 +1232,16 @@ describe('translation graph analysis', () => { it('should collect keys from imported and parameterized t functions', () => { // Arrange - writeJson('i18n/en-US/app.json', { + writeJson('i18n/locales/en-US/app.json', { noAccessPermission: 'No access', 'typeSelector.chatbot': 'Chatbot', 'unused.app': 'Unused app', }) - writeJson('i18n/en-US/app-api.json', { + writeJson('i18n/locales/en-US/app-api.json', { pause: 'Pause', 'unused.api': 'Unused API', }) - writeJson('i18n/en-US/tools.json', { + writeJson('i18n/locales/en-US/tools.json', { 'mcp.server.publishTip': 'Publish first', 'unused.tools': 'Unused tools', }) diff --git a/web/plugins/vite/__tests__/i18n-prune.spec.ts b/web/plugins/vite/__tests__/i18n-prune.spec.ts index c7bb3252d04..461eadec89b 100644 --- a/web/plugins/vite/__tests__/i18n-prune.spec.ts +++ b/web/plugins/vite/__tests__/i18n-prune.spec.ts @@ -12,8 +12,8 @@ describe('i18n build check', () => { beforeEach(() => { root = realpathSync(mkdtempSync(path.join(tmpdir(), 'dify-i18n-build-'))) - mkdirSync(path.join(root, 'i18n/en-US'), { recursive: true }) - localeFile = path.join(root, 'i18n/en-US/app.json') + mkdirSync(path.join(root, 'i18n/locales/en-US'), { recursive: true }) + localeFile = path.join(root, 'i18n/locales/en-US/app.json') writeFileSync( path.join(root, 'entry.ts'), ` diff --git a/web/plugins/vite/custom-i18n-hmr.ts b/web/plugins/vite/custom-i18n-hmr.ts index 701a187e9b1..db1c77c1280 100644 --- a/web/plugins/vite/custom-i18n-hmr.ts +++ b/web/plugins/vite/custom-i18n-hmr.ts @@ -11,7 +11,7 @@ export const customI18nHmrPlugin = ({ injectTarget }: CustomI18nHmrPluginOptions const i18nHmrClientSnippet = `/* ${i18nHmrClientMarker} */ if (import.meta.hot) { const getI18nUpdateTarget = (file) => { - const match = file.match(/[/\\\\]i18n[/\\\\]([^/\\\\]+)[/\\\\]([^/\\\\]+)\\.json$/) + const match = file.match(/[/\\\\]i18n[/\\\\]locales[/\\\\]([^/\\\\]+)[/\\\\]([^/\\\\]+)\\.json$/) if (!match) return null const [, locale, namespaceFile] = match @@ -53,7 +53,7 @@ if (import.meta.hot) { name: 'custom-i18n-hmr', apply: 'serve', handleHotUpdate({ file, server }) { - if (file.endsWith('.json') && file.includes('/i18n/')) { + if (file.endsWith('.json') && file.includes('/i18n/locales/')) { server.ws.send({ type: 'custom', event: 'i18n-update', diff --git a/web/plugins/vite/i18n-prune.ts b/web/plugins/vite/i18n-prune.ts index 34b7f277d18..ccf8c722d80 100644 --- a/web/plugins/vite/i18n-prune.ts +++ b/web/plugins/vite/i18n-prune.ts @@ -43,7 +43,7 @@ export function i18nPrunePlugin(): Plugin[] { 'This report uses static analysis of the current build module graph and may contain false positives or miss unused keys.', 'Review actual usage before removing any keys.', ...keys.map((key) => ` - ${key}`), - 'Remove confirmed unused keys from web/i18n/ locale files or restore their application usage.', + 'Remove confirmed unused keys from web/i18n/locales/ locale files or restore their application usage.', ...(protectedNamespaces.size ? [ `Dynamic keys protect these namespaces: ${[...protectedNamespaces].sort().join(', ')}`, diff --git a/web/plugins/vite/i18n-prune/graph.ts b/web/plugins/vite/i18n-prune/graph.ts index c11fb915e4d..1069bd3fbce 100644 --- a/web/plugins/vite/i18n-prune/graph.ts +++ b/web/plugins/vite/i18n-prune/graph.ts @@ -56,7 +56,7 @@ function initializer(node: ts.Node): Value | undefined { // expressions but never contribute usage merely by existing on disk. export function checkTranslationGraph(root: string, modules: ReadonlyMap) { const catalog = new Map>() - const directory = path.join(root, 'i18n/en-US') + const directory = path.join(root, 'i18n/locales/en-US') for (const file of fs .readdirSync(directory) .filter((file) => file.endsWith('.json')) diff --git a/web/scripts/__tests__/migrate-i18n-selectors.spec.ts b/web/scripts/__tests__/migrate-i18n-selectors.spec.ts index b7c26c077b6..c1f75bb3bd9 100644 --- a/web/scripts/__tests__/migrate-i18n-selectors.spec.ts +++ b/web/scripts/__tests__/migrate-i18n-selectors.spec.ts @@ -145,7 +145,7 @@ export function translateLegacy(t: any) { it('should follow aliased translation factory bindings without trusting shadowed names', () => { // Arrange const source = `import { useTranslation as useI18n } from 'react-i18next' -import { getTranslation as loadTranslation } from '@/i18n-config/server' +import { getTranslation as loadTranslation } from '@/i18n/server' function renderUnrelated(useI18n: () => { t: (key: string) => string }) { const { t } = useI18n() @@ -164,7 +164,7 @@ export async function Example() { // Assert expect(result.output).toBe(`import { useTranslation as useI18n } from 'react-i18next' -import { getTranslation as loadTranslation } from '@/i18n-config/server' +import { getTranslation as loadTranslation } from '@/i18n/server' function renderUnrelated(useI18n: () => { t: (key: string) => string }) { const { t } = useI18n() diff --git a/web/scripts/analyze-i18n-diff.ts b/web/scripts/analyze-i18n-diff.ts index 7120948c98d..fbe27cd3e07 100644 --- a/web/scripts/analyze-i18n-diff.ts +++ b/web/scripts/analyze-i18n-diff.ts @@ -19,7 +19,7 @@ import { fileURLToPath } from 'node:url' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) -const I18N_DIR = path.join(__dirname, '../i18n/en-US') +const I18N_DIR = path.join(__dirname, '../i18n/locales/en-US') const LOCALE = 'en-US' type TranslationValue = string | string[] @@ -117,7 +117,7 @@ function parseTsContent(content: string): NestedTranslation { */ function getMainBranchFile(filePath: string): string | null { try { - const relativePath = `./i18n/${LOCALE}/${filePath}` + const relativePath = `./i18n/locales/${LOCALE}/${filePath}` return execSync(`git show main:${relativePath}`, { encoding: 'utf-8', @@ -141,7 +141,7 @@ function getTranslationFiles(): string[] { */ function getMainBranchNamespaces(): string[] { try { - const relativePath = `./i18n/${LOCALE}` + const relativePath = `./i18n/locales/${LOCALE}` const output = execSync(`git ls-tree --name-only main ${relativePath}/`, { encoding: 'utf-8', diff --git a/web/scripts/check-i18n.js b/web/scripts/check-i18n.js index 78617fb9e1b..cc206914fbd 100644 --- a/web/scripts/check-i18n.js +++ b/web/scripts/check-i18n.js @@ -1,7 +1,7 @@ import fs from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' -import data from '../i18n-config/languages' +import data from '../i18n/languages' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) @@ -105,7 +105,7 @@ Examples: async function getKeysFromLanguage(language) { return new Promise((resolve, reject) => { - const folderPath = path.resolve(__dirname, '../i18n', language) + const folderPath = path.resolve(__dirname, '../i18n/locales', language) const allKeys = [] fs.readdir(folderPath, (err, files) => { if (err) { @@ -146,7 +146,7 @@ async function getKeysFromLanguage(language) { } async function removeExtraKeysFromFile(language, fileName, extraKeys) { - const filePath = path.resolve(__dirname, '../i18n', language, `${fileName}.json`) + const filePath = path.resolve(__dirname, '../i18n/locales', language, `${fileName}.json`) if (!fs.existsSync(filePath)) { console.log(`⚠️ File not found: ${filePath}`) @@ -260,7 +260,7 @@ async function main() { console.log(`\n🤖 Auto-removing extra keys from ${language}...`) // Get all translation files - const i18nFolder = path.resolve(__dirname, '../i18n', language) + const i18nFolder = path.resolve(__dirname, '../i18n/locales', language) const files = fs .readdirSync(i18nFolder) .filter((file) => file.endsWith('.json')) diff --git a/web/scripts/migrate-i18n-selectors.ts b/web/scripts/migrate-i18n-selectors.ts index a9e4639c159..0e552538f0e 100644 --- a/web/scripts/migrate-i18n-selectors.ts +++ b/web/scripts/migrate-i18n-selectors.ts @@ -27,7 +27,7 @@ const SKIPPED_DIRECTORIES = new Set([ '.vinext', 'coverage', 'dist', - 'i18n', + 'locales', 'node_modules', 'public', ]) diff --git a/web/service/access-control/use-app-access-config.ts b/web/service/access-control/use-app-access-config.ts index ee134da5ff6..41f66097974 100644 --- a/web/service/access-control/use-app-access-config.ts +++ b/web/service/access-control/use-app-access-config.ts @@ -1,4 +1,4 @@ -import type { AccessControlTemplateLanguage } from '@/i18n-config/language' +import type { AccessControlTemplateLanguage } from '@/i18n/language' import type { RemoveAppAccessPolicyMemberBindingsRequest, UpdateAppUserAccessSettingsRequest, diff --git a/web/service/access-control/use-dataset-access-config.ts b/web/service/access-control/use-dataset-access-config.ts index 2361a5fb776..b976a88ad85 100644 --- a/web/service/access-control/use-dataset-access-config.ts +++ b/web/service/access-control/use-dataset-access-config.ts @@ -1,4 +1,4 @@ -import type { AccessControlTemplateLanguage } from '@/i18n-config/language' +import type { AccessControlTemplateLanguage } from '@/i18n/language' import type { RemoveDatasetAccessPolicyMemberBindingsRequest, UpdateDatasetUserAccessSettingsRequest, diff --git a/web/service/access-control/use-member-roles.ts b/web/service/access-control/use-member-roles.ts index 8a351fc46b7..c7202da7923 100644 --- a/web/service/access-control/use-member-roles.ts +++ b/web/service/access-control/use-member-roles.ts @@ -1,4 +1,4 @@ -import type { AccessControlTemplateLanguage } from '@/i18n-config/language' +import type { AccessControlTemplateLanguage } from '@/i18n/language' import type { RolesOfMemberResponse, UpdateRolesOfMemberRequest } from '@/models/access-control' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { get, put } from '../base' diff --git a/web/service/use-common.ts b/web/service/use-common.ts index 62483cbd829..3ae58ec4e21 100644 --- a/web/service/use-common.ts +++ b/web/service/use-common.ts @@ -4,7 +4,7 @@ import type { ModelProvider, ModelTypeEnum, } from '@/app/components/header/account-setting/model-provider-page/declarations' -import type { AccessControlTemplateLanguage } from '@/i18n-config/language' +import type { AccessControlTemplateLanguage } from '@/i18n/language' import type { CodeBasedExtension, CommonResponse, diff --git a/web/types/app.ts b/web/types/app.ts index 48dda778bcb..b50027ada36 100644 --- a/web/types/app.ts +++ b/web/types/app.ts @@ -1,7 +1,7 @@ import type { ToolProviderType } from '@dify/contracts/api/console/agent/types.gen' import type { TagResponse as Tag } from '@dify/contracts/api/console/tags/types.gen' import type { UploadFileSetting } from '@/app/components/workflow/types' -import type { LanguagesSupported } from '@/i18n-config/language' +import type { LanguagesSupported } from '@/i18n/language' import type { AccessMode } from '@/models/access-control' import type { ExternalDataTool } from '@/models/common' import type { RerankingModeEnum, WeightedScoreEnum } from '@/models/datasets' diff --git a/web/types/i18n.d.ts b/web/types/i18n.d.ts index dc1d0965a3e..bef0f328350 100644 --- a/web/types/i18n.d.ts +++ b/web/types/i18n.d.ts @@ -1,4 +1,4 @@ -import type { defaultNS, Namespace, Resources } from '../i18n-config/resources' +import type { defaultNS, Namespace, Resources } from '../i18n/resources' import 'i18next' declare module 'i18next' { diff --git a/web/utils/format.ts b/web/utils/format.ts index 13c94937072..80657e0f6c9 100644 --- a/web/utils/format.ts +++ b/web/utils/format.ts @@ -1,6 +1,6 @@ import type { Dayjs } from 'dayjs' -import type { Locale } from '@/i18n-config' -import { localeMap } from '@/i18n-config/language' +import type { Locale } from '@/i18n' +import { localeMap } from '@/i18n/language' import 'dayjs/locale/az' import 'dayjs/locale/de' import 'dayjs/locale/es'