Localizing a mobile app into Uzbek: where it breaks
Releasing an app in a new market rarely hinges on translation itself — Uzbek text is ordered from a native speaker and delivered in a couple of weeks.
What breaks is something else: hardcoded interface strings are scattered across screens, some are labeled directly in the markup, some are duplicated with the same phrase in two or three places, and the translator edits only the files that were handed to them.
On top of that are texts from the server: hints, error messages, and section names come from backend responses and follow their own schedule.
When releasing to the Uzbek market, text discrepancies arise between builds — on one platform the wording is already updated, on the other it remains the same, and some strings simply found no translation and fell back to English.
The cost of such a scheme becomes visible on the second or third iteration: an edit is made in one place, but the client finds the old text in three more; maintaining app translations turns into manually transferring strings from a spreadsheet into code before every release, and the next release ships with outdated wording because the translation arrived after the branch freeze.
We'll break down how this is resolved: a single source of strings, reference by semantic keys instead of literals, a separate layer for server texts, and a process in which translation stops blocking release.
What localization delivers: measurable results for the product
Localization into Uzbek is not just translating strings. When a language becomes a full-fledged locale, texts live in resource files with keys, not in code or translator spreadsheets.
From that point on, the effect is measured in specific metrics: update timelines, the share of support requests about wording, and the number of edits per release.
Release speed and layout predictability
Editing one wording used to go through translation, manual insertion, and a rebuild — several days per cycle.
Now values are pulled from localization files, and checks for missing keys and string length run automatically before the build, so the new wording goes to App Store with the next update.
Uzbek Latin script is longer than English, so buttons and headings are checked against real strings, not English placeholders: truncated text and extra line breaks are caught before release, not from user reviews.
Fewer edits and support requests
The share of support requests about texts drops when terms are fixed in a glossary and button labels match what a person expects to read.
The number of edits per release decreases: repeated wording is reused from translation memory instead of being translated anew for every build.
The cost of maintaining translations stops growing with the number of updates — only the delta of new strings is translated, while plural forms, date formats, and separators are covered by a separate set of tests.
Ways to implement interface translation: comparing options
There are several options for app localization, and they are not interchangeable. The choice is determined by how often texts change, who edits them, and whether the market needs its own scenarios, not just a different language.
Below are the technical alternatives that teams realistically choose between before starting translation.
| Option | When it fits | Limitations |
|---|---|---|
| Translation resource files | Texts are stable, there are two or three languages, translations are release-ready | Editing a string requires a new build and re-review in the stores |
| External translation management platform | There are many languages, editors modify texts, and change history is needed | Integration with the build is required, and some strings still remain in code |
| Server-driven texts | Frequent edits, seasonal blocks, different offers by market | Without a network there is no translation — a fallback set and cached data are needed |
| Separate build for the market | Not only the language differs, but also sections, payment flows, and screen order | Each release is checked separately, and the regression scope grows |
| Phased translation of key screens | There is a lot of text, deadlines are tight, and market demand needs to be tested | Mixed-language interface at launch; untranslated strings must be tracked |
How to choose the option for the product
In practice, the scheme is almost always combined: navigation and permanent labels live in translation resource files, mutable blocks come from the server, and a separate build is needed where the scenarios themselves diverge.
For Uzbek at the start, phased translation is usually used — first the path to payment and key screens, then the rest. A mandatory condition is a fallback source language: an untranslated string shows meaningful text, not emptiness.
Work stages: from interface audit to build handoff
Localization into Uzbek is not replacing strings in a resource file. Uzbek comes in Latin and Cyrillic scripts, and translated phrases change length: a label overflows the button, a long compound term breaks the screen grid. That is why app localization stages begin with an audit of interface texts, not with translation.
- Interface text audit. We collect all strings: labels, hints, error messages, empty states, notifications — including those left only in mockups.
- Translation key scheme. We bring strings to unified keys and a glossary: one entity is named the same on all screens, and the key does not change when the text is edited.
- Translation and native-speaker proofreading. A native speaker with product vocabulary translates; we agree on terms in advance, otherwise "cart" on different screens will become three different words.
- Script and default language. We determine Latin or Cyrillic, the language selection logic based on device settings, and fallback to Russian instead of empty strings.
- Integration and layout checks. We connect resources to both platforms and run every screen against long strings: where possible we wrap, where not possible we shorten the text, not the font.
- Testing and build handoff. We go through login, payment, ordering, and notifications in Uzbek, and check language switching on the fly; we hand over the build, glossary, key scheme, and instructions for new strings.
Localization acceptance
Acceptance is performed against a screen list: there are no untranslated strings, terms match the glossary, labels are not truncated, and dates and numbers are in Uzbek format.
We record comments as a list, fix them, and show them again — the build goes to publication only after all items are closed.
What the client retains: translation files, schemes, policies
Localization does not end with translating strings. After acceptance, the client retains a working set of artifacts with which their team updates texts independently, without contacting us for every edit.
Files, schemes, and profiles
- Translation files — resources by language with a unified key structure: the Uzbek set sits next to the source one, and adding a new string does not break other language versions.
- Application terminology glossary — approved translations of product concepts, button names, and statuses, so the same term does not sound different on adjacent screens.
- String flow scheme — a map: where a string is defined in code, which resource overrides it, what the user sees for an unsupported language, and which set is used for fallback.
- Language profiles — default language, selection order, and substitution rules for regions; adding a new language comes down to adding a resource set.
Policies and documentation
- Text update policy — who makes edits, in which branch, how strings get into the build, and what counts as translation loss during a merge.
- Localization documentation — key naming rules, string length limits for a specific layout, and the pre-release check procedure.
- Verification report — the share of translated strings per language and any discrepancies found, linked to the screen.
Case study: how we removed text discrepancies between platforms
The client is a delivery service with apps on two platforms and a web dashboard. The Uzbek version relied on manual work: strings were hardcoded directly into screen code, some translations were maintained in spreadsheets, and some in Crowdin at a contractor.
Discrepancies were found on 96 of 240 screens — about 1,800 strings: on one platform the button was called "Buyurtma berish", on the other "Buyurtma", and in the web dashboard the text lagged by two weeks.
New wording reached the user in 18–20 days: an edit in code, two reviews, a build, and app store moderation.
We assembled a unified translation catalog with keys such as checkout.button.submit, context for the translator, and breakdown by screens, and the build began pulling current strings automatically.
What exactly was migrated
The inventory was conducted not by files but by screens — this makes omissions and duplicates visible:
- labels for buttons, fields, and screen headings;
- error and notification texts;
- date, time, and thousands separator formats;
- category and order status names;
- message and email templates.
Two months later, support requests complaining about unclear or mismatched text dropped from 250–270 to 60–70 per month.
The release time for updates with new wording decreased from 18–20 days to 2–3, and an entire class of errors disappeared: an edit can no longer be made in one place and go unnoticed in two others.
What to do if the product is already released but translation is needed now?
A released app with strings hardcoded into screens is a common situation, and it does not require rewriting the logic.
The interface, navigation, and business rules stay as they are: a new language is added on top, because the text for the user and the code that controls it are different layers.
We start with an inventory: we collect labels, buttons, hints, error texts, emails and push messages, and service statuses coming from the server.
All of this is moved into "key — value" dictionaries, where the key describes the role of the string, not its current content.
The main work is not translation but extracting strings from code and layout. While text sits inside a screen, it cannot be translated or edited without a new build.
We place references to the dictionaries in all output locations, including pop-up messages and dynamic templates, and leave one fallback language that the app falls back to if a key is somehow not found.
This eliminates a class of errors where a new language suddenly shows an empty button or an English placeholder in the middle of a screen.
We address script separately: Uzbek exists in Latin and Cyrillic writing, and this affects both the translation volume and the layout.
Usually the Latin variant is taken as the primary one, while Cyrillic is connected as a second dictionary with selection in the phone settings or inside the app.
For post-release localization, backward compatibility of translations is critical: keys are not deleted but marked obsolete, new ones are added with prepared fallback-language text, and plural forms are defined by the rules of the target language, not the source language.
What about already published versions? Strings moved into dictionaries can be updated remotely — the user gets the new language without waiting for a store build.
However, the app name, description, screenshots, and system labels are updated only with a version, so we prepare them in advance and support them with regression across all locales: long strings, line breaks, truncated button labels. Next — how to break this down into stages without stopping the product.
Common concerns: string length, fonts, date formats
Uzbek is an agglutinative language: a word is "attached" with affixes and becomes one and a half to two times longer than English. If a string is not width-limited, buttons stretch, and two-line labels break the layout.
A separate topic is fonts: the Cyrillic set requires a typeface with full glyph coverage, otherwise the text falls back to a system font and stands out from the design.
Below are the questions most often raised before work starts.
How many strings actually need to be translated?
App resources are not only visible screens. The scope includes push notifications, error texts, emails, app store descriptions, and system permission prompts.
In practice, the string volume grows by one and a half times compared with the visible interface, and we account for this in the plan from the start.
What to do with texts that come from the server?
Some content is generated on the server side, and it cannot be placed in app resources. We localize such texts by the header of the selected locale, and move substitution templates and cases into server dictionaries.
We keep fallback to the base language so that if a key is missing, the user sees a meaningful phrase rather than an empty block.
How can quality be checked if there is no native speaker on staff?
First we run pseudolocalization: all strings are artificially lengthened, and we see where the layout cannot hold the length.
Then back-translation of key screens and verification of date and number formats — the order of day, month, and thousands separator in the Uzbek locale differs from the familiar one. We include selective native-speaker proofreading as a separate stage.
Do both Latin and Cyrillic need to be supported?
Yes, both glyph sets live in the app at the same time, and the switch between them is not tied to the system locale — the user chooses it themselves.
This means separate resource keys for each variant, checking both sets on all screens, and a ban on concatenating strings from pieces: an assembled phrase does not translate correctly.
Can a translation be fixed after release?
Yes, if strings are moved into resources and versioned. Interface edits go out with the next update, while server texts change without rebuilding the app. Every change goes through review and enters the shared glossary dictionary so terms do not diverge between screens.
Let's discuss the task: what to send for a translation volume estimate
To come back with a translation volume estimate and a localization work plan, rather than clarifying questions, we need the client's source data. From it we calculate the actual number of strings, not "roughly by screens," and break the work down into stages.
- Localization files in the form in which they exist in the project — Android and iOS string resources. They show the volume, duplicates, and strings that are assembled dynamically and require separate analysis.
- A list of screens or access to a test build: helps separate visible text from service values — identifiers, keys, technical labels that do not need translation.
- Product glossary and domain terms: names of sections, plans, request statuses. Without it, one term gets three different translations on different screens.
- Script decision: Uzbek in Latin and Cyrillic are two full-fledged text branches, and the choice affects both the volume and the structure of string files.
- Data display rules: dates, numeric values, thousands separators, phone and address format. Default values almost always require agreement with your side.
- Texts outside the app: descriptions and titles in app stores, notification templates, emails, text in images and first-run screens.
- A contact person on the client side who approves terms, and a target release date — we build stages around them.
Describe the task and send what is already available: some data is usually gathered along the way. We will come back with a translation volume estimate, a localization work plan, and a breakdown of stages — indicating what is needed from you at each of them.







