Skip to content

feat(i18n): add Azerbaijani (az-AZ) translation - #42291

Merged
crazywoola merged 2 commits into
langgenius:mainfrom
jamalkamaladdin:feat/az-locale
Sep 18, 2026
Merged

crazywoola merged 2 commits into
langgenius:mainfrom
jamalkamaladdin:feat/az-locale

Conversation

@jamalkamaladdin

Copy link
Copy Markdown
Contributor

Summary

Fixes #42289

This PR adds an Azerbaijani (az-AZ) translation of the web interface.

New directory web/i18n/az-AZ: 37 files, 5960 strings, all filled in. Key names and key order match web/i18n/en-US file by file, and the _one and _other plural branches are kept.

web/i18n-config/languages.ts: added the az-AZ entry with supported: true.
web/i18n-config/language.ts: added az-AZ to localeMap.
web/i18n-config/locale-resources/az-AZ.ts: new resource loader.
web/service/use-plugins.ts: added az-AZ to the plugin i18n fallback map.
web/service/use-triggers.ts: added az-AZ to both trigger i18n fallback maps.
web/utils/format.ts: added the dayjs/locale/az import.
api/constants/languages.py: added az-AZ with the Asia/Baku timezone.

Checklist

  • This change requires a documentation update, included: Dify Document
  • I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!)
  • I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change.
  • I've updated the documentation accordingly.
  • I ran make lint && make type-check (backend) and vp staged (frontend) to appease the lint gods

@github-actions github-actions Bot added the web This relates to changes on the web. label Sep 14, 2026
@crazywoola
crazywoola requested a balanced review from Copilot September 15, 2026 14:20
@github-actions

github-actions Bot commented Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

Pyrefly Diff

base → PR
--- /tmp/pyrefly_base.txt	2026-09-16 13:21:28.167121478 +0000
+++ /tmp/pyrefly_pr.txt	2026-09-16 13:21:18.847070476 +0000
@@ -8151,53 +8151,53 @@
 ERROR `object` is not assignable to dict key `agent_binding` with type `str` [bad-assignment]
    --> tests/unit_tests/services/agent/test_agent_dsl_service.py:123:33
 ERROR Object of class `NoneType` has no attribute `agent_workspace_binding_id` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:1300:12
+    --> tests/unit_tests/services/agent/test_agent_services.py:1299:12
 ERROR Object of class `object` has no attribute `prompt` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:2730:12
+    --> tests/unit_tests/services/agent/test_agent_services.py:2729:12
+ERROR Cannot index into `object` [bad-index]
+    --> tests/unit_tests/services/agent/test_agent_services.py:2915:12
 ERROR Cannot index into `object` [bad-index]
     --> tests/unit_tests/services/agent/test_agent_services.py:2916:12
 ERROR Cannot index into `object` [bad-index]
     --> tests/unit_tests/services/agent/test_agent_services.py:2917:12
-ERROR Cannot index into `object` [bad-index]
-    --> tests/unit_tests/services/agent/test_agent_services.py:2918:12
 ERROR Argument `list[str | None]` is not assignable to parameter `version_ids` with type `list[str]` in function `services.agent.roster_service.AgentRosterService._load_versions_by_id` [bad-argument-type]
-    --> tests/unit_tests/services/agent/test_agent_services.py:3994:52
+    --> tests/unit_tests/services/agent/test_agent_services.py:3993:52
 ERROR Object of class `NoneType` has no attribute `conversation_id` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:4902:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:4901:16
 ERROR Argument `Literal['simple']` is not assignable to parameter `prompt_type` with type `PromptType | SQLCoreOperations[PromptType]` in function `models.model.AppModelConfig.__init__` [bad-argument-type]
-    --> tests/unit_tests/services/agent/test_agent_services.py:4995:25
+    --> tests/unit_tests/services/agent/test_agent_services.py:4994:25
 ERROR Unpacked keyword argument `Any | None` is not assignable to parameter `id` with type `SQLCoreOperations[str] | str` in function `models.model.AppModelConfig.__init__` [bad-argument-type]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5003:34
+    --> tests/unit_tests/services/agent/test_agent_services.py:5002:34
 ERROR Unpacked keyword argument `Any | None` is not assignable to parameter `created_at` with type `SQLCoreOperations[datetime] | datetime` in function `models.model.AppModelConfig.__init__` [bad-argument-type]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5003:34
+    --> tests/unit_tests/services/agent/test_agent_services.py:5002:34
 ERROR Unpacked keyword argument `Any | None` is not assignable to parameter `updated_at` with type `SQLCoreOperations[datetime] | datetime` in function `models.model.AppModelConfig.__init__` [bad-argument-type]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5003:34
+    --> tests/unit_tests/services/agent/test_agent_services.py:5002:34
 ERROR Unpacked keyword argument `Any | None` is not assignable to parameter `prompt_type` with type `PromptType | SQLCoreOperations[PromptType]` in function `models.model.AppModelConfig.__init__` [bad-argument-type]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5003:34
+    --> tests/unit_tests/services/agent/test_agent_services.py:5002:34
 ERROR Object of class `object` has no attribute `name` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5109:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5108:16
 ERROR Object of class `object` has no attribute `mode` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5110:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5109:16
 ERROR Object of class `object` has no attribute `agent_role` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5111:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5110:16
 ERROR Object of class `object` has no attribute `config_snapshot` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5121:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5120:16
 ERROR Object of class `object` has no attribute `home_snapshot_id` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5123:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5122:16
 ERROR Object of class `object` has no attribute `summary` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5124:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5123:16
 ERROR Object of class `object` has no attribute `version_note` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5125:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5124:16
 ERROR Object of class `object` has no attribute `active_config_has_model` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5126:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5125:16
 ERROR Object of class `object` has no attribute `active_config_is_published` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5127:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5126:16
 ERROR Object of class `object` has no attribute `updated_by` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5128:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5127:16
 ERROR Object of class `object` has no attribute `id` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5129:35
