Lokalizace v Xamarin.iOS
Tento dokument se zabývá lokalizačními funkcemi sady SDK pro iOS a jejich přístupem pomocí Xamarinu.
Pokyny k zahrnutí znakových sad a znakových stránek v aplikacích, které musí zpracovávat data, která nejsou unicode, najdete v kódech internationalizace.
Funkce platformy pro iOS
Tato část popisuje některé funkce lokalizace v iOSu. Přeskočte na další část a podívejte se na konkrétní kód a příklady.
Jazyk
Uživatelé zvolí jazyk v Nastavení aplikaci. Toto nastavení má vliv na řetězce jazyka a obrázky zobrazené operačním systémem a v aplikacích.
Pokud chcete určit jazyk používaný v aplikaci, získejte první prvek NSBundle.MainBundle.PreferredLocalizations
:
var lang = NSBundle.MainBundle.PreferredLocalizations[0];
Tato hodnota bude kód jazyka, jako en
je angličtina, es
španělština, ja
japonština atd. Vrácená hodnota je omezena na jednu z lokalizací podporovaných aplikací (pomocí pravidel pro použití náhradních pravidel k určení nejlepší shody).
Kód aplikace nemusí vždy kontrolovat tuto hodnotu – Xamarin i iOS poskytují funkce, které pomáhají automaticky poskytnout správný řetězec nebo prostředek pro jazyk uživatele. Tyto funkce jsou popsané ve zbývající části tohoto dokumentu.
Poznámka:
Slouží NSLocale.PreferredLanguages
k určení jazykových předvoleb uživatele bez ohledu na lokalizaci podporovanou aplikací. Hodnoty vrácené touto metodou se změnily v iOSu 9; Podrobnosti najdete v technické poznámce TN2418 .
Národní prostředí
Uživatelé vyberou své národní prostředí v aplikaci Nastavení. Toto nastavení má vliv na způsob formátování kalendářních dat, časů, čísel a měny.
Uživatelé tak můžou zvolit, jestli se jim zobrazí 12hodinový nebo 24hodinový formát času, jestli je oddělovač desetinných míst čárkou nebo čárkou, a pořadí dne, měsíce a roku v zobrazení data.
S Xamarinem máte přístup ke třídámNSNumberFormatter
iOS () společnosti Apple i třídám .NET v system.Globalization. Vývojáři by měli vyhodnotit, která je vhodnější pro jejich potřeby, protože v každé z nich jsou k dispozici různé funkce. Konkrétně pokud načítáte a zobrazujete ceny nákupu v aplikaci pomocí StorKitu, měli byste pro vrácené informace o ceně použít třídy formátování společnosti Apple.
Aktuální národní prostředí se dá dotazovat jedním ze dvou způsobů:
NSLocale.CurrentLocale.LocaleIdentifier
NSLocale.AutoUpdatingCurrentLocale.LocaleIdentifier
První hodnotu může operační systém uložit do mezipaměti, takže nemusí vždy odrážet aktuálně vybrané národní prostředí uživatele. K získání aktuálně vybraného národního prostředí použijte druhou hodnotu.
Poznámka:
Mono (modul runtime .NET, na kterém je založený Xamarin.iOS) a rozhraní API pro iOS společnosti Apple nepodporují identické sady kombinací jazyka a oblastí. Z tohoto důvodu je možné v aplikaci pro iOS Nastavení vybrat kombinaci jazyka a oblasti, která se nenamapuje na platnou hodnotu v Mono. Například nastavení jazyka i Telefon na angličtinu a jeho oblast do Španělska způsobí, že následující rozhraní API vrátí různé hodnoty:
CurrentThead.CurrentCulture
: en-US (Mono API)CurrentThread.CurrentUICulture
: en-US (Mono API)NSLocale.CurrentLocale.LocaleIdentifier
: en_ES (Apple API)
Vzhledem k tomu, že Mono používá CurrentThread.CurrentUICulture
k výběru prostředků a CurrentThread.CurrentCulture
k formátování kalendářních dat a měn, nemusí mono-založená lokalizace (například se soubory .resx) přinést očekávané výsledky pro tyto kombinace jazyků a oblastí. V těchto situacích se podle potřeby spoléhají na rozhraní API společnosti Apple k lokalizaci.
NSCurrentLocaleDidChangeNotification
iOS vygeneruje NSCurrentLocaleDidChangeNotification
, když uživatel aktualizuje národní prostředí. Aplikace můžou naslouchat tomuto oznámení, když jsou spuštěné, a mohou provádět příslušné změny uživatelského rozhraní.
Základy lokalizace v iOSu
Následující funkce iOSu se v Xamarinu snadno využívají k poskytování lokalizovaných prostředků pro zobrazení uživateli. Informace o implementaci těchto nápadů najdete v ukázce TaskyL10n.
Zadání výchozích a podporovaných jazyků v souboru Info.plist
Technická otázka Q&A QA1828: Jak iOS určuje jazyk vaší aplikace, Apple popisuje, jak iOS vybere jazyk, který se má v aplikaci použít. Na jazyk, který se zobrazuje, mají vliv následující faktory:
- Upřednostňované jazyky uživatele (nalezené v aplikaci Nastavení)
- Lokalizace zkompilované s aplikací (složky .lproj)
CFBundleDevelopmentRegion
(Hodnota Info.plist určující výchozí jazyk aplikace)CFBundleLocalizations
(Pole Info.plist určující všechny podporované lokalizace)
Jak je uvedeno v technické Q&A, CFBundleDevelopmentRegion
představuje výchozí oblast a jazyk aplikace. Pokud aplikace explicitně nepodporuje žádný z upřednostňovaných jazyků uživatele, použije jazyk určený tímto polem.
Důležité
iOS 11 používá tento mechanismus výběru jazyka přesněji než předchozí verze operačního systému. Z tohoto důvodu může každá aplikace pro iOS 11, která explicitně nehlásí podporovanou lokalizaci – buď zahrnutím složek .lproj, nebo nastavením hodnoty pro CFBundleLocalizations
– zobrazit jiný jazyk v iOSu 11, než to udělal v iOSu 10.
Pokud CFBundleDevelopmentRegion
nebyly zadány v souboru Info.plist , nástroje sestavení Xamarin.iOS aktuálně používají výchozí hodnotu en_US
. I když se to může v budoucí verzi změnit, znamená to, že výchozí jazyk je angličtina.
Pokud chcete zajistit, aby vaše aplikace vybrala očekávaný jazyk, postupujte následovně:
- Zadejte výchozí jazyk. Otevřete Soubor Info.plist a pomocí zobrazení Zdroj nastavte hodnotu
CFBundleDevelopmentRegion
klíče. Ve formátu XML by měl vypadat nějak takto:
<key>CFBundleDevelopmentRegion</key>
<string>es</string>
Tento příklad používá "es" k určení, že pokud není podporován žádný z upřednostňovaných jazyků uživatele, ve výchozím nastavení je španělština.
- Deklarujte všechny podporované lokalizace. V souboru Info.plist nastavte pole pro
CFBundleLocalizations
klíč pomocí zobrazení Zdroj. V jazyce XML by měl vypadat nějak takto:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>es</string>
...
</array>
Aplikace Xamarin.iOS, které byly lokalizovány pomocí mechanismů .NET, jako jsou soubory .resx, musí také poskytovat tyto hodnoty Info.plist .
Další informace o těchto klíčích Info.plist najdete v referenčních informacích k klíči seznamu vlastností společnosti Apple.
Metoda GetLocalizedString
Metoda NSBundle.MainBundle.GetLocalizedString
vyhledá lokalizovaný text uložený v souborech .strings v projektu. Tyto soubory jsou uspořádány podle jazyka, ve speciálně pojmenovaných adresářích s příponou .lproj (všimněte si, že první písmeno přípony je malé písmeno "L").
Umístění souborů .strings
- Base.lproj je adresář, který obsahuje prostředky pro výchozí jazyk. Často se nachází v kořenovém adresáři projektu (ale můžete ho také umístit do složky Zdroje ).
- <Adresáře language.lproj> se vytvářejí pro každý podporovaný jazyk, obvykle ve složce Resources.
V každém adresáři jazyka může existovat několik různých souborů .string:
- Localizable.strings – hlavní seznam lokalizovaného textu.
- InfoPlist.strings – některé konkrétní klíče jsou v tomto souboru povoleny k překladu věcí, jako je název aplikace.
- <storyboard-name.strings> – volitelný soubor, který obsahuje překlady prvků uživatelského rozhraní ve scénáři.
Akce sestavení pro tyto soubory by měla být prostředek sady prostředků.
Formát souboru .strings
Syntaxe lokalizovaných řetězcových hodnot je:
/* comment */
"key"="localized-value";
V řetězcích byste měli utéct následující znaky:
- Kvóta pro
\"
\\
Zpětné lomítko\n
Newline
Toto je příklad es/Localizable.strings (tj. Španělština) soubor z ukázky:
"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";
Obrázky
Lokalizace obrázku v iOSu:
Podívejte se na obrázek v kódu, například:
UIImage.FromBundle("flag");
Umístěte výchozí soubor bitové kopie flag.png do base.lproj (adresář nativního vývojového jazyka).
Volitelně umístěte lokalizované verze obrázku do složek .lproj pro každý jazyk (např. es.lproj, ja.lproj). V každém adresáři jazyka použijte stejný název souboru flag.png .
Pokud image není k dispozici pro určitý jazyk, iOS se vrátí do výchozí složky nativního jazyka a načte image odtud.
Spuštění imagí
Při umísťování do adresářů .lproj pro každý jazyk použijte standardní zásady vytváření názvů pro spouštěcí obrázky (a XIB nebo Storyboard pro modely i Telefon 6).
Default.png
Default@2x.png
Default-568h@2x.png
LaunchScreen.xib
Název aplikace
Umístěním souboru InfoPlist.strings do adresáře .lproj můžete přepsat některé hodnoty z souboru Info.plist aplikace, včetně názvu aplikace:
"CFBundleDisplayName" = "LeónTodo";
Další klíče, které můžete použít k lokalizaci řetězců specifických pro aplikaci, jsou:
- CFBundleName
- CFBundleShortVersionString
- NS HumanReadableCopyright
Datové typy pro datum a čas
I když je možné k formátování dat a časů pro národní prostředí použít integrované funkce data a času rozhraní .NET (spolu s aktuálním CultureInfo
), bude toto nastavení ignorovat uživatelská nastavení specifická pro národní prostředí (které lze nastavit odděleně od jazyka).
K vytvoření výstupu, který odpovídá předvolbě národního prostředí uživatele, použijte iOS NSDateFormatter
. Následující ukázkový kód ukazuje základní možnosti formátování data a času:
var date = NSDate.Now;
var df = new NSDateFormatter ();
df.DateStyle = NSDateFormatterStyle.Full;
df.TimeStyle = NSDateFormatterStyle.Long;
Debug.WriteLine ("Full,Long: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Short;
df.TimeStyle = NSDateFormatterStyle.Short;
Debug.WriteLine ("Short,Short: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Medium;
df.TimeStyle = NSDateFormatterStyle.None;
Debug.WriteLine ("Medium,None: " + df.StringFor(date));
Výsledky pro angličtinu v USA:
Full,Long: Friday, August 7, 2015 at 10:29:32 AM PDT
Short,Short: 8/7/15, 10:29 AM
Medium,None: Aug 7, 2015
Výsledky pro španělštinu ve Španělsku:
Full,Long: viernes, 7 de agosto de 2015, 10:26:58 GMT-7
Short,Short: 7/8/15 10:26
Medium,None: 7/8/2015
Další informace najdete v dokumentaci k formátovacím souborům Apple Date. Při testování formátování data a času citlivého na národní prostředí zkontrolujte nastavení jazyka i Telefon i oblasti.
Rozložení zprava doleva (RTL)
iOS nabízí řadu funkcí, které pomáhají při vytváření aplikací pracujících s RTL:
- Pro zarovnání ovládacích prvků použijte automatické rozložení
leading
atrailing
atributy (které odpovídají anglickému a pravému rohu, ale pro jazyky RTL je obrácené). OvládacíUIStackView
prvek je užitečný zejména pro rozložení ovládacích prvků, které mají být rtL vědomi. - Používá se
TextAlignment = UITextAlignment.Natural
pro zarovnání textu (které bude ponecháno pro většinu jazyků, ale přímo pro rtL). UINavigationController
automaticky překlopí tlačítko Zpět a otočí směr potáhnutí prstem.
Následující snímky obrazovky ukazují lokalizovanou ukázku Tasky v arabštině a hebrejštině (i když v polích byla zadána angličtina):
iOS automaticky otočí UINavigationController
a ostatní ovládací prvky se umístí dovnitř UIStackView
nebo zarovnají s automatickým rozložením.
Text RTL se lokalizuje pomocí souborů .strings stejným způsobem jako text LTR.
Lokalizace uživatelského rozhraní v kódu
Ukázka Tasky (lokalizovaná v kódu) ukazuje, jak lokalizovat aplikaci, ve které je uživatelské rozhraní integrované v kódu (místo XIB nebo scénářů).
Struktura projektu
Soubor Localizable.strings
Jak je popsáno výše, formát souboru Localizable.strings se skládá z párů klíč-hodnota. Klíč popisuje záměr řetězce a hodnota je přeložený text, který se má v aplikaci použít.
Níže jsou uvedeny lokalizace španělštiny (es) pro ukázku:
"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";
Provádění lokalizace
V kódu aplikace se kód používá všude, kde je nastavený zobrazovaný text uživatelského rozhraní (bez ohledu na to, jestli se jedná o text popisku nebo zástupný symbol vstupu atd.), použije kód funkci iOS GetLocalizedString
k načtení správného překladu, který se má zobrazit:
var localizedString = NSBundle.MainBundle.GetLocalizedString ("key", "optional");
someControl.Text = localizedString;
Lokalizace uživatelských rozhraní scénáře
Ukázkový úkol (lokalizovaná storyboard) ukazuje, jak lokalizovat text v ovládacích prvcích ve scénáři.
Struktura projektu
Adresář Base.lproj obsahuje scénář a měl by obsahovat také všechny image použité v aplikaci.
Ostatní jazykové adresáře obsahují soubor Localizable.strings pro všechny řetězcové prostředky odkazované v kódu a soubor MainStoryboard.strings , který obsahuje překlady textu ve scénáři.
Jazykové adresáře by měly obsahovat kopii všech obrázků, které byly lokalizovány, aby bylo přepsáno v Base.lproj.
ID objektu / ID lokalizace
Při vytváření a úpravách ovládacích prvků ve scénáři vyberte každý ovládací prvek a zkontrolujte ID, které se má použít pro lokalizaci:
- V Visual Studio pro Mac se nachází v oblasti Vlastností a označuje se jako ID lokalizace.
- V Xcode se nazývá ID objektu.
Tato řetězcová hodnota má často tvar, například "NF3-h8-xmR", jak je znázorněno na následujícím snímku obrazovky:
Tato hodnota se používá v souboru .strings k automatickému přiřazení přeloženého textu každému ovládacímu prvku.
MainStoryboard.strings
Formát souboru překladu scénáře je podobný souboru Localizable.strings s tím rozdílem, že klíč (hodnota vlevo) nemůže být definován uživatelem, ale musí mít velmi specifický formát: ObjectID.property
.
V příkladu Mainstoryboard.strings níže vidíte UITextField
, že jsou placeholder
textové vlastnosti, které lze lokalizovat; UILabel
s mají text
vlastnost; a UIButton
výchozí text je nastaven pomocí normalTitle
:
"SXg-TT-IwM.placeholder" = "nombre de la tarea";
"Pqa-aa-ury.placeholder"= "otra información de tarea";
"zwR-D9-hM1.text" = "Detalles de la tarea";
"bAM-2j-Rzw.text" = "Notas"; /* Notes */
"NF3-h8-xmR.text" = "Completo"; /* Done */
"MWt-Ya-pMf.normalTitle" = "Guardar"; /* Save */
"IGr-pR-05L.normalTitle" = "Eliminar"; /* Delete */
Důležité
Použití scénáře s třídami velikostí může vést k překladům, které se v aplikaci nezobrazují. Poznámky k verzi Xcode společnosti Apple naznačují, že scénář nebo XIB nebudou správně lokalizovány, pokud jsou splněny tři věci: používá třídy velikostí, základní lokalizaci a cíl sestavení jsou nastaveny na Univerzální a build cílí na iOS 7.0. Oprava je duplikovat soubor řetězců scénáře do dvou identických souborů: MainStoryboard~iphone.strings a MainStoryboard~ipad.strings, jak je znázorněno na následujícím snímku obrazovky:
Výpis z App Storu
Postupujte podle nejčastějších dotazů společnosti Apple k lokalizaci App Storu a zadejte překlady pro každou zemi, ve které je vaše aplikace v prodeji. Všimněte si upozornění, že se překlady zobrazí jenom v případě, že vaše aplikace obsahuje také lokalizovaný adresář .lproj pro daný jazyk.
Shrnutí
Tento článek popisuje základy lokalizace aplikací pro iOS pomocí integrovaných funkcí pro zpracování prostředků a scénáře.
Další informace o i18n a L10n pro iOS, Android a multiplatformní aplikace (včetně Xamarin.Forms) najdete v této příručce pro různé platformy.