Lokalizace a překlady v Androidu - zizanek/-github-tz-pma-2026-priprava GitHub Wiki
Vkládání všech textů do zdrojového souboru res/values/strings.xml namísto jejich přímého zapisování do kódu (tzv. „hardcoding“) tvoří základní předpoklad pro lokalizaci (překlad) aplikace do různých jazyků.
Android disponuje vestavěným mechanismem, který podle nastaveného jazyka v zařízení uživatele automaticky vybere odpovídající jazykovou verzi textů.
Veškeré výchozí texty jsou uloženy v základním adresáři:
-
res/values/strings.xml(výchozí jazyk – použit vždy, když není dostupný konkrétní překlad)
Pro každý další podporovaný jazyk se vytvoří specifický adresář s tzv. jazykovým kvalifikátorem:
-
res/values-en/strings.xml(anglický překlad) -
res/values-de/strings.xml(německý překlad) -
res/values-cs/strings.xml(český překlad, pokud výchozí složka obsahuje angličtinu)
Klíče (name) jednotlivých řetězců musí zůstat ve všech souborech zcela shodné, mění se pouze samotný text mezi značkami <string>.
Častým dotazem bývá, zda soubor res/values/strings.xml musí povinně obsahovat angličtinu, nebo v něm může být čeština.
- Systém nejprve vyhledá složku s přesným kódem aktuálního jazyka zařízení (např. při němčině hledá
values-de/). - Pokud složku pro daný jazyk nenalezne, je použit soubor ze základní složky
res/values/strings.xml(tzv. fallback).
Technicky není překážkou, pokud je výchozí soubor vytvořen v češtině a překladová složka values-en/ v angličtině:
- Uživatel s českým zařízením uvidí češtinu (z
res/values/). - Uživatel s anglickým zařízením uvidí angličtinu (z
res/values-en/). - Uživatel s jiným jazykem (např. španělštinou či francouzštinou) uvidí češtinu, protože pro jeho jazyk překlad neexistuje a systém sáhne do výchozího souboru.
-
Ve školní výuce a lokálních projektech: Čeština jako výchozí jazyk v
res/values/strings.xmlje zcela běžná a didakticky přirozená. -
V profesionální mezinárodní praxi: Jako průmyslový standard bývá do základní složky
res/values/umisťována angličtina, zatímco čeština je vyčleněna dores/values-cs/. Tím je zaručeno, že uživatelům z nepodporovaných zemí bude zobrazen globálně srozumitelný jazyk.
Android Studio obsahuje grafický nástroj Translations Editor, který tvorbu překladů výrazně usnadňuje a zabraňuje chybám v ručním vytváření složek.
- Otevře se soubor
res/values/strings.xml. - V pravém horním rohu editoru se klikne na odkaz Open editor.
- Otevře se tabulka všech textů aplikace. V horní liště se klikne na ikonu zeměkoule s plusem (Add Locale).
- Ze seznamu se vybere požadovaný jazyk (např. en: English).
- Android Studio automaticky:
- vytvoří novou složku
res/values-en/a v ní souborstrings.xml, - přidá do tabulky nový sloupec pro překlad.
- vytvoří novou složku
- Do nového sloupce se vepíší přeložené texty.
<resources>
<string name="app_name">Objednávka kola</string>
<string name="order_title">Jaké kolo chcete objednat?</string>
<string name="button_make_order_text">Objednat Kolo</string>
<string name="textview_order_summary_text">Souhrn objednávky:</string>
</resources>
<resources>
<string name="app_name">Bike Order</string>
<string name="order_title">Which bike do you want to order?</string>
<string name="button_make_order_text">Order Bike</string>
<string name="textview_order_summary_text">Order summary:</string>
</resources>
V kódu layoutu ani v jazyce Kotlin se nevytvářejí žádné podmínky pro zjišťování jazyka. Výběr je prováděn automaticky:
-
V XML layoutu:
Při odkazu@string/button_make_order_textsystém ověří jazyk telefonu a automaticky načte odpovídající verzi. -
V kódu Kotlinu:
Při volání metodygetString(R.string.nazev_retezce)probíhá tentýž výběr:val summaryText = getString(R.string.textview_order_summary_text)
Častým problémem při překladu jsou dynamicky doplňované hodnoty (např. název vybraného kola či cena). Různé jazyky mají odlišný slovosled, proto nelze řetězce spojovat prostou konkatenací pomocí operátoru +.
V souboru strings.xml se pro proměnné hodnoty definují formátovací zástupné znaky:
-
%s– zástupný znak pro textový řetězec (String), -
%d– zástupný znak pro celé číslo (Integer).
<!-- Čeština: %s bude nahrazeno názvem kola, %d cenou -->
<string name="order_confirmation">Objednávka kola %s byla odeslána za %d Kč.</string>
<string name="order_confirmation">Order of bike %s was submitted for %d CZK.</string>
val bikeName = "Oiz M10"
val price = 95000
// Parametry se předávají přímo do metody getString()
val message = getString(R.string.order_confirmation, bikeName, price)
Toast.makeText(this@MainActivity, message, Toast.LENGTH_SHORT).show()
Díky tomuto formátu je zajištěn gramaticky správný slovosled pro všechny jazykové mutace.