Tot nu toe zijn al onze voorbeeldprojecten ervan uitgegaan dat onze apps bestemd waren voor Engelssprekenden, maar veel apps kunnen er baat bij hebben beschikbaar te zijn voor niet-Engelstalige doelgroepen. De App Store zorgt ervoor dat onze app bij de juiste doelgroep wordt gepresenteerd, maar het is onze taak als ontwikkelaars om deze zo te configureren dat de juiste bronnen worden weergegeven aan gebruikers uit verschillende regio's. Dit proces wordt lokalisatie genoemd.
Gelukkig maakt iOS het verrassend eenvoudig om bronnen te lokaliseren met behulp van bundels. De klasse NSBundle selecteert automatisch het juiste item door rekening te houden met de voorkeurstaal van de gebruiker. Als u bijvoorbeeld verschillende versies van dezelfde afbeelding voor Engelssprekenden versus Spaanssprekers hebt opgegeven, retourneert de methode pathForResource: ofType: in het vorige hoofdstuk verschillende bestandspaden, afhankelijk van de instellingen van de gebruiker. Dit is een van de belangrijkste redenen waarom u geen directe toegang hebt tot bundelresources met behulp van hardcoded paden.
De drie aspecten van een app die doorgaans moet worden gelokaliseerd zijn afbeeldingen, audio of video's met een specifieke taal, hardgecodeerde tekenreeksen en storyboards. In dit hoofdstuk zullen we een korte blik werpen op het lokaliseren van mediabronnen en hardcoded strings met behulp van de ingebouwde internationaliseringsmogelijkheden van NSBundle. Storyboard-bestanden kunnen met hetzelfde proces worden gelokaliseerd.
Het voorbeeld voor dit hoofdstuk is een eenvoudige applicatie die verschillende afbeeldingen of strings weergeeft op basis van de voorkeurstaal van de gebruiker. Maak een nieuwe Single View-toepassing en noem deze 'Internationalisation'. Zoals altijd, Gebruik storyboards, en Gebruik automatische referentietelling moet worden geselecteerd.
De eerste stap om een toepassing meertalig te maken, is door de ondersteunde talen toe te voegen aan het project. Selecteer in de project-navigator het projectpictogram.
Selecteer vervolgens het project Internationalisatie in de linkerkolom (niet te verwarren met het doel Internationalisering). Zorg ervoor dat het tabblad Info is geselecteerd; je zou het volgende venster moeten zien:
Als u ondersteuning voor een andere taal wilt toevoegen, selecteert u het plusteken onder de lokalisaties sectie. Je kunt elke gewenste taal kiezen, maar dit boek gebruikt Spaans. Als u een taal selecteert, wordt een dialoogvenster geopend met de vraag welke bestanden moeten worden gelokaliseerd. Wis de selectie van MainStoryboard.storyboard, maar vertrek InfoPlist.strings gekozen.
Het is nu mogelijk om een Spaanse versie van elke resource aan de toepassingsbundel toe te voegen.
Vervolgens kijken we naar het lokaliseren van media-items. In het bronpakket voor dit boek vindt u een bestand met de naam syncfusion-icon-en.png. Voeg dit bestand toe aan de toepassingsbundel door het naar de projectnavigator te slepen en de naam ervan te wijzigen in syncfusion-icon.png. Toon het vervolgens in de weergave door de viewDidLoad methode in ViewController.m Naar het volgende:
- (void) viewDidLoad [super viewDidLoad]; // Zoek de afbeelding. NSString * imagePath = [[NSBundle mainBundle] pathForResource: @ "syncfusion-icon" ofType: @ "png"]; NSLog (@ "% @", imagePath); // Laad de afbeelding. UIImage * imageData = [[UIImage alloc] initWithContentsOfFile: imagePath]; if (imageData! = nil) // Geef de afbeelding weer. UIImageView * imageView = [[UIImageView alloc] initWithImage: imageData]; CGRect screenBounds = [[UIScreen mainScreen] bounds]; imageView.contentMode = UIViewContentModeCenter; CGRect-frame = imageView.frame; frame.size.width = screenBounds.size.width; frame.size.height = screenBounds.size.height; imageView.frame = frame; [[zelfweergave] addSubview: imageView]; else NSLog (@ "Kon het bestand niet laden");
Wanneer u het project compileert, ziet u een klein pictogram in het midden van het scherm:
Je zou ook het pad moeten zien Internationalization.app/syncfusion-icon.png in het Uitvoerpaneel. Niets nieuws hier, alleen een afbeelding op het hoogste niveau van de toepassingsbundel, maar dit gaat veranderen zodra we het imagebestand hebben gelokaliseerd.
Hiertoe selecteert u de afbeelding in de Project Navigator, opent u het paneel Utilities en klikt u op Maak gelokaliseerd onder de Localization sectie.
In de volgende dialoog wordt u gevraagd een taal te kiezen. kiezen Engels en klik Lokaliseren.
Dit vertelt iOS dat deze versie van syncfusion-icon.png is voor Engelssprekenden. We voegen een Spaanse versie in een moment toe, maar laten we eerst eens kijken naar wat er achter de schermen gebeurt. Als u uw lokalisaties in actie wilt zien, moet u de iOS-simulator opnieuw instellen en een schone build uitvoeren. Ga naar om de simulator opnieuw in te stellen iOS Simulator> Inhoud en instellingen opnieuw instellen in de menubalk en selecteer Resetten in het resulterende dialoogvenster.
Sluit de simulator en ga terug naar het Internationalization-project in Xcode. Om een schone build uit te voeren, navigeert u naar Product> Opschonen in de menubalk en compileert u het project zoals u dat normaal zou doen. U zou een ander pad moeten zien in het Output Panel:
Internationalization.app/en.lproj/syncfusion-icon.png.
De nieuwe en.lproj / subdirectory is de interne manier om taalspecifieke bestanden in iOS te organiseren. Alle bronnen die in het Engels zijn gelokaliseerd, verschijnen in deze submap en alle Spaanse versies verschijnen in de es.lproj / subdirectory. Maar nogmaals, we hoeven niet echt te weten waar het bestand zich bevindt; NSBundle's pathForResource: OfType: methode komt het automatisch tegen.
Dus onze Engelse versie van de afbeelding is ingesteld. Vervolgens moeten we de Spaanse versie configureren. Selecteer de Engelse versie van het bestand in de Project Navigator en schakel het selectievakje naast Spaans in het gedeelte Localisatie van het paneel Utilities in..
Hiermee wordt de bestaande Engelstalige versie van syncfusion-icon.png in de es.lproj / subdirectory. Terug in de Project Navigator, zou u dit moeten kunnen zien door het syncfusion-icon.png het dossier.
Natuurlijk moeten we de Spaanse versie vervangen door een heel ander bestand. De eenvoudigste manier om dit te doen is door de. Te selecteren syncfusion-icon.png (Spaans) bestand en klik op het pijlpictogram naast de Vol pad string in de nutsbedrijven paneel.
Dit geeft de inhoud van de es.lproj / map in de Finder, waardoor we het bestand handmatig kunnen vervangen. Verwijder de bestaande syncfusion-icon.png bestand en kopieer de syncfusion-icon-es.png bestand van het bronpakket in es.lproj /. Zorg ervoor dat je het hernoemt als syncfusion-icon.png. Het is belangrijk dat gelokaliseerde versies van hetzelfde bestand identieke bestandsnamen hebben, zodat NSBundle die kan vinden. Nadat u het bestand hebt vervangen, ziet u verschillende afbeeldingen wanneer u de twee lokalisaties in Xcode selecteert.
Dat zou het moeten zijn voor het lokaliseren van ons beeldbestand. Om het uit te testen, kunt u de apparaattaal op dezelfde manier wijzigen als op een echt apparaat, via de app Instellingen. Klik op de startknop van het apparaat in de simulator, klik en sleep het scherm naar rechts en start de applicatie Instellingen. Onder Algemeen> Internationaal> Taal, kunt u de apparaattaal selecteren.
Kies Español en open uw applicatie opnieuw. Je zou de Spaanse versie van moeten zien syncfusion-icon.png. Mogelijk moet u de simulator sluiten en het programma opnieuw compileren. Merk op dat het bestandspad wordt uitgevoerd met NSLog () leest nu:
Internationalization.app/es.lproj/syncfusion-icon.png.
Zoals u kunt zien, is het ongelooflijk eenvoudig om bestanden te lokaliseren met behulp van de ingebouwde functionaliteit van NSBundle. Het idee is om NSBundle te gebruiken als een abstractie tussen uw applicatiecode en de activa waarop zij vertrouwen. Dit isoleert het lokalisatieproces van het ontwikkelingsproces, waardoor het erg gemakkelijk is om vertalingen uit te besteden.
Het lokaliseren van video- en audiobestanden maakt gebruik van exact hetzelfde proces dat zojuist is besproken. Het voorbereiden van tekst voor een internationaal publiek vereist echter een beetje meer werk.
Wanneer u te maken hebt met een meertalige app, moeten hardgecodeerde strings worden geabstraheerd tot een bundel-item zodat NSBundle de juiste taal tijdens runtime kan laden. iOS gebruikt een snarenbestand om vertalingen van alle tekenreeksliteralen in uw toepassing op te slaan. Nadat u dit stringsbestand hebt gemaakt, kunt u het lokaliseren met behulp van dezelfde methode die in de vorige sectie is besproken.
Laten we onze viewDidLoad-methode wijzigen om een knop weer te geven en een bericht uit te voeren wanneer de gebruiker erop tikt.
- (void) viewDidLoad [super viewDidLoad]; UIButton * aButton = [UIButton-knopWithType: UIButtonTypeRoundedRect]; [aButton setTitle: @ "Say Hello" forState: UIControlStateNormal]; aButton.frame = CGRectMake (100.0, 200.0, 120.0, 40.0); [[zelfweergave] addSubview: aButton]; [aButton addTarget: self action: @selector (sayHello :) forControlEvents: UIControlEventTouchUpInside]; - (void) sayHello: (id) afzender NSLog (@ "Hello, World!");
Deze methoden hebben twee tekenreeksliteralen die we naar een tekenreeksbestand moeten verplaatsen. Zij zijn @"Zeg hallo" en @"Hallo Wereld!".
Als u het stringsbestand wilt maken, maakt u een nieuw bestand en kiest u Bron> Stringsbestand. Gebruik Localizable.strings voor de bestandsnaam, het standaard stringbestand waarnaar iOS zoekt.
De inhoud van het stringsbestand is een eenvoudige lijst met sleutel- of waardeparen, die als volgt zijn geformatteerd.
"Knoptitel" = "Zeg hallo"; "Begroeting" = "Hallo, wereld!";
De linkerkant is de sleutel die u gebruikt om te verwijzen naar de vertaalde tekenreeks in uw toepassingscode. De sleutels zijn willekeurige reeksen, maar ontwikkelaars gebruiken meestal een semantische naam die beschrijft hoe de reeks wordt gebruikt, of de doelterm in hun moedertaal. In ons stringsbestand hebben we voor het eerste gekozen. De waarden voor elke toets volgen een gelijkteken. Zorg ervoor dat u aan het einde van elke regel een puntkomma plaatst of dat er vreselijke dingen gebeuren wanneer u uw toepassing probeert uit te voeren.
Net als bij media-items hebt u toegang tot de inhoud van Localizable.strings via NSBundle. De localizedStringForKey: value: tabel: methode retourneert de waarde van een sleutel uit een bepaald stringsbestand. Met het waardeargument kunt u een standaardretourwaarde opgeven als de sleutel niet wordt gevonden en bepaalt het tabelargument welk stringsbestand moet worden gebruikt. Wanneer u nul voor tabel opgeeft, is dit de standaardwaarde Localizable.strings bestand wordt gebruikt.
Omdat het benaderen van vertaalde strings een veel voorkomende taak is, biedt het Foundation Framework ook een handige functie NSLocalizedString () macro die u kunt gebruiken als een eenvoudige snelkoppeling voor localizedStringForKey: value: tabel:. Het geeft een lege tekenreeks door voor het waardeargument en nul voor het tabelargument. Voor de meeste toepassingen, NSLocalizedString () is alles wat je echt nodig hebt om gelokaliseerde tekst te openen.
Dus laten we de titelconfiguratie van onze knoppen veranderen om te gebruiken NSLocalizedString ():
[aButton setTitle: NSLocalizedString (@ "Button Title", nil) forState: UIControlStateNormal]; Als je het project compileert, moet de knop nog steeds "Zeg hallo" zijn, maar nu is deze geladen van Localizable.strings. Laten we hetzelfde doen voor de sayHello-methode: - (void) sayHello: (id) afzender NSLog (@ "% @", NSLocalizedString (@ "Greeting", nihil));
Nu onze strings dynamisch geladen zijn in plaats van hardcoded, is het triviaal om ze te lokaliseren. We gebruiken precies hetzelfde proces als met afbeeldingen. Selecteer in de projectnavigator het bestand Localizable.strings en klik vervolgens op Gelokaliseerd maken in het deelvenster Hulpprogramma's. Selecteer Engels in het resulterende dialoogvenster om deze versie van het bestand te gebruiken voor Engelssprekende gebruikers.
Als u een Spaanse versie wilt toevoegen, selecteert u Localizable.strings opnieuw en schakelt u het selectievakje naast Spaans in het gedeelte Localizations in.
Net als syncfusion-icon.png, je zou in staat moeten zijn om de Localizable.strings bestand in de Project Navigator.
Voeg ten slotte enkele vertalingen toe aan de Spaanse versie van het bestand.
"Button Title" = "Dice Hola"; "Begroeting" = "Hola, Mundo!";
Je kunt het testen op dezelfde manier als waarop we foto's hebben getest. Navigeren naar Inhoud en instellingen opnieuw instellen Sluit in de simulator de simulator en voer een schone build uit van Xcode. Nadat je de taal hebt gewijzigd in Español, moet je op 'Dice Hola' klikken in plaats van 'Say Hello'. Als je hierop klikt, wordt 'Hola, Mundo!' Weergegeven.
Dat is alles wat er is om strings in een iOS-applicatie te lokaliseren. Nogmaals, al uw vertaalde tekst in een enkel bestand dat volledig is geabstraheerd van uw applicatiecode, maakt het gemakkelijk om uw lokaliseringsinspanningen uit te besteden. Dit is een heel goede zaak, omdat de meeste ontwikkelaars niet vloeiend alle talen spreken waarin ze hun app willen vertalen.
Er is nog een belangrijk detail dat nog niet is aangepakt: het lokaliseren van de app-naam. Als je het startscherm in de iOS Simulator bekijkt, zul je merken dat de titel onder je app-pictogram niet in het Spaans is vertaald. Als je de moeite hebt genomen om de tekenreeks in je app te lokaliseren, kun je net zo goed de tijd nemen om ook een beetje metadata te vertalen.
De weergavenaam van een app wordt gedefinieerd in de Info.plist onder de sleutel CFBundleDisplayName. In plaats van je te dwingen waarden in het hoofd te vertalen Internationalisering-Info.plist bestand, iOS geeft u een speciaal string-bestand voor het overschrijven van bepaalde configuratie-opties met gelokaliseerde waarden. In de Ondersteunende bestanden groep van de Project Navigator, open de InfoPlist.strings het dossier. Dit is net als het Localizable.strings bestand dat we in de vorige sectie hebben gemaakt, behalve dat het alleen waarden moet opgeven voor Info.plist sleutels. Voeg het volgende toe aan uw InfoPlist.strings het dossier.
"CFBundleDisplayName" = "Hola, Mundo!";
Als u de simulator opnieuw instelt en een schone build uitvoert, ziet u een Spaanse titel onder uw toepassingspictogram.
In dit hoofdstuk hebben we geleerd hoe media-items, tekst en metadata kunnen worden gelokaliseerd met behulp van NSBundle. Door de middelen die moeten worden gelokaliseerd, te abstraheren in geïsoleerde bestanden en indirect te verwijzen via methoden zoals pathForResource: OfType:, het is mogelijk om uw toepassing in een andere taal te vertalen zonder een enkele regel toepassingscode aan te raken. Dit is een zeer krachtige functie van iOS, vooral gezien de internationale prevalentie van iPhone- en iPad-apparaten.
Het laatste hoofdstuk van iOS geeft bondig een korte blik op de ingebouwde audio-ondersteuning voor iOS-applicaties. Zoals we in eerdere hoofdstukken hebben besproken, gebruiken audiobestanden dezelfde bundelstructuur als afbeeldingen en tekenreeksen. In plaats van te focussen op hoe toegang te krijgen tot die bronnen, bespreken we echter de tools op een hoger niveau voor het regelen van het afspelen van audio.
Deze les vertegenwoordigt een hoofdstuk van iOS bondig, een gratis eBoek van het team van Syncfusion.