IOS Succinctly - Lokalisering

Hittills har alla våra exempelprojekt antagit att våra appar var avsedda för engelska talare, men många applikationer kan dra nytta av att vara tillgängliga för icke-engelsktalande publik. App Store tar hand om att presentera vår app till rätt publik, men det är vårt jobb som utvecklare att konfigurera det på ett sådant sätt att lämpliga resurser visas för användare från olika regioner. Denna process kallas lokalisering.

Lyckligtvis gör iOS det överraskande enkelt att lokalisera resurser med hjälp av buntar. NSBundle-klassen väljer automatiskt lämplig tillgång genom att ta hänsyn till användarens föredragna språk. Om du till exempel har tillhandahållit olika versioner av samma bild för engelska talare jämfört med spanska talare returnerar pathForResource: ofType: -metoden som diskuterats i föregående kapitel olika filbanor beroende på användarens inställningar. Detta är en av de främsta anledningarna till att du inte direkt ska få tillgång till paketresurser med hjälp av hårdkodade sökvägar.

De tre aspekterna av en app som vanligtvis behöver lokaliseras är bilder, ljud eller videor som innehåller ett specifikt språk, hårdkodade strängar och storyboards. I det här kapitlet tar vi en kort titt på lokalisering av medieresurser och hårdkodade strängar med hjälp av NSBundles inbyggda internationaliseringsfunktioner. Storyboard-filer kan lokaliseras med samma process.


Skapa exempelapplikationen

Exemplet för det här kapitlet är en enkel applikation som visar olika bilder eller strängar baserat på användarens föredragna språk. Skapa en ny Single View Application och kalla den "Internationalization." Som alltid, Använd Storyboards, och Använd automatisk referensräkning bör väljas.


Aktiverar lokalisering

Det första steget att göra en applikation flerspråkig är att lägga till de språk som stöds för projektet. Välj projektikonen i projektnavigatorn.


Figur 96: Välja projektet i projektnavigatorn

Välj sedan Internationaliseringsprojektet i den vänstra kolumnen (inte förväxlas med målet Internationalization). Kontrollera att fliken Info är markerad; du borde se följande fönster:


Figur 97: Fönstret Projektinfo

För att lägga till stöd för ett annat språk, välj plustecknet under lokaliseringar sektion. Du kan välja vilket språk du vill, men den här boken kommer att använda spanska. Om du väljer ett språk öppnas en dialogruta som frågar vilka filer som ska lokaliseras. Rensa urvalet av MainStoryboard.storyboard, men lämna InfoPlist.strings vald.


Figur 98: Lägga till en spansk lokalisering

Det är nu möjligt att lägga till en spansk version av varje resurs till applikationspaketet.


Lokalisera bilder

Därefter tittar vi på lokaliserande medie tillgångar. I resurspaketet för den här boken hittar du en fil som heter syncfusion-icon-sv.png. Lägg till den här filen i programbuntet genom att dra det till projektnavigatorn och byt namn på det som syncfusion-icon.png. Visa sedan den i vyn genom att ändra viewDidLoad metod i ViewController.m till det följande:

 - (void) viewDidLoad [super viewDidLoad]; // Hitta bilden. NSString * imagePath = [[NSBundle mainBundle] pathForResource: @ "syncfusion-icon" ofType: @ "png"]; NSLog (@ "% @", imagePath); // Ladda bilden. UIImage * imageData = [[UIImage tilldela] initWithContentsOfFile: imagePath]; om (imageData! = nil) // Visa bilden. UIImageView * imageView = [[UIImageView alloc] initWithImage: imageData]; CGRect screenBounds = [[UIScreen mainScreen] gränser]; imageView.contentMode = UIViewContentModeCenter; CGRect-ram = imageView.frame; frame.size.width = screenBounds.size.width; frame.size.height = screenBounds.size.height; imageView.frame = frame; [[självvisning] addSubview: imageView];  else NSLog (@ "Kunde inte ladda filen"); 

