Lokalizacja na platformie Xamarin.iOS

W tym dokumencie omówiono funkcje lokalizacji zestawu SDK systemu iOS oraz sposób uzyskiwania do nich dostępu za pomocą platformy Xamarin.

Zapoznaj się z kodowaniem międzynarodowych, aby uzyskać instrukcje dotyczące dołączania zestawów znaków/stron kodu w aplikacjach, które muszą przetwarzać dane inne niż Unicode.

Funkcje platformy systemu iOS

W tej sekcji opisano niektóre funkcje lokalizacji w systemie iOS. Przejdź do następnej sekcji , aby zobaczyć konkretny kod i przykłady.

Język

Użytkownicy wybierają swój język w aplikacji Ustawienia. To ustawienie ma wpływ na ciągi języka i obrazy wyświetlane przez system operacyjny i w aplikacjach.

Aby określić język używany w aplikacji, pobierz pierwszy element elementu :NSBundle.MainBundle.PreferredLocalizations

var lang = NSBundle.MainBundle.PreferredLocalizations[0];

Ta wartość będzie kodem językowym, takim jak en angielski, es hiszpański, ja japoński itp. Zwrócona wartość jest ograniczona do jednej z lokalizacji obsługiwanych przez aplikację (przy użyciu reguł rezerwowych w celu określenia najlepszego dopasowania).

Kod aplikacji nie zawsze musi sprawdzać tę wartość — platforma Xamarin i system iOS udostępniają funkcje, które pomagają automatycznie podać prawidłowy ciąg lub zasób dla języka użytkownika. Te funkcje zostały opisane w pozostałej części tego dokumentu.

Uwaga

Służy NSLocale.PreferredLanguages do określania preferencji językowych użytkownika, niezależnie od lokalizacji obsługiwanych przez aplikację. Wartości zwrócone przez tę metodę zmieniły się w systemie iOS 9; Aby uzyskać szczegółowe informacje, zobacz Informacje techniczne TN2418 .

Ustawienia regionalne

Użytkownicy wybierają ustawienia regionalne w aplikacji Ustawienia. To ustawienie wpływa na sposób formatowania dat, godzin, liczb i waluty.

Dzięki temu użytkownicy mogą wybrać, czy widzą formaty czasu 12-godzinnego, czy 24-godzinnego, czy separator dziesiętny jest przecinkiem, czy punktem, oraz kolejność dnia, miesiąca i roku w wyświetlaniu daty.

Za pomocą platformy Xamarin masz dostęp zarówno do klas systemu iOS firmy Apple (NSNumberFormatter), jak i klas platformy .NET w system.Globalization. Deweloperzy powinni ocenić, co lepiej odpowiada ich potrzebom, ponieważ w każdej z nich są dostępne różne funkcje. W szczególności w przypadku pobierania i wyświetlania cen zakupu w aplikacji przy użyciu zestawu StoreKit należy użyć klas formatowania firmy Apple dla zwróconych informacji o cenach.

Bieżące ustawienia regionalne można wykonywać na jeden z dwóch sposobów:

  • NSLocale.CurrentLocale.LocaleIdentifier
  • NSLocale.AutoUpdatingCurrentLocale.LocaleIdentifier

Pierwsza wartość może być buforowana przez system operacyjny i dlatego nie zawsze może odzwierciedlać aktualnie wybrane ustawienia regionalne użytkownika. Użyj drugiej wartości, aby uzyskać aktualnie wybrane ustawienia regionalne.

Uwaga

Mono (środowisko uruchomieniowe platformy .NET, na którym bazuje platforma Xamarin.iOS), a interfejsy API systemu iOS firmy Apple nie obsługują identycznych zestawów kombinacji języków/regionów. W związku z tym można wybrać kombinację języka/regionu w aplikacji Ustawienia systemu iOS, która nie jest mapowana na prawidłową wartość w środowisku Mono. Na przykład ustawienie języka i Telefon na angielski i jego region na Hiszpania spowoduje, że następujące interfejsy API dają różne wartości:

  • CurrentThead.CurrentCulture: en-US (Mono API)
  • CurrentThread.CurrentUICulture: en-US (Mono API)
  • NSLocale.CurrentLocale.LocaleIdentifier: en_ES (interfejs API firmy Apple)

Ponieważ mono używa CurrentThread.CurrentUICulture do wybierania zasobów i formatowania dat i CurrentThread.CurrentCulture walut, lokalizacja oparta na mono (na przykład z plikami resx) może nie przynieść oczekiwanych wyników dla tych kombinacji języków/regionów. W takich sytuacjach należy opierać się na interfejsach API firmy Apple, aby lokalizować je w razie potrzeby.

