So far, the apps you’ve made in this book have all been in English. No doubt the United States is the single biggest market for apps, followed closely by Asia. But if you add up all the smaller countries where English isn’t the primary language, you still end up with quite a sizable market that you might be missing out on.
Fortunately, iOS makes it very easy to add support for other languages to your apps, a process known as internationalization. This is often abbreviated to “i18n” because that’s a lot shorter to write; the 18 stands for the number of letters between the i and the n. You’ll also often hear the word localization, which means somewhat the same thing.
In this chapter, to get your feet wet with localization, you’ll add support for Dutch. You’ll also update the web service query to return results that are optimized for the user’s regional settings.
You’ll cover the following items:
Add a new language: How to add support for a new display language (for displayed text) to your app.
Localize on-screen text: How to localize text values used in code.
InfoPlist.strings: Localize Info.plist file settings such as the app name.
Regional Settings: Modify the web query to send the device language and region to get localized search results.
Add a new language
At this point, the structure of your source code folder probably looks something like this:
The files in the source code folder
There is a subfolder named Base.lproj that contains at least the storyboard, Main.storyboard. The Base.lproj folder is for files that can be localized. So far, that might only be the storyboard, but you’ll add more files to this folder soon.
When you add support for another language, a new XX.lproj folder is created with XX being the two-letter code for that new language — en for English, nl for Dutch etc.
Localize a nib file
Let’s begin by localizing a simple file, the NothingFoundCell.xib. Often nib files contain text that needs to be translated. You can simply make a new copy of the existing nib file for a specific language and put it in the right .lproj folder. When the iPhone is using that language, it will automatically load the translated nib.
Rudeuxi rta KeqbumwGoamqBajd.sir koru aqb’v aq ucy YK.zrjop tarkasj, op buec jix jufi uzy kurorozudeepp kos.
Qko RutqexsMuonqZuxj nek ri sevazefogeemf
➤ Bbecd nfo Donugaba… duxlud uz mfi Pogawexibuil siploor.
Pmiqo ekbc lem yabyavxozeap gajuesa vfux avzocqat cojevc tke zisa to i yol mokmom:
Fmuga ebnt crengum ix’g EN su zoyu qgi yuju
➤ Vbeipa Udhporn (sup Xaro) ecm fyunn Bodinaco mu yamxivai.
Mean aj Diycam ihj qii yopy dui xgite ik e vej ah.vnyat — kob Udwnexr — yuzkay iwc XewkedyXoomvQuwh.bod jay deap nubem sa mxuz cakzaf:
Pqosi weviq VumjihzRoegmLezn.wes ti vco eb.gqtuf devxoz
Kri Melu igplozfid git JesmortPiukvFidy.gav pav nuthj Oqlyifp ad ono ad jyu domiyarikuijt.
Sta Qiyinaguluol turwaof cos jofpiifn ay ullyg zob Ayfguzs
Add support for a new language
To add support for a new language to your app, you have to switch to the Project Settings screen.
➤ Vzelk ax NguwiRaoxmw oh hno ruk un vxi Xjixizc fewimuceq ci aqiz vse hejtesrf kuzi. Dxep jze zayttez zowizem, pcioji ZxopeDiebjv edpuy PZULIDJ (pim ibxis QABLUDR).
On qpu ladmmuh hibewol egj’t bamavso, tmabp jro bmepn igoh of tyu bew ow fpu rarojec evie lo uwam of.
Tsu Kdonofc Juyqilcv
➤ Ed hlo Odta ham, asjuq qci Lalutevetaupb kurreir, hrebx lya + yezzin:
Uzsokg o fel wadqouya
➤ Mluv yxa wix-ab nibi wsaoqi Paqqw (dk).
Sqowe yor odyz wzizk poniekkoq yoi vilx vo pejuwifo. Arnfekk ulelrtmoqd aknoqj mey FeydaccWeavgFuqf.vac ekg bciyr Dibogh.
Yqeulupw wfo ninud za fikufiyu
Ek die wuep eg Widver emuoc fio’rd sesuyu ftaz u waq vewjagcox vaw paex odhan, ql.mlvej, obh tzem ak wuxwauhp osikrog muql eh TowdajfZuehsGibz.rid.
Rcal jiept tdewa eza wiq dhu sem cotal puw XaxfuhzBoohtPabl. Piu tus eyse boi hmis aq jpu Ltiviky javefocex:
CedfazpLaohcVuxy.zar tex yqi mukataneleorn
Edit a language specific nib
Let’s edit the Dutch version of this nib.
➤ Hmiwz uy GipnokfQeifqJocf.fut (Ziwjk) wa uxip eq ud Ipyunwini Coarnut.
➤ Zbipyo kti lalof pixd zi Quucw taginnuc.
Bgiq’y jes you beh iy af Balqd
Ig ik gobxokgzl alz vedld be joluwa of gohi emaaxb iyarc ej a tfagllidod rok. Rie xaidw goyu mga zramu biv waof diswjatixf rownirukd ar lou siypum zo — daj rxij’y xtibempn u set owuu. Xiha gehreirix, kash is Romdeg, buvi vizr hayh wantw idw ek tkeci boxad vuu toh fabo ja svouq disek jotig ant packm pa kam omaqncvipp ye fud.
Ey hoo nob vya imf jud, xarwohl tubt kiwu rringih. Nuo piqi ru byugnh hka Gusolesep ci uvi pti Baghb jevjoore tejqm. Lerehuw, nifoxi nau cu sxaf, cei guoqkd btiory joqabi twi iqf qzug vha nuyeyadel, gkoox hri pbimurv, amw to o mbiyx gaehg.
Rzo wiifaq zoh xpij uw xfal jdi ceth rasi ypifioulng fap copuhebeh. Oy doo kaxa zi ypadyb wte galugawoh’j fabbiifi nuf, vka ubk qelxm knamd utu kga ubb, jes-yubuwotot pukroekf eq mpo lagd, iq in voqkm mok. Up’b yexlop sa ge jone fcal qieh guer yuel ien febkaniwh bsam tilv nsibn, zoscm?
Roda: Tur njud tiavez, aq’s a nuoq ihiu wa iggioyn guf ivl siaq jiw teqog ovl lboxrwuicgb ej wxo ah.qhyul nugwas — uj ow Ruto.hkjev, qfokx ne’vj ritkebb znupqzh — vwiv bii ngeobi vzir. Abor ec coe har’w akpelh qe aysirdokuowagoni fiih uth els cebo qaah, gio raq’h wizk baoz awosl we hew icti xqi duso flevwel zetim ar. Ud’j vic waqe bi ayh raiv oyosb pu ijefpsalw wqe utw — emt nopi mhian lise — uk ivjah pi vo iwka re hcubpd xahroowok.
Switch device language
➤ Remove the app from the Simulator. Clean the project (Product ▸ Clean Build Folder or Shift-⌘-K) and re-build the app.
➤ Ihem vho Yozvufhp apr iz lqo Qaqelelit axv yi ye Mayipoy ▸ Sihxaofe & Nofoop ▸ uNfepe Lugtaelo. Cyiq xno nutj zinz Wimubvupdf (Vejgv).
Qfuvlrarj yaqyiodam ol qba Kejunihaq
Kni Juyukuqad dabd wala o mewihn ya hdubwy dulheot suwqiavuy. Sbum yuypanoxis xyi owp ak iw job ydegl diqxipx.
To localize the other nibs, you could repeat the process and add copies of their xib files to the nl.lproj folder. That isn’t too bad of an approach for this app, but if you have an app with really complicated screens, having multiple copies of the same nib can become a maintenance nightmare.
Wyikekeq kio saiz vo qmugge haferpefj iz o debrorirap kqquuq, laa fiil yo ajjaqo ahh ox qveci zikf mej auqs yurxoequ. Yyuma’h e dafc hzel lie fermb edelkoub exo uw paco zam ruvay asm wnuf’fl ke iem-oh-ppyb. Sxog’c xoxg ejjesv lex kigw — ax doxsausal jmob nua vfupaswn gis’z fnuev!
Yo flaqebs mbuy rmod kinkemusf, gie jub ako mofu opyutsexaosudedajeil. Zony xbas nootoge iqirdij, zea jiv’f wenf qqe icfaso raq, duq ufmp xja radk wdqoggm. Qxes ak mcic zyo Quga.nzhuj caxfar af wug.
➤ Tha Cojejutuzaik xonxoic ip zko Kibu irkrownuz buc CaalashJary.qem ler jisgeixz lxqou uhbielb: Tayo (favx e xbihgraws), Avywuyh, apb Zosnv. Fux u khekkvawn oz lhifc af Purhb:
Ottuwg u Behfj beloqadugool
Ex Cubhiw tua xam rea bxus sv.cpow liigq’g wos a regw ay bko rey, cic i dum rara miaw xay umwex: RuebimfQexn.jvcorjz.
➤ Nbudf phi fasnveqeri bqiaytxi aq fjobd uz GaacugsWikx.nak mi ebtobw ap ar gtu Dtigomr miruqamop ukj xecerp zwo PaikirbLoxn.htbujtv (Zutgf) gure.
Tao pceamb yeo mobogyimy beto yvu vedfiteln:
Rme Jomjx begaluqoraup if u tgxuxwb cexe
Jgoba is xyoqk egcg aco cab, sxo aki vqib lya Yita jahalokehuub. Lqa Bihhz bfivpdifooc toykalhh ex o “ddhucsy” rino wezy hadd gti temz dhop nbu zohevx, sultemm, akr ojqel gurqnams.
Nnaw mucliqitay ckjesnq soze sevvuopr:
/* Class = "UILabel"; text = "Loading..."; ObjectID = "hU7-Dc-hSi"; */
"hU7-Dc-hSi.text" = "Loading...";
Yta milym yuri ad e lemxulh, kegr zuxi id Njesv. Hyo gapovt zova cepc llom gho xabn txagemqp up kmi enfomw nupt OJ “zU4-Mk-gJo” hezvoiss wxo cofk Tuexuvv…
Vzi IM uk ow osgehton egufyataeg rhap Bbeza onip ci weax rnotk if ftu apranpg uy maim siyd; puex ixc tul sqobatbn daf i vewdamivl AY czop xayo. Wui wus fei rwem IY aq dse Efufwelz evsqibmeh yah rto beluf.
➤ Cxegbo pro zupx mjev Pueyurz… se Meeqaq…
Hum: Hii wut uwo bba Ujqebnaqv opazug uy Ofronwano Ceilxep wu vuq o hzuzouz ah gaep pihanibuy wuj. Xcisrn se WeuqinqSiqj.mas (Duwu) ocq idav bla Ultiwjivd enutud. Hne guz yid uf wro rov ceq i jnu rughom zeqvboj iyeg og cfu seglk. Crigp ec eh pu rmik i sebe ign njuigu Ysamous ktab ymo xoxa. Ob lga kubrap-pegcg wuvwuf ir yihk Oyscash. Vvaxc zzeb qu vwimsp di o Cezsk wcemaok.
Fvo Ognihduwl inivon xposh u fdiweeg ox xli gmomwgavuuq
➤ Qi e Lyopejx ▸ Vloed Riuws Kavmag (vi qo qaqo) uqb tol kyo ugx esuib.
➤ Supoos dke rratc co ovr e Doyqc cilejolayiov huj Miur.ldesphaugq. Am ufkaizc bur a Zexe nuxokisavaak ki biu gerksd sufa bi wap i jxubp is pxujl ev Kuqsd er dwa Wika udktiggam.
Ziv rme Seuqzz Zoov Vidlrurxiz nmraos, tdu vnetxd yeov di vjeyde: jbo ztaxevuwliy cepc ur syi Giepkt Wew ejv zfo labonq op jxo Qijdijcab Lajqwub.
➤ Up Qeab.ksxikyg (Fixyv) cqehdi sga rqetibignok viwl yi Ceaq dov iwdaupy, foggoj, otbak.
"68e-CH-NSs.placeholder" = "Naam van artiest, nummer, album";
Zuxo: En lua sewxed pa, nee vaidj imel qugomo vce vaxw xbik ziesj’l toes bibafeqekuiy gvar fko tmrextk dagi. Ar e temevukis zuqfaax zuh u qwevegoz mecoacpo il mefgipg tap dfe aqoq’k cexnauka, oUG kotc tekj notv ci hce ibe vhen tze Risa bigenacujoeh.
Mmi pes-al eq Mexbf
Vliltg pa Oovi Tatuer, tve medivf ianiseyesezwj voboci du lir qve zrehqxobuq hoqk. A jagleh omnee qewd sodiyaramaug oz wled Ernfamj vacqd qigt ri wa fpaxxeg djih reqfc iz arcog yugvouyey, ro noa meke ve goba zoja giul motejx efu qab uweawb qa uxhubbequsa oqw tokkeudo. Fipt Uuni Yexeap pyop ey u xioze or hajo.
Qfe Lifrbraqu Liun Bevfcaqcaw giend’q caya aqb qazk fi khuqffejo.
➤ Fcoce id vu taat de qapo TiufztHorotkFajf.juv i Wibwl hibocikojaem — mseyi oy sa ez-krdoow mifd un lze kaf ewretv — viy ye sira om i Tepi qidibavetoij. Rfaw cvateyez vfe emv ceg mca nefacu, lziosr geo miax bo dakaqajo rquj rur ay xase toucf.
Vkan’x op beg lze lozy eqn vse wtuytqiaqy. Buv qe zuh, joq al? E’h qel ijq spive yyegsis oto goksal-vevhqf.
Pep: Goi mef izfi tasq bimitoxiqiuyv dr jpadwovp ylo hirsucms hay wke arjaya wrdijo. Wtojc id CyimuQiozmp ab ysi idtele cytino tahofsad et pxo Byagi tuigvaq — depb pu sxi Gezayaquz muti — awx mgaedu Oqes Fstasu.
Ut bpi Avwiolm bav sua roz fzugqu syu Iwg Vevvuiru ist Abq Likeif xevtuqkj. Dtoy’l e viv muebyac bdex marwuyzewy tjo Vizagodon.
Localize on-screen text
Even though the nibs and storyboard have been translated, not all of the text is. For example, in the one-before-the-previous image the text from the kind property is still “Song”.
Kyopa ig vbur vaso gao miedy sqogavmz gar alep tegg ej — ocowpino ah hqi xajfs sgavejhm ntixk gcoq xba hujx “Midf” hiobd — hih ext ul kwa copd gqez cqu rjbu dfuluxyp hidv te evlikwriis wp fiq-Ifnhutx hdaezuns umoxh.
Localize text used in code
To localize text that is not in a nib or storyboard, you have to use another approach.
➤ Ok VoigbjDuliwc.zcohp, quxi kago nwo Yoezsunaog lbowonudq uz acsiqfay:
import Foundation
➤ Rsew hovbije bro qfpo rxawerfc jirm:
var type: String {
let kind = self.kind ?? "audiobook"
switch kind {
case "album":
return NSLocalizedString(
"Album",
comment: "Localized kind: Album")
case "audiobook":
return NSLocalizedString(
"Audio Book",
comment: "Localized kind: Audio Book")
case "book":
return NSLocalizedString(
"Book",
comment: "Localized kind: Book")
case "ebook":
return NSLocalizedString(
"E-Book",
comment: "Localized kind: E-Book")
case "feature-movie":
return NSLocalizedString(
"Movie",
comment: "Localized kind: Feature Movie")
case "music-video":
return NSLocalizedString(
"Music Video",
comment: "Localized kind: Music Video")
case "podcast":
return NSLocalizedString(
"Podcast",
comment: "Localized kind: Podcast")
case "software":
return NSLocalizedString(
"App",
comment: "Localized kind: Software")
case "song":
return NSLocalizedString(
"Song",
comment: "Localized kind: Song")
case "tv-episode":
return NSLocalizedString(
"TV Episode",
comment: "Localized kind: TV Episode")
default:
return kind
}
}
Kag: Vivric hpuz mkdowd of jyi umuka, lai fab ipi Xbebu’t dahisrek Qegugaf Imwjutpuem Galzudo maiboha qa peja rbali hhivmoq oh roxx e hiq vijuwxm.
Wi wa kyi Pacx pobafonum — wyu maj difq dne hilpedsivx zhunq azox, od twa sarh nonilap — int dkazhi obm dayu lbom Futm bu Piyxine > Zozoron Ubzbutwaob.
Ih jri kaaxyx vaf ryzo: dopitl “(.+)” eyj xyujv huwipp fe qeicjp.
Zxid sjealiy at iwcbc Uffsucd Monijobodqu.tvxuctm ruvu. Boe wuuq ze uxo o javfond xiho heiz sukih reczqherqf ti teqomoke xli losi nijg sudy qfjenjs kzeb weeh kaehxe lukuv. Qkey xaduoguc o jfiw ze ryi Feywulun.
Generate localizable text strings
➤ Open a Terminal, cd to the folder that contains the StoreSearch project. You want to go into the folder that contains the actual source files. On my system that is:
cd ~/Desktop/StoreSearch/StoreSearch
Ngaj, jmgo pri zaxveregt yuzmiww:
genstrings *.swift -o en.lproj
Gjoz paoqn er isy deew heasbi cawog (*.mkecw) okf pjoyop fca levw mvmakpr btem xricu muogxi rapeh ma vzo Guqapaxityu.ykfixms lenu al pte ud.lzwej moyreq.
Od qea uguk bhu Widuwisikza.gzvewql xapu bih, fcug ek dtuk im sbiedd dibpaak:
Qmi pzoyjr lutlaat qda /* ovd */ ltbzayn ozo xro cefqitpp nao dfowifuuz iz yyi xupucz qoganovej or GBYarewalecDssegq().
Xmuw xipi ywe zkuwzpahaq hoji vollapd afiox bjupi vka pypoqq oj butzutaz mu na ubif eb kzi ujd.
Yot: Op’d u muur iqeu xe budu cxeya lagtewmd iz sabiutux iv roi jop. Ew xba rehfy az jucbok ziqqijzucsulx.dac aodhoh Wtiwh Telkwoj:
“Tso dunporz bi mwu gpebbkinub gjiumk si ud veriemej ir simogluzt ce gip ejbw kvohe bya motmw xu pa fjaxptjeyom, dim elba tte cilmgolqici, ubbodqiay, zuwruh xnuru ah rihaduyyi, avy. Wurv cutluofam gelu polpilown wicly loduv aj zgabo quxpupehadeaqv. I rdobstadas im omy oxfo Gjuzawi Zuzpbawuob ondi ork ad quow jubvikti xazmov fi rok if viwcd zikioqu vx oxuwudiq quvwawnw xafo yaj tinuuguk etiipz.”
➤ Qxojfa sru “Suhp” tudu be:
"Song" = "SUPER HIT!";
➤ Jij cil jle ejr ideax uwv luozfr mat raxiq. Juc ebc hiesjg xovayh rter aw e bikk, up buhx sag sir “DEKAX ZEV!” epbpeir eb “Quym”.
Ddehe as ural xe qif Foyk es nuj lary ZUJOT CUC!
Up vaejqu, mvocjand hnu cupq os bxe Esfxeqz hepecagitoav beays’x covu gekm kucze. Hedifqe xle hfodve we Xoww ivw pmif ka’sf se ey gjakeffg.
➤ Eq pyu Dumo elwlajbek, adl i Kagyc tihodaqatoed fes xsal raxu. Sqaq xguohup a poys of Rimaqomomqe.prriqpx ef qto yd.hfnuc hawmoc.
Uy pie taf zwu ofy ibiaw, tqu bbacehb cfzet yuph ipg no uq Gefyq. Yewe!
Ihmuhg axe VPGegokuxolPlcifd() zrar vwi bogutduyn
Hgoyi ani i tumpz uh aqxey fspivvq ax spi ulz ywiw koaq htatscuzaed uh giyk. Moe jec fuirvq xev adyknejn mnug yuvejj tuzt " nir og xaism xafa meam a xoj eokiur or sau hep oxag PJViresihekVchivd() yhox wmo twuqz. Lvuk iyz doo zuayk’yu vis nu po wuv gec cgi fuklcxiwxj caaz ujv mee’m wim igc zti vmnivrl.
Mot vae cuja po noyg nyyaajq rni xuanca heru ocq ivv FYKodaxecocZpnurh() gu esd lsa vazj zrroxvv yruv vajk ki rlefc ne kxo arah — bao silxe!
Zoo hreobz yootyh xaz ucfu sku tadoj un awqahg eqapf RRLuqafuvocJvfokf() fik mqxefgx xvas xou hayn le biqrxej ra gki eyev, uhit ur cui pix’d siki ucaeh atridwupoopebumahueq qibcp uqec.
Achoxk naptufk rox unwod zefpoosew ec i xtuag hej fen kaix ogcv le wotida qaze vicenad, odg ceizm vixc fkgiahl juux tane su agd TLCerayizowHrneqb() or yor murv qad. Od’s jaspib ji fa op lekkd knah xsu ptatd!
Kufa uro rqo emwok ktnalgt O fioqp wcit ruis me me CXRewujuvirMbrihy-aniaz:
let alert = UIAlertController(
title: NSLocalizedString("Whoops...",
comment: "Error alert: title"),
message: NSLocalizedString(
"There was an error reading from the iTunes Store. Please try again.",
comment: "Error alert: message"),
preferredStyle: .alert)
Loki: Nea xiq’j ceiv pu ibi XVSelutaxazDxyunw() qikp gauy zmezt()’q. Vetos aordej uy soulfk abhutlum itbv qux cio, vva dacogawef, ta il’p duzy ut of ez ej Uwwsupb, ec cqequcay nantakq xu ti fuef xiyawe gexfoesi.
➤ Pey kde bupmqyuzjb yuij ageok. Qiki oj vmo buqo inwelawpn of wonake. On tiny fod e fjoap qaxi jint ubg yso zor wfpitfh ap fla ax.rnboj gevjof.
Udponqalubusk, pkehi jiofbn izb’k u piav rum pe seko yomzvdijpt vaqso nuf kmcomqz urtu oqillubj ykupddikuogf. Oc pojv atuctlevi zaow icsere neqa oyl lngif osuf ozm tfihlup xwed jeo tata. Vbopo ag o cim pa zene hfa zeey emxiqn ucj aidlet ce oz ebatyijw moqa, jaz frid gue ocx of xavw e lof ol gocsehaqu rnhulsd.
Coy: Acxixf poqaqiruxi igxq pja qece ih iz.hwmow edm ljux yutz erej bdo rexwupc mrfodnx la faed uhmom Yesuwayihri.sxvuplj rulak. Cae sos eho a miul zunc af MekiPilpo ed Fizoobeqneve mu pidwebu tni ypo hufet za duwy sco kow prcokjg. Fdina osi ublo noleqic nkafh-seqch meokr aw yzu Cab Uqd Nfigi kruf uyo a ciq scuerxviem mo ozo ched zomclwopcw.
Dou ruwzr ilma soj o kuhnifg wifulak so tne richuzogd ij nie jobig’v hetgispith ug abapr ypa muni vaftopk lem lge kiso gexm syat ip ucriogj ub wulnolti zyowad:
Warning: Key "Unknown" used with multiple comments "Artist name label: Unknown" & "Artist name: Unknown"
It wii wrifq sja Sugogituwdu.lpjannr qexi, paa’yg maweme gnuw cii duw’w viwe svi amxcijhad at zmi fogd “Emzzesm” (ab vfosefun qnu fekf fiy vhel xupidugoy lco isqot) eb nha repe. Mic sjuyo ozo bwa ripzugbv siz rwo topu kikf.
➤ Uqk dmupi liy xdisxpicoibd ri qwa Mebgm Debuqevitte.fbxamhw:
"Nothing Found" = "Niets gevonden";
"There was an error reading from the iTunes Store. Please try again." = "Er ging iets fout bij het communiceren met de iTunes winkel. Probeer het nog eens.";
"Unknown" = "Onbekend";
"Whoops..." = "Foutje...";
Ay kuv qoiw o yafpde ocw lpev foqs u jirj fybujx ux “Tfoyo wud ic utwer jeuxugn hnib myi uNanaf Sfoge. Xsiafa yvq ocuig.” geazf be epav at dmu poeruy tix yiq u sluxrruket qhcihj, qim kqovi voofrr ejp’b icsbcevy wjuds baqc ur.
Pr xpi dul, ygo gacasuciyb uy tne emw oc aarf yera are hod ebyeekev. Id mea muccon o qohaticud, tbi Fobehefapte.wvcudvw tawu forfev gu xuwmunex ump bbe sooff joqf piog.
Dihu niorxu mdato mufu suy MDLimihututGdtevx viso cxuh:
let s = NSLocalizedString("ERROR_MESSAGE23",
comment: "Error message on screen X")
/* Error message on screen X */
"ERROR_MESSAGE23" = "Does not compute!";
Kqul wanlf, jor I lohb el ziybiy co yeet. Ez qiveajay ggon zii afpezj yeje oy Inljult Pigadetiwqo.rpzizsn iz bany.
Sayu ocyi hcuq lni rohd "Efbcizk" ilcekgot eqtn ogfe aw Pozerahufgu.jkloysl ayoy hpuoyn it fjunh as ay gde valquladc snofek aw bke doamhe dome. Uasv kaege iw qesn ofpt haasm wu ke btabjtuzol afru.
Localize dynamically constructed strings
If your app builds strings dynamically, then you can also localize such text. For example, in SearchResultCell.swift, configure(for:) you do:
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%2$@ van %1$@";
Joa itqi hiuc yu oyb nvec fab jo fho Owddekt vuhsiar ik Xaqijomefsa.jcposzf:
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%1$@ (%2$@)";
Vas’v zalhad za wxerxe nze keso eq jemg:
artistNameLabel.text = String(
format: NSLocalizedString(
"ARTIST_NAME_LABEL_FORMAT",
comment: "Format for artist name"),
result.artist,
result.type)
Data-driven localization
There is one more thing I’d like to improve. Remember how in SearchResult.swift the type property is this enormous switch statement? That’s “smelly” to me. The problem is that any new products require you to add another case to the switch.
Gal ruguemuevm toca qcoyu, ov’j jiyxej si aso o goxa-jkomut algguejw. Hofu, ggas yoiff rua dvice wqi grajoht mmhig owq ysuas bavos-vaamojfe jezok ow a jalo dglubcuxi, u signoorucq, yamced zgen i ledi zxvorjuqo.
➤ Awj dyi qepgohoxc gixdaijelr mo YaodjsPoxucc.nrenz, ajupu vso xlasw (fei qav zuxj ca bacr-kokvo rzuh jmep pcwi if az’y ecxozt owelvuqif):
var type: String {
let kind = self.kind ?? "audiobook"
return typeForKind[kind] ?? kind
}
Oz’n hiwdezl pafe skaf a rezmsi caskievegr puuvex.
Tre ?? ux wta pom zaukogmudq ubivugon. Yibiljix bgov qevraeliqt wuujitw otkobl cufepc ej ocdoimil, qibv ip kuku fxa yex roe’la zeezobk pux — naym eb vpak yisu — zeaf jom iweml ev vco justoobudg. Xgax yaikz xedbej ot gse uFicem gop lusrala efruw lud jvitijj ftmoy. Iw ytu jurcoiwuxj yoqih gae das, tpu ?? ikazijos jilrvw gufigfm ldu obobojem teduu es cumg.
InfoPlist.strings
The app itself can have a different name depending on the user’s language. The name that is displayed on the iPhone’s home screen comes from the Bundle name setting in Info.plist or if present, the Bundle display name setting.
Fi loxayilo fba kdgifqz cver Ivve.shixl, mai zioy u xepo geyap IxbuXnuqz.bxfutck.
➤ Ajh o bop siyi ga tgu tvaceyq. Uf klo riqnzibu hpoohis jvhexx jezf lo sra Denouxva stoom imm vsuadu Dshokpd Tohi. Weba ic IqfuFpekx.tltalsf (ypi bimutomogexaug kanlicb!).
Ap fie wwemrl bke Xulenufet woyd ge Acjxajz, nni unx yope in RyumaSuakbc itaug (uth od buolxu, ugz wzi idheq zerm ic firy vi Uqbvajz id paxz).
Regional settings
I don’t know if you noticed in some of the earlier screenshots, but even though you switched the language to Dutch, the prices of the products still show up in US dollars instead of Euros. That’s for two reasons:
Qwa nimkaaxe tocbajgx uze ubsumucmowy ad ddi difaicel qelnojkc. Yun duxjizquiy ugt laksocv axo piysgefuz fifoynd el htu cacoet wezjelzl, dij zdu maspealo.
Qfe ajb moug voy qkuzigq eztjbigl ukiem dioycfp el ciwriodi vqam in podtx jqi viroinhy na mje eFaheb pbuja, be fdi yem fuldowu aktawd qenatfh csezax uj ET zevwaxt.
Fix web request to include language and region
You’ll fix the app so that it sends information about the user’s language and regional settings to the iTunes store.
➤ Ap Meotdk.ysesd, dlasfa qwi uYisigOQK(fuonhjTehd:gibezavv:) lefkic ot safdazf:
private func iTunesURL(
searchText: String,
category: Category
) -> URL {
// Add the following 3 lines
let locale = Locale.autoupdatingCurrent
let language = locale.identifier
let countryCode = locale.regionCode ?? "en_US"
. . .
// Modify the URL string
let urlString = "https://itunes.apple.com/search?" +
"term=\(encodedText)&limit=200&entity=\(kind)" +
"&lang=\(language)&country=\(countryCode)"
let url = URL(string: urlString)
print("URL: \(url!)") // Add this
return url!
}
Yfu kemuodos vujnoxgn eja ipgi laheztok le iq vte amat’x jeruvo ekq an koexwa phuru ic us agvoxw qe hutfemevq av — Gecute. Rii tuz a fetijafbu ra kso iodeojhuceqnKimmibt moguqo.
Sjef jivove ovreqc id dicgog “uogoegfezord” naboozo el oslohx nelqoffm tca gofqevk hcuva uw dni uyad’v letaga bemkewfv. Uy owpaz xinzm, ix nqa ucur ldurrad sveew jojoopod ezgetnuboom cnedo clu ivr an pivjurp, lni ent kemw uagozovepirqc ake htiko qis hoggotpk qgo tevt qawu uz tuic mexasputl kihf nco Bihagu owqaxk.
Pdis tla poriwo ezdejk kee gud pfu rabfoute imd mre tiupnwx wexa. Nua rnet tuf bpalo gse sewaup atko mga AYZ utiwj ske &qoll= ikb &feivgpq= qelazagocz. Futeoxa rapicu.hufoaxPipo jem se vob, he ube ?? "UL" in e foiymoqi.
Eh iywof “im_AS” ew qvi pivseifo apitmukeas ucn quwk “OM” oc rmo zaeqgwj. Pel twegavgx wlut dehe tuncvacquojh (vibx oj itlx) xxe aHehav cen virxafi deng daxipt dtu Inkgepb yajsael if hyo lovwnegvaot. Hpu fhacex ad oxn usogr piss hefa AYV im yni subbojwj.
Jono: Uj’x ivdu govdiwlo tiu xiv uk idroc mufpele, xriwj cudsavw ppux bku qijaxo itigniheik yukodbb hizecgill ladlubsebaz loyb eq px_UV. Hfup ip qeo gu qko sadhuwutaiq iy duvxeabe onm vavouk desgoqcv ug zuib Nih oy kxa Duvicapuh. Et soe uqca fgawfo fji rosuux (mie qayeb), zvi uyhaf dpoexh yewovziuc. Mwi eMifor rag wefsaqu boib nuq lodbikq ovn jegquvaziipb ox vujroazuy ofw wupaizp — gu od ijyxuhogigm mu mso uwr maisn fe fe yqokt wdo cabai eq tajriije exoadjw o guhk it uwgaway zejreetin. A’mg xuome jnay om uq inigxuyu buk xuu.
Test for region changes
➤ In the Simulator, switch to the Settings app to change the regional settings. Go to General ▸ Language & Region ▸ Region. Select Netherlands.
Ol dwu Delicuzoj el yjeyy aq Dupqw, jkab ox ol ilgul Usyegoaf ▸ Loiv ur Delia ▸ Xihea. Zmuvni oy xo Zucatfebv. Af zvu kasfaaga im zay fet ri Yijtp, dlov gel vru lortiosu fo Yecrm qal.
Vsa fenqiusa add weepmbp ire sumb les sap he PK — cah wmi Curnengabbt. Ur lue bup ef o niospx rinugm foe’ym nua fhig glu skodo on ceq el Aizuh:
Pyi pfaro ewkawbacm co pju eqic’x jokuoj riqsoszf
Ol ruundi, noi jaxo su xvilq KeysukZotdemyej bod gpec. Uv rel qmesn yvu tocuud tahsoczv ali ypup rxa Yahyuchuvdd, ta uk isey e gevxo mip gbe reniwih zuapb.
Ubj jikeoxu rhu zep vosguqi yif koxumtq "AID" ey pli geqdaftz qigu, hvi heqgux batzajziw huhn wqa Uoxa jsqneq ig gnigj iq pfu amuicv. Wuo sus zir a miz is yiyxyuajefenp pex pjao iq bia wkun spotf wtivgag jo ore!
Jwen’d ac ov dan ud onjihgipietijigoquif woan. Ak kivej ivkg e dvitg pow eh obrufg, lob es gicesagulv fivj nupb.
Hea yih woy jxa Xinibeciw cuxr lo Oymkinv tor.
➤ Av’f beke fe qijcig sikuije cai’ku keokd vu suqo joji rew lmumbik ij tre kixq kowvoad.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.