feat: enable Uzbek language (#15056)

Enables Uzbek as a selectable Chatwoot language and wires the `uz`
locale into the dashboard, widget, and survey translation loaders.

## Closes

Closes https://github.com/chatwoot/chatwoot/issues/15030

## Why

Uzbek is now available in the Chatwoot Crowdin project. The widget
translation has been proofread and is 100% translated and approved.

## What changed

- Adds Uzbek to the supported language registry
- Registers the `uz` locale with the dashboard, widget, and survey i18n
loaders

## Validation

- Proofread the Uzbek widget translation in Crowdin
- Verified placeholder preservation and corrected wording where needed
- Confirmed the widget file is 100% translated and 100% approved

This draft intentionally remains blocked until the Crowdin sync adds the
generated Uzbek locale files. It should only be marked ready and merged
after that sync lands.
This commit is contained in:
Sojan Jose
2026-07-18 03:40:53 -07:00
committed by GitHub
parent e70bbfaaa5
commit 465763f256
5 changed files with 101 additions and 1 deletions
+2
View File
@@ -34,6 +34,7 @@ import ta from './locale/ta';
import th from './locale/th';
import tr from './locale/tr';
import uk from './locale/uk';
import uz from './locale/uz';
import vi from './locale/vi';
import zh_CN from './locale/zh_CN';
import zh_TW from './locale/zh_TW';
@@ -77,6 +78,7 @@ export default {
th,
tr,
uk,
uz,
vi,
zh_CN,
zh_TW,
@@ -0,0 +1,93 @@
import advancedFilters from './advancedFilters.json';
import agentBots from './agentBots.json';
import agentMgmt from './agentMgmt.json';
import attributesMgmt from './attributesMgmt.json';
import auditLogs from './auditLogs.json';
import automation from './automation.json';
import bulkActions from './bulkActions.json';
import campaign from './campaign.json';
import cannedMgmt from './cannedMgmt.json';
import chatlist from './chatlist.json';
import companies from './companies.json';
import components from './components.json';
import contact from './contact.json';
import contactFilters from './contactFilters.json';
import contentTemplates from './contentTemplates.json';
import conversation from './conversation.json';
import csatMgmt from './csatMgmt.json';
import customRole from './customRole.json';
import datePicker from './datePicker.json';
import emoji from './emoji.json';
import general from './general.json';
import generalSettings from './generalSettings.json';
import helpCenter from './helpCenter.json';
import inbox from './inbox.json';
import inboxMgmt from './inboxMgmt.json';
import integrationApps from './integrationApps.json';
import integrations from './integrations.json';
import labelsMgmt from './labelsMgmt.json';
import login from './login.json';
import macros from './macros.json';
import mfa from './mfa.json';
import onboarding from './onboarding.json';
import report from './report.json';
import resetPassword from './resetPassword.json';
import search from './search.json';
import setNewPassword from './setNewPassword.json';
import sessionLimit from './sessionLimit.json';
import settings from './settings.json';
import signup from './signup.json';
import sla from './sla.json';
import snooze from './snooze.json';
import teamsSettings from './teamsSettings.json';
import webhooks from './webhooks.json';
import whatsappTemplates from './whatsappTemplates.json';
import yearInReview from './yearInReview.json';
export default {
...advancedFilters,
...agentBots,
...agentMgmt,
...attributesMgmt,
...auditLogs,
...automation,
...bulkActions,
...campaign,
...cannedMgmt,
...chatlist,
...companies,
...components,
...contact,
...contactFilters,
...contentTemplates,
...conversation,
...csatMgmt,
...customRole,
...datePicker,
...emoji,
...general,
...generalSettings,
...helpCenter,
...inbox,
...inboxMgmt,
...integrationApps,
...integrations,
...labelsMgmt,
...login,
...macros,
...mfa,
...onboarding,
...report,
...resetPassword,
...search,
...setNewPassword,
...sessionLimit,
...settings,
...signup,
...sla,
...snooze,
...teamsSettings,
...webhooks,
...whatsappTemplates,
...yearInReview,
};
+2
View File
@@ -35,6 +35,7 @@ import ta from './locale/ta.json';
import th from './locale/th.json';
import tr from './locale/tr.json';
import uk from './locale/uk.json';
import uz from './locale/uz.json';
import vi from './locale/vi.json';
import zh_CN from './locale/zh_CN.json';
import zh_TW from './locale/zh_TW.json';
@@ -77,6 +78,7 @@ export default {
th,
tr,
uk,
uz,
vi,
zh_CN,
zh_TW,
+2
View File
@@ -35,6 +35,7 @@ import ta from './locale/ta.json';
import th from './locale/th.json';
import tr from './locale/tr.json';
import uk from './locale/uk.json';
import uz from './locale/uz.json';
import vi from './locale/vi.json';
import zh_CN from './locale/zh_CN.json';
import zh_TW from './locale/zh_TW.json';
@@ -77,6 +78,7 @@ export default {
th,
tr,
uk,
uz,
vi,
zh_CN,
zh_TW,
+2 -1
View File
@@ -43,7 +43,8 @@ LANGUAGES_CONFIG = {
38 => { name: 'lietuvių (lt)', iso_639_3_code: 'lit', iso_639_1_code: 'lt', enabled: true },
39 => { name: 'Српски (sr)', iso_639_3_code: 'srp', iso_639_1_code: 'sr', enabled: true },
40 => { name: 'български (bg)', iso_639_3_code: 'bul', iso_639_1_code: 'bg', enabled: true },
41 => { name: 'Eesti keel (et)', iso_639_3_code: 'est', iso_639_1_code: 'et', enabled: true }
41 => { name: 'Eesti keel (et)', iso_639_3_code: 'est', iso_639_1_code: 'et', enabled: true },
42 => { name: 'Oʻzbekcha (uz)', iso_639_3_code: 'uzb', iso_639_1_code: 'uz', enabled: true }
}.filter { |_key, val| val[:enabled] }.freeze
Rails.configuration.i18n.available_locales = LANGUAGES_CONFIG.map { |_index, lang| lang[:iso_639_1_code].to_sym }