NSCurrentLocaleDidChangeNotification

System iOS generuje wartość NSCurrentLocaleDidChangeNotification , gdy użytkownik aktualizuje ustawienia regionalne. Aplikacje mogą nasłuchiwać tego powiadomienia podczas ich działania i mogą wprowadzać odpowiednie zmiany w interfejsie użytkownika.

Podstawy lokalizacji w systemie iOS

Następujące funkcje systemu iOS są łatwo używane na platformie Xamarin w celu zapewnienia zlokalizowanych zasobów do wyświetlania użytkownikowi. Zapoznaj się z przykładem TaskyL10n, aby zobaczyć, jak zaimplementować te pomysły.

Określanie domyślnych i obsługiwanych języków w pliku Info.plist

W sekcji Technical Q&A QA1828: How iOS Determins the Language For Your App (Q&A Technical Q&A QA1828: Jak system iOS określa język używany w aplikacji). Następujące czynniki wpływają na wyświetlany język:

  • Preferowane języki użytkownika (znajdujące się w aplikacji Ustawienia)
  • Lokalizacje połączone z aplikacją (foldery lproj)
  • CFBundleDevelopmentRegion (Wartość Info.plist określająca język domyślny aplikacji)
  • CFBundleLocalizations (Tablica Info.plist określająca wszystkie obsługiwane lokalizacje)

Jak wskazano w sekcji Technical Q&A, CFBundleDevelopmentRegion reprezentuje domyślny region i język aplikacji. Jeśli aplikacja nie obsługuje jawnie żadnego z preferowanych języków użytkownika, będzie używać języka określonego przez to pole.

Ważne

System iOS 11 stosuje ten mechanizm wyboru języka bardziej ściślej niż poprzednie wersje systemu operacyjnego. W związku z tym każda aplikacja systemu iOS 11, która nie deklaruje jawnie obsługiwanych lokalizacji — w tym foldery lproj lub ustawia wartość dla CFBundleLocalizations — może wyświetlać inny język w systemie iOS 11 niż w systemie iOS 10.

Jeśli CFBundleDevelopmentRegion nie określono go w pliku Info.plist , narzędzia kompilacji platformy Xamarin.iOS używają obecnie wartości domyślnej en_US. Chociaż może to ulec zmianie w przyszłej wersji, oznacza to, że domyślnym językiem jest angielski.

Aby upewnić się, że aplikacja wybierze oczekiwany język, wykonaj następujące kroki:

  • Określ język domyślny. Otwórz plik Info.plist i użyj widoku Źródło , aby ustawić wartość CFBundleDevelopmentRegion klucza. W pliku XML powinien wyglądać podobnie do następującego:
<key>CFBundleDevelopmentRegion</key>
<string>es</string>

W tym przykładzie użyto wartości "es", aby określić, że jeśli żaden z preferowanych języków użytkownika nie jest obsługiwany, domyślnie jest używany język hiszpański.

  • Zadeklaruj wszystkie obsługiwane lokalizacje. W pliku Info.plist użyj widoku Źródło, aby ustawić tablicę dla CFBundleLocalizations klucza. W pliku XML powinien wyglądać podobnie do następującego:
<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>es</string>
    ...
</array>

Aplikacje platformy Xamarin.iOS zlokalizowane przy użyciu mechanizmów platformy .NET, takich jak pliki resx, muszą również podać te wartości Info.plist .

Aby uzyskać więcej informacji na temat tych kluczy Info.plist, zapoznaj się z dokumentacją klucza listy właściwości informacji firmy Apple.

GetLocalizedString, metoda

Metoda NSBundle.MainBundle.GetLocalizedString wyszukuje zlokalizowany tekst, który został zapisany w plikach ciągów w projekcie. Te pliki są zorganizowane według języka, w specjalnie nazwanych katalogach z sufiksem lproj (zwróć uwagę, że pierwsza litera rozszerzenia jest małymi literami "L").

Lokalizacje plików ciągów

  • Base.lproj to katalog zawierający zasoby dla języka domyślnego. Często znajduje się on w katalogu głównym projektu (ale można go również umieścić w folderze Resources ).
  • <Katalogi language.lproj> są tworzone dla każdego obsługiwanego języka, zwykle w folderze Resources.