När du sammanställer projektet bör du se en liten ikon som visas mitt på skärmen:


Figur 99: Programmatiskt lägger till en bild i vyn

Du borde också se vägen Internationalization.app/syncfusion-icon.png i utmatningspanelen. Inget nytt här, bara en bild på översta nivån i applikationspaketet, men det här kommer att förändras när vi lokaliserar bildfilen.

För att göra detta, välj bilden i projektnavigatorn, öppna panelen Verktyg och klicka på Gör lokaliserad under Lokalisering sektion.


Figur 100: Skapa en lokaliserad fil

Nästa dialog uppmanar dig att välja ett språk. Välj engelsk och klicka Lokalisera.


Figur 101: Konfigurera lokaliseringen

Detta berättar iOS att den här versionen av syncfusion-icon.png är för engelska talare. Vi lägger till en spansk version på ett ögonblick, men först låt oss titta på vad som händer bakom kulisserna. För att se dina lokaliseringar i åtgärd måste du återställa iOS-simulatorn och göra en ren byggnad. För att återställa simulatorn, navigera till iOS-simulator> Återställ innehåll och inställningar i menyraden och välj Återställ i den resulterande dialogrutan.


Figur 102: Återställning av iOS-simulatorn

Avsluta simulatorn och gå tillbaka till Internationaliseringsprojektet i Xcode. För att göra en ren byggning, navigera till Produkt> Rengör i menyraden och kompilera projektet igen som du normalt skulle. Du borde se en annan filväg i utmatningspanelen:

 Internationalization.app/en.lproj/syncfusion-icon.png.

Den nya sv.lproj / underkatalog är det interna sättet att organisera språkspecifika filer i iOS. Alla resurser lokaliserade på engelska kommer att visas i den här underkatalogen, och alla spanska versioner kommer att visas i es.lproj / underkatalog. Men igen, vi behöver inte faktiskt veta var filen finns NSBundle s pathForResource: ofType: Metoden räknar ut det automatiskt.

Så är vår engelska version av bilden upprättad. Därefter måste vi konfigurera den spanska versionen. Välj den engelska versionen av filen i projektnavigatorn och markera kryssrutan bredvid spanska i avsnittet Lokalisering på panelen Verktyg.


Figur 103: Lägga till en spansk version av filen

Detta kopierar den existerande engelskspråkiga versionen av syncfusion-icon.png in i es.lproj / underkatalog. Tillbaka i Project Navigator, bör du kunna se detta genom att expandera syncfusion-icon.png fil.


Figur 104: Båda versionerna av bildfilen i projektnavigatorn

Naturligtvis måste vi ersätta den spanska versionen med en helt annan fil. Det enklaste sättet att göra detta är genom att välja syncfusion-icon.png (Spanska) filen och klicka på pilikonen bredvid Fullständig sökväg sträng i verktyg panel.


Figur 105: Verktygspanelen för den spanska bildfilen

Detta visar innehållet i es.lproj / mapp i Finder, vilket ger oss möjlighet att ersätta filen manuellt. Ta bort det befintliga syncfusion-icon.png fil och kopiera syncfusion-icon-es.png filen från resurspaketet till es.lproj /. Se till att du byter namn på det som syncfusion-icon.png. Det är viktigt för lokala versioner av samma fil att ha identiska filnamn så NSBundle kan hitta dem. När du har ersatt filen bör du se olika bilder när du väljer de två lokaliseringarna i Xcode.

Det borde vara det för att lokalisera vår bildfil. För att testa det kan du ändra enhetsspråket på samma sätt som du skulle ändra det i en riktig enhet via appen Inställningar. Klicka på enhetens hemknapp i simulatorn, klicka och dra skärmen till höger och starta inställningsprogrammet. Under Allmänt> Internationellt> Språk kan du välja enhetsspråk.


Figur 106: Ändra enhetsspråket i iOS Simulator

Välj Español och öppna din ansökan igen. Du borde se den spanska versionen av syncfusion-icon.png. Du kan behöva stänga simulatorn och kompilera programmet igen. Observera att filvägen utmatas av NSLog () nu läser:

 Internationalization.app/es.lproj/syncfusion-icon.png.

