iOS Succinctly - Localizare

Până acum, toate proiectele noastre de exemplu au presupus că aplicațiile noastre au fost destinate vorbitorilor de limbă engleză, dar multe aplicații pot beneficia de faptul că sunt disponibile pentru publicul non-vorbitor de limbă engleză. App Store se ocupă de prezentarea aplicației noastre către publicul potrivit, dar este treaba noastră ca dezvoltatori să o configuram astfel încât resursele corespunzătoare să fie afișate utilizatorilor din diferite regiuni. Acest proces se numește localizare.

Din fericire, iOS face surprinzător de ușor să localizați resursele folosind pachete. Clasa NSBundle selectează automat elementul corespunzător luând în considerare limba preferată a utilizatorului. De exemplu, dacă ați furnizat versiuni diferite ale aceleiași imagini pentru vorbitorii de limbă engleză față de vorbitorii spanioli, metoda pathForResource: ofType: discutată în capitolul precedent returnează diferite căi de fișiere în funcție de setările utilizatorului. Acesta este unul dintre motivele principale pentru care nu trebuie să accesați direct resursele de pachete folosind căi hardcodate.

Cele trei aspecte ale unei aplicații care trebuie în mod obișnuit să fie localizate sunt imagini, audio sau videoclipuri care conțin o anumită limbă, șiruri de caractere hardcodate și storyboard-uri. În acest capitol, vom analiza pe scurt localizarea resurselor media și a corzilor hardcodate folosind capabilitățile de internaționalizare încorporate de NSBundle. Fișierele de pe panoul de bord pot fi localizate utilizând același proces.


Crearea aplicației de exemplu

Exemplul acestui capitol este o aplicație simplă care afișează diferite imagini sau șiruri pe baza limbajului preferat al utilizatorului. Creați o nouă aplicație de vizualizare unică și denumiți-o "Internaționalizare". Ca întotdeauna, Folosiți panourile de știri, și Utilizați numărarea automată a referințelor ar trebui selectat.


Activarea localizării

Primul pas pentru a face o aplicație multilingvă este să adăugați limbile acceptate la proiect. În navigatorul de proiect, selectați pictograma proiectului.


Figura 96: Selectarea proiectului în Project Navigator

Apoi, selectați proiectul de internaționalizare din coloana din stânga (pentru a nu fi confundat cu ținta de internaționalizare). Asigurați-vă că fila Info este selectată; ar trebui să vedeți următoarea fereastră:


Figura 97: Fereastra Info proiect

Pentru a adăuga suport pentru o altă limbă, selectați semnul plus de sub localizări secțiune. Puteți alege orice limbă doriți, dar această carte va folosi limba spaniolă. Selectarea unei limbi va deschide o fereastră de dialog care ar trebui să fie localizată. Ștergeți selecția MainStoryboard.storyboard, dar pleacă InfoPlist.strings selectat.


Figura 98: Adăugarea unei localizări spaniole

Acum este posibil să adăugați o versiune spaniolă a fiecărei resurse în pachetul de aplicații.


Localizarea imaginilor

Apoi, vom analiza localizarea mijloacelor media. În pachetul de resurse pentru această carte, veți găsi un fișier numit syncfusion-icon-en.png. Adăugați acest fișier în pachetul de aplicații tragându-l în Project Navigator și redenumit ca syncfusion-icon.png. Apoi, afișați-l în vizualizare prin schimbarea viewDidLoad metoda în ViewController.m la următoarele:

 - (vid) viewDidLoad [super viewDidLoad]; // Găsiți imaginea. NSString * imagePath = [[NSBundle mainBundle] pathForResource: @ "syncfusion-icon" dinType: @ "png"]; NSLog (@ "% @", imaginePath); // Încărcați imaginea. UIImage * imageData = [[UIImage alocare] initWithContentsOfFile: imagePath]; dacă (imageData! = nil) // Afișați imaginea. UIImageView * imageView = [[UIImageView aloca] initWithImage: imageData]; CGRect screenBounds = [[UIScreen mainScreen] limite]; imageView.contentMode = UIViewContentModeCenter; Cadrul CGRect = imageView.frame; frame.size.width = screenBounds.size.width; frame.size.height = screenBounds.size.height; imageView.frame = cadru; [[vizualizare de sine] addSubview: imageView];  altceva NSLog (@ "Nu s-a putut încărca fișierul"); 

Când compilați proiectul, ar trebui să vedeți o mică pictogramă afișată în mijlocul ecranului:


