Sdílet prostřednictvím


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:

  1. Podívejte se na obrázek v kódu, například:

    UIImage.FromBundle("flag");
    
  2. Umístěte výchozí soubor bitové kopie flag.png do base.lproj (adresář nativního vývojového jazyka).

  3. 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 a trailing 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):

Localization in Arabic

Localization in Hebrew

iOS automaticky otočí UINavigationControllera 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

Screenshot shows the resources tree for a sample including the location of localizable strings.

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.

Screenshot shows the resources tree for a sample including the location of MainStoryboard strings.

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:

Xcode view of Storyboard localization

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; UILabels mají text vlastnost; a UIButtonvý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:

Strings files

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.