Figur 107: Visar den lokaliserade versionen av bildfilen

Som du kan se är det otroligt enkelt att lokalisera filer med NSBundles inbyggda funktionalitet. Tanken är att använda NSBundle som en abstraktion mellan din ansökan kod och de tillgångar som de bygger på. Detta isolerar lokaliseringsprocessen från utvecklingsprocessen vilket gör det mycket enkelt att outsourka översättningar.

Att lokalisera video- och ljudfiler använder exakt samma process som just diskuterats. Men förberedelse av text för en internationell publik behöver lite mer arbete.


Lokalisering av text

När du hanterar en flerspråkig app måste hårddiskade strängar abstraheras till en bunttillgång så att NSBundle kan ladda rätt språk vid körtid. iOS använder vad som kallas en strängfil för att lagra översättningar av alla strängbokstäver i din ansökan. Efter att du skapat den här strängfilen kan du lokalisera den med samma metod som diskuterades i föregående avsnitt.

Låt oss ändra vår viewDidLoad-metod för att visa en knapp och mata ut ett meddelande när användaren knackar på den.

 - (void) viewDidLoad [super viewDidLoad]; UIButton * aButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [aButton setTitle: @ "Say Hello" forState: UIControlStateNormal]; aButton.frame = CGRectMake (100,0, 200,0, 120,0, 40,0); [[självvisning] addSubview: aButton]; [aButton addTarget: självåtgärd: @selector (sayHello :) forControlEvents: UIControlEventTouchUpInside];  - (void) sayHello: (id) avsändare NSLog (@ "Hej, Värld!"); 

Dessa metoder har två strängbokstäver som vi måste flytta till en strängfil. Dom är @"Säg hej" och @"Hej världen!".

Skapa en strängfil genom att skapa en ny fil och välj Resurs> Strängar Fil. Använda sig av Localizable.strings för filnamnet, vilket är standardsträngfilen som iOS letar efter.


Figur 108: Skapa en strängfil

Innehållet i strängfilen är en enkel lista över nyckel- eller värdepar, formaterad enligt följande.

 "Button Title" = "Säg Hello"; "Hälsning" = "Hej, Värld!";

Den vänstra sidan är nyckeln som du ska använda för att referera till den översatta strängen i din programkod. Nycklarna är godtyckliga strängar, men utvecklare använder vanligtvis antingen ett semantiskt namn som beskriver hur strängen ska användas eller målfrasen på sitt modersmål. I vår strängfil valde vi den tidigare. Värdena för varje nyckel följer ett likartat tecken. Var noga med att inkludera en semikolon i slutet av varje rad eller det kommer häftiga saker att hända när du försöker köra din ansökan.

Precis som med media tillgångar kan du komma åt innehållet i Localizable.strings via NSBundle. De localizedStringForKey: värde: tabell: Metoden returnerar värdet på en nyckel från en viss strängfil. Värdesargumentet kan du ange ett standardavkastningsvärde om nyckeln inte hittas, och tabellargumentet bestämmer vilken strängfil som ska användas. När du anger noll för tabell, är standardvärdet Localizable.strings filen används.

Eftersom tillgången till översatta strängar är en sådan gemensam uppgift, ger stiftelsens ramverk också ett bekvämt sätt NSLocalizedString () makro som du kan använda som en enkel genväg för localizedStringForKey: värde: tabell:. Den skickar en tom sträng för värdesargumentet och noll för tabellargumentet. För de flesta applikationer, NSLocalizedString () Det är allt du verkligen behöver för att komma åt lokaliserad text.

Så, låt oss ändra vår knapps titelkonfiguration för att använda NSLocalizedString ():

 [aButton setTitle: NSLocalizedString (@ "Button Title", noll) förState: UIControlStateNormal]; Om du sammanställer projektet, borde knappen fortfarande läsa, "Säg hej" - men nu laddas den från Localizable.strings. Låt oss göra detsamma för sayHello-metoden: - (void) sayHello: (id) avsändare NSLog (@ "% @", NSLocalizedString (@ "Greeting", nil)); 

