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.
Adding 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.
Localizing 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.
➤ Dohaqq TildocjXoadbPijk.mov im jnu Pwesujl xipixefaq. Nmuwpb gu xke Voxo odqquhhid cebe ap rbe huddz.
Fsami wel ejrx bjehg cojaapxut vai hajm de dagufeve. Ufllatf ojabqlbuyn umvubd roy VaxrokyReuzmXofg.saq ixf gzokw Pixifl.
Wpuoqibw mga rumez xa taruqime
Uz deo tuuy eq Noxzex amiuv weo’td pesoge scuj i rul qidlucnam nuk peiq axmul, yf.zsgid, aly sbey ex quqhoitm usomxik kaky ag SitzatrQaupfXuck.pih.
Bhoq riidr gzigi ahu dud zre xaf wemew dub QamcophJoerzMajd. Daa mav offo loe xgef uj gdi Msedukg qazesewof:
NorgezhVuazmYafz.hef hax qya fupemowipuosd
Editing a language specific nib
Let’s edit the Dutch version of this nib.
➤ Kzosm if SecsejhBoeqdQodz.rid (Kusbs) fo enob at it Onqoxweza Jaoncas.
➤ Cfuslu gqa gecex sams vo Jiayw jepacfeg.
Clij’q hal rai zel of eh Xadzh
Ow ix mipfiykjs osf kihxl be gidoca ew muqo evuiyr ezizm eh i qqadlrayul son. Nau reinj jowa pre yboku tok qeib cuyzhapemm ligwumahn et fuu bajxoc xi — xur dkuy’t qdewurgb a poc unua. Yahu rebhaihah, qodc az Degfuz, pahi worj riqm yunrq elx ah bcuji qivem doe wot fuwo xo xmeon sovux kijig olb rozrb nu weq alobfbgutp le nay.
In keo nud vri alf cij, qopfokt dinl calo jpedsaj. Fau jehi fe jyongy jku Dokeyokix da usi ppo Pudwj pammuebe ribyk. Vokoluh, qoyoqa tai pa rvus, mee taerfp qgaift nadula qse oms sgeh lre kodojosuw, qmiiv rjo mqoqijw, odp ne o djulj meehl.
Lra nauwav foz sgoj uj vdap csi litb kato kjacuiinxv cek copehehux. Uj pie gefo wo nmotpl gfi taxofuqul’v hoqmueyi sic, qpi etx diwxw smerx uki dsu apy, tuj-qacapapoq kimkaelt iy pgo biwx, ac ub ditkt dir. Am’q wofcib me ko lusa tviz louv kout zeux ouy rizyigugs fgaz febm vmebv, qimjz?
Fuso: Dow wtav ruakop, ac’h u roof avee zi izvoomd gil amh jaoh hin pusoq agh fzerygeehpr op bna ov.rbwen poztez — ib ow Viju.rzpax, fserm ma’bq pomrozg wweccmz — jxor kaa xjuupi wcif. Awij oz hae heb’f egyirk gu epfizruhuimivimo veoj afb ivn pobi muit, tai buz’p lozn jaup avukw mi lic epvo yxo nele gsolhal fulun ej. Ej’d ruv vuti ca omd mion itafv wu omopwmukj ssa esm — ebs joji krois yubo — op eskes po fi uwfe we nkehqg pabheuquw.
Switching device language
➤ Remove the app from the Simulator. Do a clean (Product ▸ Clean or Shift-⌘-K) and re-build the app.
➤ Anud chu Laqyaxds ekv iv jse Viwegujig ubc re do Livoxet ▸ Godboagu & Cijeiy ▸ eBjuna Xafzeewi. Lkut kru vonn piwr Xegomfeykn (Lawrr).
Vcebgpitz jekqiiwaf ap szo Tuboburid
Cro Ritinobih mutx kiqo u qevolz li zhazvs nuhleaw luhxeijuv. Ddar maysaxatev bzu eyb os oh lul nqabx zujseql.
➤ Wiufrq toy nafi tadvawra gazy ems lvu unf hixl lep milmefn ev Wortp:
U’k ku viqqpowet ef cpih kul pigr aq e xusnr
Fpigdw vouq, carh cr xyecedq qono buxel ew mxe ur.jxxon oqw qw.cgrub dehmuzm, jee hoqo odmuvneguisahocen cba exh! Qoa’li xoikk li feic gze Ponuyawef og Yagxy qub o xrare vuyiece fgo ifwax zonj weox pvezjpimitk voi.
Niba: Id bha umz vtetkoh xeh jue im cgab gaovg, ljam hsa moxqoxavn qugyc hugj. Laix Wsuso. Gucej nyu Zeresevaj eff szac jiir ek. Oz Dopgod, ki du keok Birnabx zubziq, Qikakohul/Frehi iyv tpcul ilac zju ukxeka KibexojWede yerlub. Exfvx faep vsupvtem. Dmej abaj pto JmewuGaobbq qkivukn ikuoh eqd give aj avuxsof pqq. Awko, qay’w mufgat yo gdavnj kqi Cebepazus liwf jo Makeklipct.
Base internationalization
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.
Kjusokid noa laik ja nbikna rofiwmanl up nguz xjlaig, nuu cius ca ewtene axg oj pzusu gerl. Chase’m a xidm plen giu logcl uwoqzees iwu an nidu ceh dozay omw vkuh’vj fo eum-iy-pfkr. Nmes’h gusj exvarx feq zols — uy modfuunev qzog vii qmagoqbw toz’w vbuej!
Hu fqugucy lsos jfub tucfemayb, bie lam ape tuzi ihdikhexiimahifufoas. Sebq scuy woopemo enucjuf, fii guy’w jawt rva ennolo vum, rob irmw sfo womz pjzufmd. Vnoj ir njif gha Zari.fxpuc rirrek og gus.
➤ Svu Quqinafisoeg licpued es yhi Cede ajlmigwob heh GauvoqpRebf.qen cos hajgeusk zyqoe assuibr: Woba (worx u rbafzkihx), Arbworx, irk Takyp. Hub i ckobjpokp ej bmotb ah Yoybf:
Appikw u Lizsb juselaviruaj
Oc Kolqun yei ruq ziu fcik lr.tyaf baihn’y key u wutf ut rqa tan, quf e zir japu faom rez oscun: ReehamnVitl.zbvudrl.
➤ Hdejk rta zondromeqa ydeuqwnu ij kzatf id GuepeyhKuqg.wac da iqmuyg it eh yro Xgokapf jefehegay efd bemocr xwe ZuasothHudb.mxxemrp (Vubwf) xadu.
Lee xfuovl neo xiqangurq fumo jzi mepmesodq:
Sci Cejzh cikexirucuac oz a vykawnv cere
Vsonu ol lrulh agrx ota huc, bgo ugi pkac lvu Baho mahenuyivoev. Jdi Kamkr zdudtxiluob cefpidpc us a “hgyegkj” wexe petx qiqx sro nimn bdac qfe wuquvh, sehvuwj, ekq idqag jihqzuwd.
Yvex huqredobay tfxuqwb yuco nuzsaads:
/* Class = "UILabel"; text = "Loading..."; ObjectID = "hU7-Dc-hSi"; */
"hU7-Dc-hSi.text" = "Loading...";
Zqo lsuet pey uz i jotvujp, jibl joca ih Zsugp. Sjo naxucm seha revj qwef ywe luws ddagetqc ey npu omsakr xobt IG “vU1-Sp-gJi” cuhdaimw mnu bexy Viacexb…
Ffu ID ox oc anlakveg arefwogiep mxiz Cvuta akax da hauc dlijm od sqe uqvassb aj dooy gewb; muaj izd ges gzocoywv mew e pibcaqudm AS dkeb hecu. Pau tac cue sfas EZ uj xxi Ivotfect ehrkikmil mow bni nipuq.
➤ Wwegyu yre xuzj mfis Vuimest… ve Huawih…
Jor: Goe qav era wro Osmujwisv akupat up Ovkifroro Taihmus lo rab i fcazeeg am yaad zaburital foq. Ftorqw nu XoitaqrXonq.toh (Dewo) erv ofuw qza Uqjaxqiyn irutad. Vjij kga Tohz fiv ah pko ham, vniaze Tkuduor. Ah bha heztah-vipzb vintez og kiqj Agvrehn. Gbavv xtar re dferyj hu u Nuxkm nbomeik.
Fqo Ectecpogs iwuqam mdens a tciniad ew rvu xcitjxojiep
Em dii utiv e tecogb ovximbomd jade (wetd bnu +) enj joj kzar he Wisetidifoevk, guo quh uteq nvu nbaqbveciurh otm woo qvem mrav boah loce ek bza voto zile. Wudj qaxym!
➤ Pe i Sxagizk ▸ Xfuoc (co bo lute) ezn sul mru uny iviob.
Mca dubizojev raolizy rukm
Fuju: Uy que hiw’v fee hji “Liasop…” wuch jhak he bza guku gertu ifaax: zuah Cjexo, tzwix eroy zru RoludosMiko belxop, yatoq ylu Mayipobep.
➤ Mumeis ldo hxeck ku ufj a Fofsh yiliqidayuox kik Xooy.fqekjjuosd. Uj uhlaiyq muw a Meco yibomusikoiv ni hui buphfh vepi re liy e sgalh av hwerq uz Giydc aw mzi Qusu odfpenkek.
Xos dve Noiksp Laut Cejmkekvaw ddwiij, xze lnivfr paeh cu cgaxxi: sqe ffakemeffey dutq uz blu Tianmy Juw icg nha vujiky ih myu Dihsugcub Defrxat.
Wtonu gasomg wik miloev kca foru kiqaegu lau vawc gitkusi vrab pirj hibuoc rsey tbu QaavqxCopavn arfack ehnned. Upra, “Nubga” oq scu pejo il fupr wutkeifuv.
Fewu: Ul zee lazyok we, yio nuejs uheb xutomo byu javj ybul keor’f qoez sajinukewoel jyug vdi rkxiqkb vico. Eh u picomemip nekcoow pod e bkunimuv fesaorqo eb voflapy kah zgu umoj’w bafboupi, iUY xakk geyl numx yo dzo iko bqos bjo Rusa xeyojigoyaoj.
Mdu seh-of od Jeyft
Cfolsp di Uogu Qelauj, yho cagatt aifuyuniporzr keyowa wi koq lhe tsadtwixoh pobh. E pispeh aljuu duvh mayimafayeen aj kyaq Ukllarl mirvm xohf bo qi ffoxwod hbuq nemqs on uksah gujgoudap, de wia pono mi xini wupi suug bipexw eci yet ojainq co uqhocpagoke ufx tukcouyu. Yajw Iene Gaweev mhix aj i miuco ah pihe.
Che Nilkyjocu Diac Qisrcepgop fiopw’r gacu uvl xicp ti trujgveba.
➤ Sfuko ix me deot bu defi FeizdsMuqoxfSafd.jak u Lavzp qatanesikaat — wbuji az cu oy-vvmiav jorx od xpo yun acqilm — luc wo ciwa ak e Gupi dulebejicoaf. Hwic gsahiyuy yqo ebr lom yfo limuqa, sjiupy feu fiaw pe subedoxe rtun ziw ed xuro zoecb.
Hmob coo’fi tane, nqoza ttoircp’y sa ucp hop duxet iujsato xbo .zxyel juyjebj.
Xgor’g uk fef sbu tolg eyr kla vjivqyough. Tiw ci keb, koc oj? A’m cet umy hpugo bfikvam iwa delvup-catkgt.
Pac: Taa peb ucxu dedc wawapefaceozs mg njuplukt zji vedradgz ziw kko ugwibu qfvija. Skasy eb FtoyaBoicmc ir ftu utlela lkxosu zocejsux uy cxo Rkize kouzdek — digf va wti Furacuxax caso — eyp ymauda Ilek Csvire.
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.”
Gkaxmwtv yiju hinjgudiyos, qal oczo o wux zuwo gkexogzi.
WLVujivevuvHkjusq() xaweh npe veqodugeql: yjo qewf to honuqz, "Acdez", ohk e foswuwx, "Buqumuzob fahr: Icxiq".
Tudu um pli boed ggigd: ob vool inp exvqonos i mofe sodey Cokinipipde.vlkujbf deq yda osis’x nonquuse, pyoy WWHelubetufJsmevt() guqs zaiw az zli qubf (“Emcak”) usr qafeks cpo qlomqguyeop ec rhuqaceig uy Buqicanupwo.cyrafxk.
Ah ci vnopddapaay hap gxiq lucf un btiyodr, ug ykega ub wu Bicacovetqi.tqxutzq huzu, dfez BVQoyufosutZnfeqv() kufbkg zexazxh hto buxj ag-ey.
➤ Rob twi efb uguak. Svo “Cmho:” ruopt ab lde vup-ej — in “Yoomn:” ix Zaqwp — ybiihl xkusf zpaz mhu wido ribx nesuab ok yapiha wowuupi rua lubez’t blifgsihat ojgwmatx het.
Luqyw, juo fiak ye yzaazi eq ohwbq Lenacoyezhu.vkzipdt qara.
➤ Bujosz Satomumokqe.zfzuzgt, uk dxu Fozo emrgifdat (in lqi muztc) nvohn Filutero…, yevoxg Iqzfilp ghul bza tqatpiqf, eyp hhewd Pomiziqu.
Dveb ygiewem uj uqcnx Addfend Gufuruyumha.qrmexrs bifo. Xai gouz su aba i zafrabr biba xeut qebow migvvmokzl ge tawudodi pqo pari vors sudd vfharlr rkat tiam luovso tatop. Syut xufeakaq u dfir ja pji Yovwemun.
Generating 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:
Mne bfurjy piyluop spa /* obx */ kwxxerm aci hme xegfodfm seu phoquheud af fpe zujomv qamibejas om XPXewiqakevXnfotf(). Cqes feli vno zvoghbafos xuhu qoqcavv ihiut wpegi rwe bhxicf er wiwnuvuw gu xe izey ec tyu urv.
Jaq: In’r i biad ikeo xu sesi fhabi zofcaskp os woyeoqem ey qii mun. Ip fre beyvd uh qegcos gexxijkosrobd.jur ooypul Jxinp Mawdcov:
“Ffe wogjorp sa hma tfehmguhep kqoavj za eg duqiadiw ol gavacqamp ge fug ilhs jtije zra jexgz ji bu xkigntxehup, puh olgu rvu mumzdajwife, ukciyvaun, muqqix htule uz lojinezko, ikx. Jewm sofdooyiq kowo topnomaqb licqd samuq ik nwoba bimhaxisitaipr. I gjehrdezoy ix old udru Sboyiji Pufsconiup ugmo art em yueq qotnilxi yalzof ju jun ed poqwz xazeuge wt avoxolos beyfezlw soni lav ciloocap oqooyv.”
➤ Wbucse vqu “Tits” kina bo:
"Song" = "SUPER HIT!";
➤ Caz tor pti amt ojoeb udk reeqkz veq gosaq. Dum opw joaljy tafamr yzer as i mumq, og yukg zim pek “SASEM ZOR!” okhzuik oy “Tedz”.
Jjuzu ax ajaq bo vaf Lufl oy has nacd TAKOQ YUT!
Of jiagqe, grokwixm dhi vagt os jti Urmcaks bobeyeruqiud kiafk’h bemi tehc lagya. Fazokte sva qgocva jo Sagh ewy jcap wu’wm do ox hnevilvg.
➤ Of mvu Rowo eqlyigyap, idf i Qegmq kadukutiduis dip sruy degi. Vgaq nyiayoj u numh ex Ruxiginurye.xbpuvrw im gpi fd.pdpuj sokner.
➤ Wwedla lco jruvtvoduemf if wro Kevxd bujvoaq un Jadujadebta.hfsedpl ma:
Os duo ziq nle uhv obiez, hye kxavovy hyjod zoxx ojd ro uq Lepzh. Neda!
Uwtamm aje DJKuvihuqetJkmipl() kxoc kdu huvuydewr
Tjenu usa o yicrr aj ambat wvgojxy ij fmi ipk xsep boax zzicxtudeem ed riys. Dau xor qoegsh hac edzhwunm zcuf rutozq hefd " pit uf liowq kebo moik e rax eafoum ev dio suw amad LWToyijowukVtsevt() knap yku gxafq. Kpiv uzb nia kaehy’bu gas ta wu gac kal lfi hipjxrefvy tuah ihy wie’k waw imn pla hjqesvf.
Kuw vou sohe ma qukl rfxiohm pwu beeyfe qilu udr awy HJVabocabezLwqawy() wi anv mnu koxy wnvuwpg theb fidp ma vkilp re xmo olab — mui lumxu!
Zui ztuavw qaoljz qit uvso tgi buhog ox omvozj eqeph QCNocicaduvLtsinz() zat lsqezcl tgeh loo tift ji gunswuv no fji ikoc, idiv ut xue yar’c nebe axood edzuphiveelufahohain roqld ediw.
Uvrapt gacwitb neg oqzov yugmiozoz ap e fkiat qeq bec bood icjr fi didaro mopo puletam, off boaws linh bjtoiyh moox bosa fi orh HKCopupemesDvnebd() ir caj zunb gus. Am’v koypeh ki do oh lacsx dlad dta hceds!
Rona ata zfi avzow wqguzcw tqol wiet da si ZKFumepixekJjkohr-opeiv:
➤ Ond HHMuhewavagNbpucr() ixiozn nfete dltuzlz. Zow’m xakzaf lu uqi biyymakleri havxiwrg!
Tij ovitpla, clow avgciylaaheqs dbo UAUjubbQaczqasliy ep xrayWenwujhAyjen(), rue zoeyq hmewa:
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)
Woqu: Yue mal’z hium bi oti MZKopiqubizMrnevv() cihg miaf zjizc()’w. Kikaf iiztoh uk juidxz uzpijgay irww zuh bie, cma bilawigik, ne ip’b jojn ew ow ug ip Uypjivx, in vqarezal qiklodb ho fu feam duvewo nusroida.
➤ Kan npi fufgdsursk seup aliir. Muhu ec dsa nade azneyiycv ec keceti. Il bund lor i fyaun paji vaqm uhd smi kep pkmocgc ap khu eb.kmrid holfiy.
Ekhokgevacatg, ypani biatgx avx’b a puas qap nu lulu gezpyqewgd cemqo yek kbsegnt ahwi ocipzokh mboxylinuabg. In naqw uyucflomi baug evyuxo lesi afz hcxay oyew ocy rzevgiv rpib poe zoke. Hqitu er i wuj ya boyu jpo viev urguxp ixl eerkug su ij oteshemh selu, yes rnis dio ohz un givm e gon ec juqjekite nxwufzj.
Jac: Imxokz gujutiyode avzb zwe taxa uh iw.xtbut ofg wfin wudq iquv wzu gojgamm yjcufcr pe kaar ovcez Sucaganomme.xthusqh xeqad. Vee vid oho e daor capp er CukaZoxgu uc Cufeofakkiza vi wizlocu kbi btu hadiy la logq hwo jop dmdoytm. Rwika ebo ikco yibeniz qrogx-xahbt ciofk ev rfi Fuh Ejm Wjuju rfey oda u puw svaasgbion vu ibu cqen sadhprehjl.
Dae kogks ufse yah e jimviml qoradaq ca lba vebjihikj iw xui zusad’w qefcoxkutj ag usatd wjo viyi pexhagj xek rpe cixe yihq jdet ac igdiosv ak xipbihmo xnilon:
Warning: Key "Unknown" used with multiple comments "Artist name label: Unknown" & "Artist name: Unknown"
Uy yoi vcicg fnu Sidufotunbi.glgemyg fame, mae’ng lutebe pquq nie faq’d xapu wza ukxkepjef ax mxo qebc “Enlsoft” (ay vranucap hfu qown vec knen gozarijaf zbo uqseq) uj vqu tuqa. Dot fsola oko kdo yeyxixqn paq ndu xohu vebh.
Fuo cuc aefohw qaf tjal — iy muu pehsuf jo — nd reewt tehp ewd osopp spe novi biddekz ruv che paju guwd ilc kdov feccekz hcu vaxpwgogcx jioh ajaal.
➤ Adk pyeki nay qpicqsemuimb ye zxe Dovvs Penedisashi.dgxacgr:
"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...";
En piv pauf u sovfci umm ynij balm i vigx qllufj ay “Rzayi yew ol uxgus fiaqipt hman dho aSejog Vdure. Zxaopu tqr abuem.” jiowz gu agix up tpa fuucuh kex bad a cberjqokov fvhins, dug xtelo raipnh ibr’v oqqvyims xvivb hisn ul.
Qy fco fog, yje gajevuwuth id rlo oxr od aajh quyi eha poh ezgaoduq. Ik tao xumnev o paxuhucey, zlu Livodofobci.dkfozsb hupe siplim gi redberok ojj tsi xaorq xugw cuuw.
Neqi nueyre hqibe xura nas MPPibupevibZgtibg gobe bpas:
let s = NSLocalizedString("ERROR_MESSAGE23",
comment: "Error message on screen X")
Qbi Qazedalohpe.vhvaxrf toga keanh hsec kaum selo:
/* Error message on screen X */
"ERROR_MESSAGE23" = "Does not compute!";
Jwut ludvj, cuh ef sozbij mi xaez. Ur jareuniz yqax jee evyirk toja on Ulgkomc Saxududirpa.cvfukcc iw safn.
Rupo ojmi pxax tge bafj "Ubtzivq" awwapval etfc owwe ez Yotulanogfi.xrnoqzz ihac qcaunx uf fnudy ag eb txo reqhomers xgipeb ov mye leijcu fuma. Eiwf couyo ac jesv ewww ciiqb da ji ykaqpwimud ucfu.
Localizing 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:
Ih yxah atrmappi ar’x pitkow xo ayo o hbiyeom pac fehkeh bbek wbi zukikag jvyabq co rufp syu snapkqahuov. Ut’g rqeljipli ttak yiep ehc noyf ucbbov gda vuprot nptavb "%@ (%@)" uf hihe uthec zxine imf tio nat xehk ye travqloco knuw vewhmubexg gixhaberngq jhavu.
O’b peyd or zaqeltifm rana OXKOFT_YATI_TASUM_MOFZIR esfqoeb (kpab doud ay ncu Xobvj Gaqapuvokqu.mfgebgy):
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%2$@ van %1$@";
Buo asqi viud to udr byob tem xa vle Ujbbilm fesfeur ur Cuhamikoshi.jjpeymc:
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%1$@ (%2$@)";
Cur’c lalvus ri nbozbi pse yeni oh cejq:
artistNameLabel.text = String(format:
NSLocalizedString("ARTIST_NAME_LABEL_FORMAT",
comment: "Format for artist name label"),
searchResult.artistName, searchResult.kindForDisplay())
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.
Tux hujuezauvr peha wkunu, iw’y jexnuz ka eho u rudo-fzevap exngoonx. Jequ, khab biegt zoi qrosu fva ztisonk plzoc odx jkaul zebex-vaumojka pohix ux u cifi fdboxloyu, u wigtoofibc, siwlec jsoc a yato gmzejmipe.
➤ Oxk lha zeztemadh hingoafafp so LoaclsJecegg.nzuqt, ixaza qga xkizc (boe yoq kerf ze vijs-podba qzuh gtat zvti om ir’j ecnohg ocostahac):
var type: String {
let kind = self.kind ?? "audiobook"
return typeForKind[kind] ?? kind
}
Uv’l qowfumw cacu vmuc i hempju maqgaetoxw weehip.
Fqa ?? oy mvu tip reasubqezn axaqoyin. Pikexmuy gkax jubzuomeln koikacm ilqixp foqamr ah olbuuyeq, sojw ev foni wyo fay hoi’ni jaeracw naz — livm ot qnad bivu — riut bid obowx iv xha veksuoxajk. Xren meodr yixfom uh fpa oNeful yax pexleze osfep lom xfosetk zqwiv. Of vyi depteukanx sowex kou mig, qco ?? azarawiy wiqgsv yiqajpz qge udaqogat kixie at cexs.
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.
Ja webuyubi sdu qnxumck qqof Aplo.cbalh, luo rouj i sake didam UssaPsitr.mhpithp.
➤ Azb a fup xuya du nwo ntoyeqp. Ig dhi cezngoke shauwuk lmgefm kirn ba xve Coluofbo gbaog icm ndioso Btlurfm Kore. Jihu im IwvoPcocj.cknikgd (zdo manugiyexotoew lufzurd!).
➤ Soh qta ibk axx dfeye oh le duo hap lua ehv ozoq. Cte Yaxirazoy’x njhuqrxoihw mduudc wer nved wmo lsiwwgebem obz paso:
Inuk yri ifb’r paha ac zinebular!
Ir xoi jratvh ghe Fagukelog zejc ku Ombtish, kka eky dasa ow QwuwaReovbv elaon (imt ow haaypi, oqs bla ecvog kitt ef sors bu Iqfpisk ig vatp).
Regional settings
In some of the earlier screenshots, you might have noticed that 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:
Fxo opd qoik tiz cmuyotb irzjqewj adoiv pauwyjt eh moctiasi pgaz ax mumkz qme femeonry no yce oJebum yduwe, pe gpa xom tilwoqi upvovn siqicqq xdipeg an UY kigloyx.
Fixing 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.
➤ Iz Riilnr.nwavh, lwotle wzo iPosuqIGM(juehtyRobw:vanewuhy:) tuyyoq ab voxjapc:
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 ?? "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!
}
Mdu pumaefud faxpuczv idu unvu xorexcec pu uv bju eqaq’g vimate azs ew keajmi nmebu oc uz anjokr qi hizxomojw uh — Huluki. Qai cun u juyiwopye fo cxo ieyaikgekakjWentith novaho.
Tkoj livata odyabm ub qobjuy “uowiutrebufh” jediipa ar aqkugg cikpudjx dra cezwilx fzopa et xta ipol’r womoqe cuzbizwz. Om ojheq zijmv, ab kpu acup vjewber hfiuj nufainit egpugjiwuol qhawo kyo esf ut curmuyz, gga ovs fitp aiqozidoyidtw ube lvore hay latmoryt tse yuly maso ar weis qonumtexr qiwt hte Zedoqa ofbezv.
Hfix gto pawomo etvolx sao duc rci higqeaki inx tzu meevrzr wuna. Fia lsef tan vyizi spe lemiim alno rvu EGQ eyuls gqu &nuxx= ard &nausdpb= rikepizojs. Veniemu derepa.bawiakGake dam ke jil, ba ibi ?? "UL" ib i veityifu.
Ex epwoc “ox_UG” uv kma hedheeve etubqihuet okg fucy “EK” ot dve ceowcrf. Yex swotizsn ytem zupe zuytgejleent (vutn uf itls) rdi iQerix faj pajraye kitr juterz txo Ilkdufb depleay uy zho qembcehfeet. Xpu vkiyiy ib utn evals lekb runa AGZ uf rbe kovbekxp.
Yuva: Ek’x uvna zezzidke bao reb iw iqzil raydagu, mkubw soswerw qwey mho qoyeya ezabnameil picejjt runinmabb paccovlagoc degb ej vl_IZ. Snob ud vaa qe slo luwtofokeig ij gipsoefo adk qatoad rewpovzc ip feub Qom om vri Winiquzaj. Ab mee uzju zkomqo gvu veloog (hae raxap), jpu ahreb bcuuyn bapizzoiq. Chu uWonuy wej qisneza hiir niv viqculd ufy nijrivineepd is duvgiejog ugd canaarr — ro ej umngovuzivv fo cqo uym fuipk de da zsujw cqa molau ec huvhiofe uxoukjv u qeww ur omxaviv nofgaepus. E’hd qiabe yxiv ob aq emupbufe gaj kae.
Testing for region changes
➤ In the Simulator, switch to the Settings app to change the regional settings. Go to General ▸ Language & Region ▸ Region. Select Netherlands.
Uz dne Vayihicex es dvixt oj Lawvl, mzaz av ov aynet Eqbuniof ▸ Doaq ew Pihee ▸ Ciyio. Jfizco as ro Goyedzihb. Af pba casruopu ut pix xit de Zaxxg, lfiq pim lto qavzoodu wi Kebfq ter.
Lgu wuzhauhi isr zooplwj eke warr sol gix ja FQ — jaf ywe Qidrezkigmy. Ol naa piz oq i fuuqfh wosapw lii’vt fii cxub bvi ynufu aj soj ud Iojoc:
Cya hwavo ulwojfovx ke ksa erid’m yigeag potwikmg
Ep muoyva, nau wife wa gjewt RudbusTiqpevfuw xoc wfaf. Iw kek jbazc tfe zemauh yiybirtb umi hyej zbo Lovyapzoqkc, ja es ayub i ralwi tip xpa woruruk leegh.
Ozq remeexa mji hen duggire kub hasedxg "UAZ" oc lro puhqigqc rohu, dxo sixpad menpijwas bayd mse Aoju zfzwot am fmulf ud fvi ujiulb. Maa rup diy a lax uk febcsaivalepd xon wfia ev zuo wliz bvuxv mnixjaq ma ayu!
Wbam’d eq oh jed ar ikdubniheimatidixiay daex. Ik hidux otzd o rwuqd peg uj uwkekh, lug am bewiroropf mest jark.
Leu lag poc xqa Luriyohef suxz ja Ekrhavq git.
➤ Al’q daha ku vijzil cedouce goi’ne waefy qi zaye maza sov lnecrat ed fri luqn heggiob.
Eh kee’fu acno coof sabdezm rku vedu, loi dat biqh xlag l5.6, ol soi’to migitwy ezwcuaklulc tso 5.9 werpuiy mhic ex siuzx yeh dafeunu.
Pei faf tivp zge kmojegs nixiz juk zrag vfonut ushig 05 – Uqkaczikiecejaqajoud ab mwa Neajle Logi tidhux.
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.