Figura 99: Adăugarea programată a unei imagini în vizualizare

Ar trebui să vedeți și calea Internationalization.app/syncfusion-icon.png în panoul de ieșire. Nimic nou aici, doar o imagine la nivelul superior al pachetului de aplicații, dar acest lucru se va schimba odată ce vom localiza fișierul imagine.

Pentru aceasta, selectați imaginea din Project Navigator, deschideți panoul Utilities și faceți clic pe Faceți localizat sub Localizare secțiune.


Figura 100: Crearea unui fișier localizat

Următorul dialog vă solicită să alegeți o limbă. Selectați Engleză și faceți clic pe Localiza.


Figura 101: Configurarea localizării

Acest lucru spune iOS că această versiune de syncfusion-icon.png este pentru vorbitorii de limbă engleză. Vom adăuga o versiune spaniolă într-un moment, dar mai întâi să ne uităm la ce se întâmplă în spatele scenei. Pentru a vedea localizările în acțiune, va trebui să resetați Simulatorul iOS și să faceți o construcție curată. Pentru a reseta simulatorul, navigați la Simulator iOS> Resetați conținutul și setările în bara de meniu și selectați Resetați în dialogul rezultat.


Figura 102: Resetarea simulatorului iOS

Renunțați la simulator și reveniți la proiectul de internaționalizare din Xcode. Pentru a face o construcție curată, navigați la Product> Clean din bara de meniu și compilați proiectul din nou, așa cum ați procedat în mod normal. Ar trebui să vedeți o cale de fișier diferită în panoul de ieșire:

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

Noul en.lproj / este o modalitate internă de organizare a fișierelor specifice limbii în iOS. Toate resursele localizate în limba engleză vor apărea în acest subdirector și toate versiunile spaniole vor apărea în es.lproj / subdirector. Dar, din nou, nu trebuie să știm de fapt unde se află dosarul; lui NSBundle pathForResource: ofType: metoda o descrie automat.

Deci, versiunea noastră engleză a imaginii este înființată. Apoi, trebuie să configurați versiunea în limba spaniolă. Selectați versiunea în limba engleză a fișierului în Project Navigator și bifați caseta de selectare de lângă spaniolă în secțiunea Localizare din panoul Utilities.


Figura 103: Adăugarea unei versiuni spaniole a fișierului

Aceasta copiază versiunea existentă în limba engleză a syncfusion-icon.png în es.lproj / subdirector. Înapoi în Project Navigator, ar trebui să puteți vedea acest lucru prin extinderea syncfusion-icon.png fişier.


Figura 104: Ambele versiuni ale fișierului imagine din Navigatorul de proiect

Desigur, trebuie să înlocuim versiunea spaniolă cu un dosar complet diferit. Cea mai ușoară modalitate de a face acest lucru este selectarea syncfusion-icon.png (Spaniolă) și făcând clic pe pictograma săgeată de lângă Calea completă șir în Utilități panou.


Figura 105: Panoul Utilities pentru fișierul imagine din Spania

Aceasta afișează conținutul es.lproj / din Finder, ceea ce ne oferă posibilitatea de a înlocui manual fișierul. Ștergeți cele existente syncfusion-icon.png fișier și copiați syncfusion-icon-es.png fișier din pachetul de resurse în es.lproj /. Asigurați-vă că ați redenumit-o ca syncfusion-icon.png. Este important ca versiunile localizate ale aceluiași fișier să aibă nume de fișier identice, astfel încât NSBundle să le poată găsi. După înlocuirea fișierului, ar trebui să vedeți imagini diferite când selectați cele două localizări în Xcode.

Ar trebui să fie localizarea fișierului nostru imagine. Pentru a le testa, puteți schimba limba dispozitivului la fel cum o veți schimba într-un dispozitiv real - prin intermediul aplicației Setări. Faceți clic pe butonul de acasă al dispozitivului din simulator, faceți clic și trageți ecranul spre dreapta și lansați aplicația Setări. În General> International> Language, puteți selecta limba dispozitivului.


Figura 106: Schimbarea limbii dispozitivului în Simulatorul iOS

Alegeți limba Español și deschideți din nou cererea. Ar trebui să vedeți versiunea spaniolă a syncfusion-icon.png. Este posibil să trebuiască să închideți simulatorul și să compilați din nou programul. Rețineți că calea de fișiere este afișată prin NSLog () acum citește:

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

Figura 107: Afișarea versiunii localizate a fișierului imagine