Nu när våra strängar laddas dynamiskt istället för att vara hårdkodade, är det trivialt att lokalisera dem. Vi använder exakt samma process som med bilder. I Project Navigator väljer du filen Localizable.strings och klickar sedan på Gör lokaliserad i panelen Verktyg. Välj engelska i den resulterande dialogrutan för att använda den här versionen av filen för engelsktalande användare.

Om du vill lägga till en spansk version väljer du Localizable.strings igen och markerar kryssrutan bredvid spanska i avsnittet Lokaliseringar.


Figur 109: Lägga till en spansk version av Localizable.strings

Precis som syncfusion-icon.png, du borde kunna expandera Localizable.strings filen i projektnavigatorn.


Figur 110: Utvidga strängfilen för att visa dess lokaliseringar

Slutligen lägg till några översättningar till den spanska versionen av filen.

 "Button Title" = "Dice Hola"; "Hälsning" = "Hola, Mundo!";

Du kan testa det på samma sätt som vi testade bilder. Navigera till Återställ innehåll och inställningar I simulatorn stänger du simulatorn och gör en ren byggning från Xcode. Efter att du har ändrat språket till Español, bör din knapp läsa "Dice Hola" istället för "Say Hello" och klicka på den ska skriva "Hola, Mundo!"


Figur 111: Ändra enhetsspråket till spanska

Det är allt som finns att lokalisera strängar i en iOS-applikation. Återigen är det enkelt att lägga ut dina lokaliseringsinsatser genom att ha all din översatta text i en enda fil helt abstraherad från din ansökningskod. Detta är mycket bra, eftersom de flesta utvecklare inte flytande talar alla språk som de skulle vilja översätta sin app till.


Lokalisera Info.plist

Det finns en viktig detalj som inte har adresserats än-lokalisering av appnamnet. Om du tittar på startskärmen i iOS-simulatorn märker du att titeln under din appikon inte har översatts till spanska. Om du redan har problem med att lokalisera strängen i din app kan du också ta dig tid att översätta lite metadata också.

En apps visningsnamn definieras i Info.plist under CFBundleDisplayName-tangenten. Istället för att tvinga dig att översätta värden i huvudet Internationalisering-Info.plist fil, ger iOS en särskild strängfil för att skriva över vissa konfigurationsalternativ med lokala värden. I Stödja filer Grupp av Project Navigator, öppna InfoPlist.strings fil. Det här är precis som Localizable.strings fil som vi skapade i föregående avsnitt, förutom att det bara skulle ge värden för Info.plist nycklar. Lägg till följande i din InfoPlist.strings fil.

 "CFBundleDisplayName" = "Hola, Mundo!";

Nu, om du återställer simulatorn och gör en ren byggnad, borde du se en spansk titel under din applikationsikon.


Figur 112: Lokalisering av appens visningsnamn

Sammanfattning

I det här kapitlet lärde vi oss att lokalisera medietillgångar, text och metadata med NSBundle. Genom att abstrahera resurserna som behöver lokaliseras i isolerade filer och referera dem indirekt via metoder som pathForResource: ofType:, det är möjligt att översätta din ansökan till ett annat språk utan att röra en enda rad programkod. Detta är en mycket kraftfull funktion av iOS, särskilt med tanke på den internationella förekomsten av iPhone och iPad-enheter.

Det sista kapitlet i IOS Succinctly tar en kort titt på det inbyggda ljudstödet för iOS-applikationer. När vi berörde i tidigare kapitel använder ljudfiler samma buntstruktur som bilder och strängfiler. Men i stället för att fokusera på hur du får tillgång till dessa resurser diskuterar vi verktyg på högre nivå för att styra ljuduppspelning.

Denna lektion representerar ett kapitel från IOS Succinctly, en gratis eBook från laget på Syncfusion.