Hittil har alle våre eksempelprosjekter antatt at våre apper var bestemt for engelsktalende, men mange programmer kan ha nytte av å være tilgjengelig for ikke-engelsktalende publikum. App Store tar seg av å presentere vår app til rett publikum, men det er vår jobb som utviklere å konfigurere den på en slik måte at de riktige ressursene vises til brukere fra forskjellige regioner. Denne prosessen kalles lokalisering.
Heldigvis gjør iOS det overraskende enkelt å lokalisere ressurser ved hjelp av bunter. NSBundle-klassen velger automatisk den aktuelle eiendelen ved å ta hensyn til brukerens foretrukne språk. Hvis du for eksempel har oppgitt forskjellige versjoner av samme bilde for engelsktalende versus spansktalende, returnerer pathForResource: ofType: -metoden som er omtalt i forrige kapittel forskjellige filbaner, avhengig av brukerens innstillinger. Dette er en av de viktigste årsakene til at du ikke direkte skal få tilgang til buntressurser ved hjelp av hardkodede baner.
De tre aspektene av en app som vanligvis må lokaliseres, er bilder, lyd eller videoer som inneholder et bestemt språk, hardkodede strenge og storyboards. I dette kapitlet tar vi en kort titt på lokalisering av medieressurser og hardkodede strenger ved hjelp av NSBundles innebygde internasjonaliseringsfunksjoner. Storyboard-filer kan lokaliseres ved hjelp av samme prosess.
Eksemplet for dette kapittelet er et enkelt program som viser forskjellige bilder eller strenge basert på brukerens foretrukne språk. Opprett en ny Single View-applikasjon og kaller den "Internationalisering." Som alltid, Bruk Storyboards, og Bruk automatisk referansetelling bør velges.
Det første trinnet for å lage en applikasjon flerspråklig er å legge til de støttede språkene til prosjektet. I prosjektnavigatoren velger du prosjektikonet.
Deretter velger du Internationaliseringsprosjektet i den venstre kolonnen (ikke forveksles med Internasjonaliseringsmål). Kontroller at Info-fanen er valgt; du bør se følgende vindu:
For å legge til støtte for et annet språk, velg plustegnet under lokaliseringer seksjon. Du kan velge hvilket språk du liker, men denne boken vil bruke spansk. Hvis du velger et språk, åpnes en dialog som spør hvilke filer som skal lokaliseres. Fjern markeringen av MainStoryboard.storyboard, men gå InfoPlist.strings valgt.
Det er nå mulig å legge til en spansk versjon av hver ressurs i applikasjonspakken.
Deretter ser vi på lokalisering av medieaktiver. I ressurspakken for denne boken finner du en fil som heter syncfusion-icon-en.png. Legg til denne filen i applikasjonspakken ved å dra den til prosjektnavigatoren og endre den på nytt som syncfusion-icon.png. Deretter viser du det i visningen ved å endre viewDidLoad metode i ViewController.m til følgende:
- (void) viewDidLoad [super viewDidLoad]; // Finn bildet. NSString * imagePath = [[NSBundle mainBundle] pathForResource: @ "syncfusion-icon" ofType: @ "png"]; NSLog (@ "% @", imagePath); // Last bildet. UIImage * imageData = [[UIImage allokering] initWithContentsOfFile: imagePath]; hvis (imageData! = null) // Vis bildet. UIImageView * imageView = [[UIImageView alloc] initWithImage: imageData]; CGRect screenBounds = [[UIScreen mainScreen] grenser]; imageView.contentMode = UIViewContentModeCenter; CGRect frame = imageView.frame; frame.size.width = screenBounds.size.width; frame.size.height = screenBounds.size.height; imageView.frame = frame; [[selvbildevisning] addSubview: imageView]; else NSLog (@ "Kunne ikke laste filen");
Når du kompilerer prosjektet, bør du se et lite ikon som vises midt på skjermen:
Du bør også se banen Internationalization.app/syncfusion-icon.png i utgangspanelet. Ingenting nytt her, bare et bilde på toppnivået av applikasjonspakken, men dette kommer til å endres når vi lokaliserer bildefilen.
For å gjøre dette, velg bildet i Prosjektnavigatoren, åpne Verktøy-panelet, og klikk Gjør lokalisert under lokalisering seksjon.
Den neste dialogen ber deg om å velge et språk. Å velge Engelsk og klikk lokal~~POS=TRUNC.
Dette forteller iOS at denne versjonen av syncfusion-icon.png er for engelsktalende. Vi legger til en spansk versjon på et øyeblikk, men først la oss se på hva som skjer bak kulissene. For å se lokaliseringene dine, må du nullstille iOS-simulatoren og gjøre en ren bygg. For å tilbakestille simulatoren, naviger til iOS-simulator> Tilbakestill innhold og innstillinger i menylinjen og velg Tilbakestill i den resulterende dialogen.
Avslutt simulatoren og gå tilbake til Internationaliseringsprosjektet i Xcode. For å gjøre en ren bygge, naviger til Produkt> Rengjør i menylinjen og kompilere prosjektet igjen som du normalt ville. Du bør se en annen filbane i Output Panel:
Internationalization.app/en.lproj/syncfusion-icon.png.
Den nye en.lproj / underkatalog er den interne måten å organisere språkspesifikke filer på iOS. Alle ressursene lokalisert på engelsk vil vises i denne underkatalogen, og alle spanske versjonene vil vises i es.lproj / katalogen. Men igjen, vi trenger egentlig ikke å vite hvor filen ligger; NSBundle s pathForResource: ofType: Metoden viser det automatisk.
Så er vår engelsk versjon av bildet satt opp. Deretter må vi konfigurere den spanske versjonen. Velg den engelske versjonen av filen i Project Navigator, og velg avkrysningsboksen ved siden av spansk i lokaliseringsdelen av Verktøy-panelet..
Dette kopierer den eksisterende engelskspråklige versjonen av syncfusion-icon.png inn i det es.lproj / katalogen. Tilbake i Project Navigator, bør du kunne se dette ved å utvide syncfusion-icon.png fil.
Selvfølgelig må vi erstatte den spanske versjonen med en helt annen fil. Den enkleste måten å gjøre dette på er å velge syncfusion-icon.png (Spansk) fil og klikk på pilikonet ved siden av Full vei streng i verktøy panel.
Dette viser innholdet i es.lproj / mappe i Finder, som gir oss muligheten til å erstatte filen manuelt. Slett det eksisterende syncfusion-icon.png filen og kopier den syncfusion-icon-es.png fil fra ressurspakken til es.lproj /. Sørg for å gi nytt navn til det som syncfusion-icon.png. Det er viktig for lokale versjoner av samme fil å ha identiske filnavn slik at NSBundle kan finne dem. Etter at du har erstattet filen, bør du se forskjellige bilder når du velger de to lokaliseringene i Xcode.
Det burde være det for å lokalisere vår bildefil. For å teste det kan du endre enhetsspråket på samme måte som du vil endre det i en ekte enhet gjennom Innstillinger-appen. Klikk på enhetens hjemme-knapp i simulatoren, klikk og dra på skjermen til høyre, og start programmet Innstillinger. Under Generelt> Internasjonalt> Språk, kan du velge enhetsspråket.
Velg Español, og åpne programmet på nytt. Du bør se den spanske versjonen av syncfusion-icon.png. Du må kanskje lukke simulatoren og kompilere programmet på nytt. Legg merke til at filbanen utgis av NSLog () nå leser:
Internationalization.app/es.lproj/syncfusion-icon.png.
Som du kan se, er det utrolig enkelt å lokalisere filer ved hjelp av NSBundles innebygde funksjonalitet. Tanken er å bruke NSBundle som en abstraksjon mellom søknadskoden og de eiendelene de stoler på. Dette isolerer lokaliseringsprosessen fra utviklingsprosessen, noe som gjør det veldig enkelt å outsource oversettelser.
Lokalisering av video- og lydfiler bruker nøyaktig samme prosess som nettopp diskuteres. Men å forberede tekst til et internasjonalt publikum krever litt mer arbeid.
Når du har å gjøre med en flerspråklig app, må hardkodede strenge abstraheres til en pakkeaktiv, slik at NSBundle kan laste riktig språk ved kjøretid. iOS bruker det som kalles en strengfil for å lagre oversettelser av alle streng-bokstavene i søknaden din. Etter å ha opprettet denne strengfilen, kan du lokalisere den ved hjelp av samme metode som diskutert i forrige avsnitt.
La oss endre vår viewDidLoad-metode for å vise en knapp og sende ut en melding når brukeren tapper 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); [[selvvisning] addSubview: aButton]; [aButton addTarget: selvhandling: @selector (sayHello :) forControlEvents: UIControlEventTouchUpInside]; - (void) sayHello: (id) avsender NSLog (@ "Hei, Verden!");
Disse metodene har to streng bokstaver som vi må flytte inn i en strengfil. De er @"Si hei" og @"Hei Verden!".
For å opprette strengfilen, opprett en ny fil og velg Ressurs> Strings File. Bruk Localizable.strings for filnavnet, som er standardstrengfilen som iOS ser etter.
Innholdet i strengfilen er en enkel liste over nøkkel- eller verdipar, formatert som følger.
"Button Title" = "Say Hello"; "Hilsen" = "Hei, Verden!";
Den venstre siden er nøkkelen du vil bruke til å referere til den oversatte strengen i søknadskoden din. Nøklene er vilkårlige strenger, men utviklere bruker vanligvis enten et semantisk navn som beskriver hvordan strengen skal brukes, eller målfrasen på morsmålet. I vår strengfil har vi valgt den tidligere. Verdiene for hver nøkkel følger likestilling. Sørg for å inkludere et semikolon på slutten av hver linje, eller forferdelige ting vil skje når du prøver å kjøre programmet.
Som med medieaktiver kan du få tilgang til innholdet i Localizable.strings via NSBundle. De localizedStringForKey: verdi: tabellen: metode returnerer verdien av en nøkkel fra en bestemt strengfil. Verdien argumentet lar deg angi en standard returverdi hvis nøkkelen ikke er funnet, og tabell argumentet bestemmer hvilken streng fil å bruke. Når du angir null for tabell, er standardverdien Localizable.strings filen brukes.
Siden tilgang til oversatte strenge er en slik felles oppgave, gir stiftelsesrammen også en praktisk måte NSLocalizedString () makro som du kan bruke som en enkel snarvei for localizedStringForKey: verdi: tabellen:. Den sender en tom streng for verdien argumentet og null for tabell argumentet. For de fleste applikasjoner, NSLocalizedString () er alt du trenger for å få tilgang til lokalisert tekst.
Så la oss endre knappens tittelkonfigurasjon for å bruke NSLocalizedString ():
[aButton setTitle: NSLocalizedString (@ "Button Title", null) forState: UIControlStateNormal]; Hvis du kompilerer prosjektet, bør knappen fortsatt lese, "Say Hello" - men nå er det lastet fra Localizable.strings. La oss gjøre det samme for sayHello-metoden: - (void) sayHello: (id) avsender NSLog (@ "% @", NSLocalizedString (@ "Greeting", null));
Nå som våre strenger er dynamisk lastet i stedet for å være hardkodede, er det trivielt å lokalisere dem. Vi bruker nøyaktig samme prosess som med bilder. I Project Navigator velger du filen Localizable.strings, og deretter klikker du Gjør lokalisert i Verktøy-panelet. Velg engelsk i den resulterende dialogboksen for å bruke denne versjonen av filen for engelsktalende brukere.
For å legge til en spansk versjon, velg Localizable.strings igjen og merk av i boksen ved siden av spansk i delen Lokaliseringer.
Akkurat som syncfusion-icon.png, du bør kunne utvide Localizable.strings fil i Project Navigator.
Til slutt legger du til noen oversettelser til den spanske versjonen av filen.
"Button Title" = "Dice Hola"; "Hilsen" = "Hola, Mundo!";
Du kan teste det på samme måte som vi testet bilder. Navigere til Tilbakestill innhold og innstillinger I simulatoren, lukk simulatoren, og gjør en ren bygning fra Xcode. Etter at du har endret språket til Español, bør knappen din lese "Dice Hola" i stedet for "Say Hello", og klikk på den skal skrive ut "Hola, Mundo!"
Det er alt som er å lokalisere strenger i et iOS-program. Igjen, å ha all din oversatte tekst i en enkelt fil helt abstrahert fra din søknadskode gjør det enkelt å outsource lokaliseringsarbeidet ditt. Dette er veldig bra, for de fleste utviklere snakker ikke flytende alle språkene de vil oversette sin app til.
Det er en viktig detalj som ikke har blitt adressert ennå, og lokaliserer appnavnet. Hvis du ser på startskjermen i iOS-simulatoren, vil du legge merke til at tittelen under appikonet ditt ikke er oversatt til spansk. Hvis du allerede har gått gjennom problemer med å lokalisere strengen i appen din, kan du også ta deg tid til å oversette litt metadata også.
En apps visningsnavn er definert i Info.plist under CFBundleDisplayName-tasten. I stedet for å tvinge deg til å oversette verdier i hovedsak Internasjonalisering-Info.plist fil, gir iOS deg en dedikert strengfil for å overskrive bestemte konfigurasjonsalternativer med lokaliserte verdier. I Støtter filer gruppe av Project Navigator, åpne InfoPlist.strings fil. Dette er akkurat som Localizable.strings fil vi opprettet i forrige seksjon, bortsett fra at den bare skal gi verdier for Info.plist nøkler. Legg til følgende i din InfoPlist.strings fil.
"CFBundleDisplayName" = "Hola, Mundo!";
Nå, hvis du tilbakestiller simulatoren og gjør en ren bygg, bør du se en spansk tittel under applikasjonsikonet ditt.
I dette kapitlet lærte vi hvordan du lokaliserer mediefiler, tekst og metadata ved hjelp av NSBundle. Ved å abstrahere ressursene som må lokaliseres i isolerte filer og referere dem indirekte via metoder som pathForResource: ofType:, Det er mulig å oversette søknaden til et annet språk uten å berøre en enkelt linje med søknadskoden. Dette er en veldig kraftig funksjon av iOS, spesielt med tanke på den internasjonale utbredelsen av iPhone og iPad-enheter.
Det siste kapitlet i IOS Succinctly tar en kort titt på den innebygde lydstøtten for iOS-applikasjoner. Som vi berørte i tidligere kapitler, bruker lydfiler samme buntestruktur som bilder og strengerfiler. I stedet for å fokusere på hvordan du får tilgang til disse ressursene, diskuterer vi imidlertid verktøyene på høyere nivå for å kontrollere lydavspilling.
Denne leksjonen representerer et kapittel fra iOS Succinctly, en gratis eBok fra teamet på Syncfusion.