După cum puteți vedea, este extrem de ușor să localizați fișierele utilizând funcționalitatea încorporată a NSBundle. Ideea este să folosiți NSBundle ca o abstractizare între codul dvs. de aplicare și activele pe care se bazează. Acest lucru izolează procesul de localizare de la procesul de dezvoltare, ceea ce face foarte ușor să externalizeze traducerile.

Localizarea fișierelor video și audio utilizează același proces exact discutat. Cu toate acestea, pregătirea textului pentru un public internațional necesită puțin mai multă muncă.


Localizarea textului

Atunci când aveți de-a face cu o aplicație multilingvă, fișierele hardcoded trebuie să fie abstracte într-un pachet de active astfel încât NSBundle să poată încărca limba corectă la timpul de execuție. iOS folosește ceea ce se numește fișier de șiruri pentru a stoca traducerile tuturor literalurilor de șir din aplicația dvs. După crearea acestui fișier de șiruri, îl puteți localiza utilizând aceeași metodă discutată în secțiunea anterioară.

Să modificăm metoda noastră viewDidLoad pentru a afișa un buton și a scoate un mesaj atunci când utilizatorul o atinge.

 - (vid) viewDidLoad [super viewDidLoad]; UIButton * aButton = [butonul UIButtonWithType: UIButtonTypeRoundedRect]; [aButton setTitle: @ "Spuneți Salut" pentruState: UIControlStateNormal]; aButton.frame = CGRectMake (100,0, 200,0, 120,0, 40,0); [[vizualizare de sine] addSubview: aButton]; [aButton addTarget: acțiune auto: @selector (sayHello :) forControlEvents: UIControlEventTouchUpInside];  - (void) sayHello: (id) expeditor NSLog (@ "Bună ziua, lumea!"); 

Aceste metode au două literali de șir, pe care trebuie să le mutăm într-un fișier de șiruri de caractere. Sunt @"Spune buna" și @"Salut Lume!".

Pentru a crea fișierul cu șiruri, creați un fișier nou și alegeți Resurse> Fișier de șir. Utilizare Localizable.strings pentru numele fișierului, care este fișierul de șir implicit pe care îl caută iOS.


Figura 108: Crearea unui fișier de șiruri

Conținutul fișierului cu șiruri de caractere este o listă simplă de perechi cheie sau valoare, formatată după cum urmează.

 "Butonul Titlu" = "Spuneți Buna"; "Salut" = "Bună ziua, lumea!";

Partea din stânga este cheia pe care o veți utiliza pentru a face referire la șirul tradus în codul aplicației. Cheile sunt șiruri arbitrare, însă dezvoltatorii folosesc de obicei fie un nume semantic care descrie modul în care va fi folosit șirul, fie expresia țintă în limba lor maternă. În fișierul cu șiruri de caractere, am optat pentru primul. Valorile pentru fiecare cheie urmează un semn egal. Asigurați-vă că includeți un punct și virgulă la sfârșitul fiecărei linii sau că se vor întâmpla lucruri teribile atunci când încercați să rulați cererea.

Ca și în cazul materialelor media, puteți accesa conținutul Localizable.strings prin intermediul NSBundle. localizedStringForKey: Valoarea: tabel: metoda returnează valoarea unei chei dintr-un anumit fișier de șiruri de caractere. Argumentul valorii vă permite să specificați o valoare de returnare implicită dacă cheia nu este găsită și argumentul tabelului determină ce fișier de șiruri să îl folosească. Când specificați zero pentru tabel, setarea implicită Localizable.strings fișierul este utilizat.

Deoarece accesarea șirurilor traduse este o astfel de sarcină comună, Fundația cadru oferă, de asemenea, un convenabil NSLocalizedString () macro pe care îl puteți utiliza ca o scurtătură simplă pentru localizedStringForKey: Valoarea: tabel:. Acesta trece un șir gol pentru argumentul valorii și nul pentru argumentul tabelului. Pentru majoritatea aplicațiilor, NSLocalizedString () este tot ceea ce aveți nevoie pentru a accesa textul localizat.

Deci, haideți să modificăm configurația titlului butonului pe care să o folosim NSLocalizedString ():

 [aButton setTitle: NSLocalizedString (@ Titlul butonului, nil) pentruState: UIControlStateNormal]; Dacă compilați proiectul, butonul trebuie să citească încă "Spuneți-i Bună" - dar acum este încărcat de la Localizable.strings. Să procedăm la fel pentru metoda sayHello: - (void) sayHello: (id) expeditor NSLog (@ "% @", NSLocalizedString (@ "Salut", nul)); 