+    --> tests/unit_tests/services/agent/test_agent_services.py:5128:35
 ERROR Object of class `object` has no attribute `agent_role` [missing-attribute]
-    --> tests/unit_tests/services/agent/test_agent_services.py:5195:16
+    --> tests/unit_tests/services/agent/test_agent_services.py:5194:16
 ERROR Object of class `NoneType` has no attribute `workflow_prompt` [missing-attribute]
    --> tests/unit_tests/services/agent/test_composer_mention_validation.py:113:5
 ERROR Argument `object` is not assignable to parameter `pwd` with type `bytes | None` in function `zipfile.ZipFile.read` [bad-argument-type]

@github-actions

github-actions Bot commented Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

Pyrefly Type Coverage

Metric Base PR Delta
Type coverage 64.07% 64.07% +0.01%
Strict coverage 63.68% 63.68% +0.01%
Typed symbols 46,022 46,012 -10
Untyped symbols 25,971 25,957 -14
Modules 3402 3402 0

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Azerbaijani relative-time formatting still falls back to English in two locale-specific paths.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Adds Azerbaijani (az-AZ) localization across the web interface and backend language configuration.

Changes:

  • Adds 37 Azerbaijani translation namespaces.
  • Registers locale loading, formatting, and plugin/trigger fallbacks.
  • Maps Azerbaijani to the Asia/Baku timezone.
File summaries
File Description
api/constants/languages.py Adds Azerbaijani timezone
web/i18n-config/language.ts Adds Day.js locale mapping
web/i18n-config/languages.ts Registers supported language
web/i18n-config/locale-resources/az-AZ.ts Adds resource loader
web/service/use-plugins.ts Adds plugin fallback
web/service/use-triggers.ts Adds trigger fallbacks
web/utils/format.ts Imports Azerbaijani Day.js locale
web/i18n/az-AZ/agent-v-2.json Translates agent interface
web/i18n/az-AZ/app-annotation.json Translates annotations
web/i18n/az-AZ/app-api.json Translates API controls
web/i18n/az-AZ/app-debug.json Translates debugging interface
web/i18n/az-AZ/app-log.json Translates application logs
web/i18n/az-AZ/app-overview.json Translates application overview
web/i18n/az-AZ/app.json Translates application management
web/i18n/az-AZ/billing.json Translates billing interface
web/i18n/az-AZ/common.json Translates shared strings
web/i18n/az-AZ/custom.json Translates customization interface
web/i18n/az-AZ/dataset-creation.json Translates dataset creation
web/i18n/az-AZ/dataset-documents.json Translates dataset documents
web/i18n/az-AZ/dataset-hit-testing.json Translates retrieval testing
web/i18n/az-AZ/dataset-pipeline.json Translates dataset pipelines
web/i18n/az-AZ/dataset-settings.json Translates dataset settings
web/i18n/az-AZ/dataset.json Translates dataset interface
web/i18n/az-AZ/deployments.json Translates deployments
web/i18n/az-AZ/device-flow.json Translates device authentication
web/i18n/az-AZ/education.json Translates education program
web/i18n/az-AZ/explore.json Translates exploration interface
web/i18n/az-AZ/layout.json Translates layout controls
web/i18n/az-AZ/login.json Translates authentication interface
web/i18n/az-AZ/oauth.json Translates OAuth interface
web/i18n/az-AZ/permission-keys.json Translates permission names
web/i18n/az-AZ/permission.json Translates permission management
web/i18n/az-AZ/pipeline.json Translates pipeline interface
web/i18n/az-AZ/plugin-tags.json Translates plugin tags
web/i18n/az-AZ/plugin-trigger.json Translates plugin triggers
web/i18n/az-AZ/plugin.json Translates plugin management
web/i18n/az-AZ/register.json Adds register namespace
web/i18n/az-AZ/run-log.json Translates run logs
web/i18n/az-AZ/share.json Translates shared applications
web/i18n/az-AZ/skill.json Translates skill management
web/i18n/az-AZ/snippet.json Translates snippets
web/i18n/az-AZ/time.json Translates date controls
web/i18n/az-AZ/tools.json Translates tool management
web/i18n/az-AZ/workflow.json Translates workflow interface
Review details
  • Files reviewed: 44/44 changed files
  • Comments generated: 1
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread web/utils/format.ts
@jamalkamaladdin

Copy link
Copy Markdown
Contributor Author

The first path is fixed in 6cc8381: use-format-time-from-now.ts now imports dayjs/locale/az.

The second path is unchanged. human-input-content/utils.ts imports four dayjs locales: en, zh-cn, ja and nl. The other 18 entries of localeMap already resolve to English there.

@crazywoola
crazywoola added this pull request to the merge queue Sep 18, 2026
Merged via the queue into langgenius:main with commit f418261 Sep 18, 2026
52 checks passed
CourTeous33 added a commit that referenced this pull request Sep 18, 2026
The main merge added Azerbaijani (#42291) as a console locale. The naming
fallback keys its "New app" stem by console locale, so a new locale without a
stem silently falls back to English; the catalog-completeness test caught it on
rebase, which is what that test exists for.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

web This relates to changes on the web.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

support az-AZ language

3 participants