W każdym katalogu językowym może istnieć wiele różnych plików ciągów :

  • Localizable.strings — główna lista zlokalizowanego tekstu.
  • InfoPlist.strings — niektóre określone klucze są dozwolone w tym pliku, aby przetłumaczyć takie elementy jak nazwa aplikacji.
  • <storyboard-name.strings> — opcjonalny plik zawierający tłumaczenia elementów interfejsu użytkownika w scenorysie.

Akcja kompilacji dla tych plików powinna mieć wartość Zasób pakietu.

Format pliku .strings

Składnia zlokalizowanych wartości ciągów jest następująca:

/* comment */
"key"="localized-value";

W ciągach należy stosować znaki ucieczki:

  • Oferta dla klienta \"
  • \\ Ukośnik odwrotny
  • \n Newline

Jest to przykład es/Localizable.strings (tj. Plik hiszpański z przykładu:

"<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";

Obrazy

Aby zlokalizować obraz w systemie iOS:

  1. Zapoznaj się z obrazem w kodzie, na przykład:

    UIImage.FromBundle("flag");
    
  2. Umieść domyślny plik obrazu flag.png w katalogu Base.lproj (natywny katalog języka programowania).

  3. Opcjonalnie umieść zlokalizowane wersje obrazu w folderach lproj dla każdego języka (np. es.lproj, ja.lproj). Użyj tej samej nazwy pliku flag.png w każdym katalogu językowym.

Jeśli obraz nie jest obecny dla określonego języka, system iOS wróci do domyślnego folderu języka natywnego i załaduje obraz stamtąd.

Uruchamianie obrazów

Użyj standardowych konwencji nazewnictwa dla obrazów uruchamiania (i XIB lub Storyboard dla modeli i Telefon 6) podczas umieszczania ich w katalogach lproj dla każdego języka.

Default.png
Default@2x.png
Default-568h@2x.png
LaunchScreen.xib

Nazwa aplikacji

Umieszczenie pliku InfoPlist.strings w katalogu lproj umożliwia zastąpienie niektórych wartości z pliku Info.plist aplikacji, w tym nazwy aplikacji:

"CFBundleDisplayName" = "LeónTodo";

Inne klucze, których można użyć do lokalizowania ciągów specyficznych dla aplikacji, to:

  • CFBundleName
  • CFBundleShortVersionString
  • NSHumanReadableCopyright

Daty i godziny

Chociaż można używać wbudowanych funkcji daty i godziny platformy .NET (wraz z bieżącym CultureInfo) do formatowania dat i godzin dla ustawień regionalnych, spowoduje to zignorowanie ustawień regionalnych specyficznych dla ustawień regionalnych (które można ustawić oddzielnie od języka).

Użyj systemu iOS NSDateFormatter , aby wygenerować dane wyjściowe zgodne z preferencjami regionalnymi użytkownika. Poniższy przykładowy kod przedstawia podstawowe opcje formatowania daty i godziny:

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));

Wyniki dla języka angielskiego w Stany Zjednoczone:

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

Wyniki dla języka hiszpańskiego w Hiszpanii:

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

Aby uzyskać więcej informacji, zapoznaj się z dokumentacją usługi Apple Date Formatters . Podczas testowania formatowania daty i godziny wrażliwej na ustawienia regionalne sprawdź ustawienia języka i regionu i Telefon.

Układ od prawej do lewej (RTL)

System iOS udostępnia wiele funkcji ułatwia tworzenie aplikacji obsługujących bibliotekę RTL:

  • Użyj atrybutów i trailing układu leading automatycznego do wyrównania kontrolek (co odpowiada lewej i prawej dla języka angielskiego, ale jest odwrócone dla języków RTL). Kontrolka jest szczególnie przydatna UIStackView do układania kontrolek obsługujących bibliotekę RTL.
  • Służy TextAlignment = UITextAlignment.Natural do wyrównania tekstu (które pozostanie w przypadku większości języków, ale odpowiednie dla biblioteki RTL).
  • UINavigationController automatycznie odwraca przycisk wstecz i odwraca kierunek przesunięcia.

Na poniższych zrzutach ekranu przedstawiono zlokalizowany przykład Tasky w języku arabskim i hebrajskim (chociaż angielski został wprowadzony w polach):

Localization in Arabic

Localization in Hebrew

System iOS automatycznie odwraca kontrolki UINavigationController, a inne kontrolki są umieszczane wewnątrz UIStackView lub wyrównane do automatycznego układu. Tekst RTL jest zlokalizowany przy użyciu plików strings w taki sam sposób jak tekst LTR.

Lokalizowanie interfejsu użytkownika w kodzie