Acum că șirurile noastre sunt încărcate dinamic în loc să fie codificate, este banal să le localizăm. Vom folosi exact același proces ca și în cazul imaginilor. În Navigatorul de proiecte, selectați fișierul Localizable.strings, apoi faceți clic pe Make localized în panoul Utilities. Selectați limba engleză în caseta de dialog rezultată pentru a utiliza această versiune a fișierului pentru utilizatorii vorbitoare de limba engleză.

Pentru a adăuga o versiune în limba spaniolă, selectați din nou Localizabil.să reiau și bifați caseta de selectare de lângă Spaniolă în secțiunea Localizări.


Figura 109: Adăugarea unei versiuni spaniole de Localizable.strings

Ca și cum syncfusion-icon.png, ar trebui să puteți extinde Localizable.strings fișier în Navigatorul de proiect.


Figura 110: Extinderea fișierului cu șiruri de caractere pentru a vizualiza localizările acestuia

În cele din urmă, adăugați câteva traduceri la versiunea spaniolă a fișierului.

 "Buton Titlu" = "Dice Hola"; "Salut" = "Hola, Mundo!";

Puteți să îl testați în același mod în care am testat imaginile. Navigheaza catre Resetați conținutul și setările în simulator, închideți simulatorul și faceți o construcție curată din Xcode. După schimbarea limbii în limba spaniolă, butonul dvs. ar trebui să citească "Dice Hola" în loc de "Spuneți-i Bună", și făcând clic pe acesta trebuie să scrie "Hola, Mundo!"


Figura 111: Schimbarea limbii dispozitivului în limba spaniolă

Asta e tot ce este pentru a localiza șiruri de caractere într-o aplicație iOS. Din nou, dacă aveți toate textele traduse într-un singur fișier extras din codul dvs. de aplicare, este ușor să externalizați eforturile de localizare. Acesta este un lucru foarte bun, deoarece majoritatea dezvoltatorilor nu vorbesc fluent toate limbile pe care ar dori să le traducă aplicația în.


Localizarea Info.plist

Există un detaliu important care încă nu a fost abordat - localizarea numelui aplicației. Dacă vă uitați la ecranul de pornire în Simulatorul iOS, veți observa că titlul de sub pictograma aplicației dvs. nu a fost tradus în limba spaniolă. Dacă ați trecut deja prin necazul de a localiza șirul din interiorul aplicației dvs., este posibil să aveți și timp pentru a traduce și un pic de metadate.

Numele afișat al unei aplicații este definit în Info.plist sub cheia CFBundleDisplayName. În loc să vă forțați să traduceți valori în principal Internaționalizarea-Info.plist fișierul iOS vă oferă un fișier de șir dedicat pentru suprascrierea anumitor opțiuni de configurare cu valori localizate. În Susținerea fișierelor grupul de Navigator de proiect, deschideți InfoPlist.strings fişier. Acesta este la fel ca Localizable.strings fișierul pe care l-am creat în secțiunea anterioară, cu excepția faptului că ar trebui să furnizeze valori numai pentru Info.plist chei. Adăugați următoarele la dvs. InfoPlist.strings fişier.

 "CFBundleDisplayName" = "Hola, Mundo!";

Acum, dacă resetați simulatorul și faceți o construcție curată, ar trebui să vedeți un titlu spaniol sub pictograma aplicației.


Figura 112: Localizarea numelui afișat al aplicației

rezumat

În acest capitol, am învățat cum să localizăm mijloacele media, textul și metadatele utilizând NSBundle. Prin abstractizarea resurselor care trebuie să fie localizate în fișiere izolate și prin referirea lor indirectă prin metode cum ar fi pathForResource: ofType:, este posibil să traduceți aplicația într-o altă limbă fără să atingeți o singură linie de cod de aplicație. Aceasta este o caracteristică foarte puternică a iOS, în special având în vedere prevalența internațională a dispozitivelor iPhone și iPad.

Ultimul capitol al iOS Succinct are o scurtă privire asupra suportului audio încorporat pentru aplicațiile iOS. Așa cum am atins în capitolele anterioare, fișierele audio folosesc aceeași structură de pachete ca fișierele de imagini și șiruri de caractere. Cu toate acestea, în loc să ne concentrăm asupra modului de accesare a acestor resurse, vom discuta instrumentele de nivel superior pentru controlul redării audio.

Această lecție reprezintă un capitol din iOS Succinct, o carte electronică gratuită de la echipa de la Syncfusion.

Cod