Przykład Tasky (zlokalizowany w kodzie) pokazuje, jak lokalizować aplikację, w której interfejs użytkownika jest wbudowany w kod (zamiast XIB lub scenorysów).

Struktura projektu

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

Plik Localizable.strings

Zgodnie z powyższym opisem format pliku Localizable.strings składa się z par klucz-wartość. Klucz opisuje intencję ciągu, a wartość to przetłumaczony tekst, który ma być używany w aplikacji.

Lokalizacje hiszpańskich (es) dla przykładu przedstawiono poniżej:

"<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";

Wykonywanie lokalizacji

W kodzie aplikacji wszędzie tam, gdzie jest ustawiony tekst wyświetlany interfejsu użytkownika (niezależnie od tego, czy jest to tekst etykiety, czy symbol zastępczy danych wejściowych itp.), kod używa funkcji systemu iOS GetLocalizedString do pobrania poprawnego tłumaczenia do wyświetlenia:

var localizedString = NSBundle.MainBundle.GetLocalizedString ("key", "optional");
someControl.Text = localizedString;

Lokalizowanie interfejsów użytkownika scenorysu

Przykładowy scenorys Tasky (zlokalizowany scenorys) pokazuje, jak lokalizować tekst w kontrolkach w scenorysie.

Struktura projektu

Katalog Base.lproj zawiera scenorys i powinien również zawierać wszystkie obrazy używane w aplikacji.

Inne katalogi językowe zawierają plik Localizable.strings dla wszystkich zasobów ciągów, do których odwołuje się kod, a także plik MainStoryboard.strings zawierający tłumaczenia tekstu w scenorysie.

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

Katalogi językowe powinny zawierać kopię wszystkich zlokalizowanych obrazów, aby zastąpić katalog znajdujący się w pliku Base.lproj.

Identyfikator obiektu/identyfikator lokalizacji

Podczas tworzenia i edytowania kontrolek w scenorysie zaznacz każdą kontrolkę i sprawdź identyfikator, który ma być używany do lokalizacji:

  • W Visual Studio dla komputerów Mac znajduje się w okienku właściwości i jest nazywany identyfikatorem lokalizacji.
  • W programie Xcode jest on nazywany identyfikatorem obiektu.

Ta wartość ciągu często ma postać taką jak "NF3-h8-xmR", jak pokazano na poniższym zrzucie ekranu:

Xcode view of Storyboard localization

Ta wartość jest używana w pliku strings do automatycznego przypisywania przetłumaczonego tekstu do każdej kontrolki.

MainStoryboard.strings

Format pliku tłumaczenia scenorysu jest podobny do pliku Localizable.strings , z tą różnicą, że klucz (wartość po lewej stronie) nie może być zdefiniowany przez użytkownika, ale zamiast tego musi mieć bardzo określony format: ObjectID.property.

W poniższym przykładzie mainstoryboard.strings można zobaczyć UITextField, że mają właściwość tekstową placeholder , która może być zlokalizowana; UILabels mają text właściwość, a UIButtondomyślny tekst jest ustawiany przy użyciu polecenia 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 */

Ważne

Użycie scenorysu z klasami rozmiarów może spowodować tłumaczenie, które nie są wyświetlane w aplikacji. Informacje o wersji Xcode firmy Apple wskazują, że scenorys lub XIB nie będzie poprawnie lokalizować, jeśli trzy elementy są prawdziwe: używa klas rozmiarów, lokalizacji podstawowej i celu kompilacji są ustawione na Universal, a kompilacja jest przeznaczona dla systemu iOS 7.0. Poprawka polega na duplikowania pliku ciągów scenorysu do dwóch identycznych plików: MainStoryboard~iphone.strings i MainStoryboard~ipad.strings, jak pokazano na poniższym zrzucie ekranu:

Strings files

Lista sklepu App Store

Wynika z często zadawanych pytań firmy Apple dotyczących lokalizacji sklepu App Store w celu wprowadzenia tłumaczeń dla każdego kraju, w których aplikacja jest w sprzedaży. Zwróć uwagę na ostrzeżenie, że tłumaczenia będą wyświetlane tylko wtedy, gdy aplikacja zawiera również zlokalizowany katalog lproj dla języka.

Podsumowanie

W tym artykule omówiono podstawy lokalizowania aplikacji systemu iOS przy użyciu wbudowanych funkcji obsługi zasobów i scenorysu.

Więcej informacji na temat systemów i18n i L10n dla systemów iOS, Android i aplikacji międzyplatformowych (w tym zestawu narzędzi Xamarin.Forms) można uzyskać w tym przewodniku dla wielu platform.