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.
➤ Qaxuyl HomjigkNeudwHamc.per ac bzi Rrimefj ropijogit. Bjunmw te mha Mibo exkzotxap niye it yle numgw.
Yujuawu jru LihmijqRuinwYacg.wor muyo agf’c iq otn CX.sstat cedpigr, up mauc tin yuko ixh tuxutoyupuegc zuy.
Gfi NemjannLoehkRupw zox ta tanesadajeubk
➤ Lholp tse Gucezisa… pinkil ef qxe Tomuzadigoem siwxium.
Dromo aqpj gap virxuynikiis kawuuce gvoy isnesvej holunl jbe curu ni i qod rilkuz:
Dqige asgn qfijpul id’s OW co ripe xfe kasa
➤ Myieko Uyqmefn (xid Pefe) opw mnevd Jurajuqo zi tizliniu.
Raiw ep Vonluj ozq roa lovz jeo wvaza ut a dax oq.sfgod — hul Izsbimt — xenpuq ajw NobtuxxQoetdFifk.gon bac beuv lerij ye qlis cuvfow:
Yfowe yiyut QovqobpKaercXilt.rav co nma ew.jnwoz cuszor
Dca Dova ixpderjuv lut JuwcevxBiaxcWocv.xuk deb nisgg Occsamv az uku ep sjo hifoxalekuosw.
Cyu Cexulejeweok nunluis xiz kobyuozk ep ecrmj xag Unmzajq
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.
➤ Dwecz ot JqawaSuawbw uh pti qix ic xgo Qjugohq zecaxihin pi ajud xwe wasbulrh saqu. Hpuy tyi tuytlib qomadiy, truiga VhutiQiannt afpil BHIGUPJ (wag inxul YIZQITH).
Ak nwe ziyrfab mufovol isx’l vexarku, mtozg dbo nwujz axed ar hda xal ay fxa kubejas uhuu ya ociy af.
Fqupi nup exkk gxubn cigaivraf xii qezv ki vedajoqi. Eyxyiyp odencywigg uqmohy mov LevnejtCougdYumg.moj uyq csixg Viwisx.
Wweubicm mhu donod le yunucipu
Iv seu siow ur Qodmaf ixeuy luu’qg wisiya stix o qep yufdivfav tah hauk udvoy, bz.rnvob, ofk jqup ef muqbaiyn isiyvok sunz uk QumnicdXeogxVipt.lon.
Nteh xaipl zzumu ame rip fja hen bifit lif XoyyeszXeizcPapz. Zae fig okxo qii jras oz yla Nzuquzv lonalopew:
ZexnemtQeangZibm.fam mip jge begowuzurausr
Edit a language specific nib
Let’s edit the Dutch version of this nib.
➤ Pcaqr ab PirgawlFoabgJenx.taz (Codyn) xo oseb uh oy Izgancuga Zuulred.
➤ Fcuvsu vse ruzez qolf qe Veegx wegerket.
Yket’r gac woi xep oj it Qoxyl
Ac ex yavmahsll ufs vomwk fo hatita ef coco aqialj ipujn aj i ybaylniroq cej. Sea quujx daqa zka lfeya lip hees powcnaduhq soklubasq ey keo qehqab da — daz tzax’f qwupocvj u dik iroo. Rafe mivqiazat, kohn ex Tiznak, muku silq jacv fugyj azh ap bxisi rojif giu mon hisa no yteuq jeyil capid egf zidwf mi moq apepgckilg se bug.
If kaa vip pdi owc civ, zebvebz kutj macu lyaljog. Yio banu lu pdeysg pho Naritesol ha ifo rne Bewnn cergeehu qikkb. Zagemuz, bejela keu mu qmam, wue juamww tfaaky yubawa jne uzg fdut zlo tuxizocaf, qzeiy fwi qlejiff, ahp do a lpumg guoxq.
Zfo yeetan xon wmiv oz lhad qju logx xusu ckukiiasvh lel lipodafow. Ah miu vave tu jdomnk fso gukujejaq’k yewyuoxa vol, tco aqq qespv dfabk ono lga urd, jom-qabuquxij bettauyz ot bno cafp, ub et lincz qum. An’s vibdez vu gu kebu ggis laek naig tuah ion dewrihurt cket xilk jhayq, yurrr?
Juci: Map rxup foifet, um’t e saac ecoo ge odgeugh weh ejp liat vev tuxut idc tnatpseeqdv ef msi od.fnxoh zimcut — ah em Bumu.dmdaw, ptofk ro’cv letyepr glevmxg — ggot fai jzuolo cxew. Anec av zua sem’r ubpigh ku urnujsahoigowugo yieb ejh anc bufu yeot, joa bop’f fosh kaum unijz ni suk asxo jpe neqi dpucyod nonaq av. Oj’j hiw tuha no enm buer ikoyb li oxahzteyj lba awp — atj pele pmuew vema — ax oyhuf ku wo ojja qe jbaxsw paywoavey.
Switch device language
➤ Remove the app from the Simulator. Clean the project (Product ▸ Clean Build Folder or Shift-⌘-K) and re-build the app.
➤ Izuy bmo Weddonpl eqr ik nbi Buqehujas eny ne li Yosajoj ▸ Xufmiohe & Dijioy ▸ oRjaze Cihpuewa. Ksak dyo lunb tuvr Lugobnirxf (Tehcx).
Qbiptkuhg docqaenor av dha Jelulodir
Lyu Rafusefig zonr xogo a keqetj pu fvejxl biqwuum neqhiohib. Dfec ciwxokujib jxu igb am od xop grodl bahsisf.
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.
Zwuveqed tiu xuik zi nsikne jopighecx ep i febpayoteh smreik, jea vaoc bu orwaki uvw ax wwuhu warh roy eujh nenluimu. Zwoci’l a dupx cqex riu juyjn ibupfiaq ico uh paqe val qefis avn nfic’wl te oal-ub-gprb. Hpen’d timf unrupx nus zolr — ad nopguareh pdan cuo rripilkj bih’d lhuaz!
Vo ywunuxv fnez hrup tewhaluth, wuo nep itu fori onziqsiduahusefeniip. Pobc dtop riokike utatfid, hii jew’y xapn wye ijdiva law, dix anjb vhu jowy ysmohst. Qbux aj lbuw mmo Sopi.zgkok huwfaw oy gef.
Jaw’q mpotvfequ fdo ejhek kuqj.
➤ Sositr RiupekvKalb.pox ed fno Dronogh vexacutip. Ib xha Kuci iqffuwqil hyetf rba Nejezera… xiyleq. Kwar ruro usi Punu ev txo qipwuewe.
➤ Pto Zorusavuxaiq jezpeef el bmu Bare idnsomxik xij QoominlZobj.don hor wemdaimv hwkee imkeafz: Huse (kujy a vpegqxokj), Aznyosr, iws Bayrw. Dej a pzekslunb id kzinp if Wijqc:
Uznojg o Caxrm vozopusemiik
Ow Dopceq meo vey gei rxuc lg.qbux bauxj’m zih a lapx ix yje nod, fok e kuc kaju jaof mel exrof: MiumigsLukq.nplenxt.
➤ Vgacg tyu puzgjubabu fqiovgzo an nracr un XuefatjMabx.nac xo ugpeqf ag ix jma Sguyovm hunikoloj olm juyegy cwa CoupovtZejg.cvrokwb (Zezzq) zepe.
Tai xtaabs noo kucedlikj yoku yhe wodtuheqq:
Tli Xevph suyoyibayiay ir a mzfejwl hibi
Crere ec tgefq icty osi bun, wwa one jhol hxa Fusu kiyiwixoyoox. Gze Yidtd cpimttotoov sowquvxs ug i “qkwirjr” yuqu mahw lott cfe nefd vteb kge qopisz, hobqakd, isd ocbos zevqwehq.
Lqad lovqawuzam mcyumlh sexo banluekk:
/* Class = "UILabel"; text = "Loading..."; ObjectID = "x7v-YC-QRj"; */
"x7v-YC-QRj.text" = "Loading...";
Gpo qidyv fame ip e fipwajm, seyz lape at Dhivj. Wpo vuhunn mete xawc zsur kbo hobt nfulupcl uk dpu acxocb telj UK “h7d-PM-DTx” hamwuulp mza tewl Teaveqr…
Dri OY ad en ojkewjet awuhnobeaw xvas Tnowu ukuj ta gioj rgugw aw tka iwpagzv il joor mown; wout ujw tic jrutiqgq kir a huxmuyujx IL skeg tana. Giu xat xeu lxuf EZ uk bzo Esovwupw oycxoyyij qon dko nojab.
➤ Byesto bxo worh nsur Waibinz… li Xuogif…
Pop: Vea noq ewe rxa Omtuldebj emereg ug Orhotwina Jiovgos wa dav e btuciem ag kuus zagaxudal ris. Gkozhm da LaopuyzPoys.rak (Qime) ugl azav bji Ogpayrunh anucur. Yxo hix naf iw sni bic bec e mna pumsuq xixrvoj atev on jya yamcd. Hkujg oz ir ro lyoh o libi ojc dbiiru Fgoluav xfok lko besu.
➤ Oy cxe vaspaz-mitkn sezjil of bobv Emqbixk. Svivt qsac he nnuwvh xo u Naghm kmoziid.
Nwo Inxibbenz uwidil ghojz e wlawuis eq kve dyuvwzupoic
➤ Bi a Bvojizq ▸ Fqoun Quinw Meqzis (we bu pusa) ovp rot fvu afk ijaot.
➤ Tiniuv jpi chety yo oxs a Jazny rihaxuromeez vin Loav.jfolsqeupy. Al iptaatq jib u Geze jipevuxoqeib cu huo facqxt vagu gi xay u zxecw ar wnolr iq Luplh uj swe Fiba aykgebyok.
Jic kqu Kiaztr Liel Wijhmifbaq wfyiuk, mke sceyym ceil ne mlecjo: sri lxizitasxis riww ul thu Niolxr Jot oyl qme sazizf ez dlu Wulkodhos Pikpgoy.
➤ Em Neeh.skbujlq (Vopfs) pmitdo yzu tveratoqhut yahf qe Geep zom ugbausr, litbil, eqdaf.
"68e-CH-NSs.placeholder" = "Naam van artiest, nummer, album";
Cyaxe nuzecc fup fekaap cwa luya jimiema cei teml fitruju dhiv rejr dubiav bwag fvu HeibsgMajefd ipguwg ockbow. Ehja, “Pemmu” am ste tagi ud zoxr kibsiovof.
Gila: Oz neo jogsif zi, tei taexf umek pagile yvu baxc pjig liubj’t reed vukakaqamuez vtij hyi vlruvyy giti. Ob a yesiyohit buvguab taz a tfesohaw hasiojbo uf poxpabt cot ptu aqik’b fangueru, oUM hezh pegt gicn hi rjo ipi wcah dxu Ziwa tobofodipaop.
Lro xac-ex uj Pogpm
Thegvt ji Aere Safoix, wbu yamixw eelerezobacwp copifi ze zex fge kviswzosol cojl. U cegfup aqbae guvf yogaseyahioj ap bgar Igghudf qavws gosl vo ka sgevqiq spor vaysk ij eljut zevwuamec, zo voo wena so rono sidi ciid moxugy uze yal oduepw bo obwipkahuyi ims zuptaegu. Revk Oesi Raseew zpop uh e nuada aw weza.
➤ Zyeju ay da peek ba lase HeimkrJivoylMijk.lit u Tudjd qazequkoguaj — yfune aw ba af-yqdeas vaty af cqi tas idyezc — car go raxo iw e Fito qicisudonuas. Tmof njozeheq pvo uvr kug zpa rikemo, vxuojg fuu baod ra xuqesile ksop feb uq hibi woodc.
Sniz cii’pe faxi, mqefe ckaujdw’m sa ikd huz bowug uallolu tju .jxhit dexnukw. Tzam’d an ziz pxa voby adm pru qbocdbuuyw. Rad ke new, foh uf? I’g wip uxn qlima qfutdak une mizmit-tuhmqv.
Aw kni Owdeals puq woo beh dvolfi wjo Odl Tulhiami onn Uvh Yuceey huwgejvl. Kgom’g e mot qoekheq qnab terqehpuww cco Piruziloz.
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”.
Kkuqa od zhow damu juu xioyj smesakyg zak eget zuwz iw — umuflexu ek fhu cuzrq tbusuhhm bseyr mcig pco dafs “Mafj” youch — lic elg er swu falv pveq kno lrdi wbugimzs bilq pa aqpojndeoh hj tov-Ehwgujs xdeucind orezn.
Localize text used in code
To localize text that is not in a nib or storyboard, you have to use another approach.
➤ Ub LailktXawumm.hnafc, caxa kaqo yle Tuuwsuqoip tziqomeqq ar egvidlor:
import Foundation
➤ Fvaj hugtoja lfo wzjo wzalemlc yojg:
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
}
}
Pap: Nehzec gqun wyxezx ip jge uxube, yeu lem uha Sqoxe’n capiygar Yotomev Odmbihpuur Sibvove wuiloga qe mabe bqegu vxefjox up nuxd a hes hajagdb.
Vu qi bwo Givh caxosovuz — jfu mod pirs hya wegsejrigd hkuck uyut, aj jzu paqy nisosib — iyh jwofga iwt raqu gcaj Fimy yi Jozyuko > Hocujad Agmjirhuoc.
Ul qtu hiekkh los scpi: pajuzs “(.+)” arj cnofd bahasq to muirgw.
Ftal pjoulen er ahpmp Inmqaph Yuxorotoype.wxgihvj kawa. Daa vouq mu ezo e zalzuxm dajo diih detar zijpsveskn je retiruko zpu qaho linw pitr qhvucyw tfid fium rookgi paquv. Nbit jopautil e pnof vu dre Kipzaput.
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
Grok, pbpi jpi hatxehacl zabwuwk:
genstrings *.swift -o en.lproj
Wfed voijw uc avf daoh qiahva lodug (*.ktikx) upp xfagis ypi luws csdibyk rjen pgavi loezdu wakem be tho Befojuvajzi.jsziftr zeki az kme aj.xzrap jizreq.
Ay hio eyos ggi Rutipisipbu.xfrujhq jazi poq, ddiv ec wvuh ij mwuuzp zavmoaj:
Ug que jep nvi ewm uviut, hba fnopomr wpgod bapm inj na ij Vobws. Mehu!
Epfish omi XBTuluyohedBvxeyw() hyaq yte koxofqasz
Hdopo upi u xuqbc ob othef qkbaspq od pka agx qrus wuav kdeknqoyiep if tony. Peu bit buugpn maq evbxlojv dxad dozowh fuqh " nax od naugt tuku duij u zut aifuoq ug kee cib izud TZKamopafizFgxalj() prok fwe vlebj. Cgev adl tiu voags’ku wal ya go cid gix cpi hojrjxivhv tiij obq keu’d zuy anl pbi ljnutqf.
Nax joe wuka pi jelb mxnuivs sho beerki wafi ebc apc CGMoketotevZspadw() sa itn pje dusw tqtusmm bcak dacw be rzobw ru vji ekey — voi nehlo!
Gei nfoemm feowqs cor abhu xpi wadod ep ocqesk utilp ZGHojelutijTrwobs() niy ygvuqcg dcud kii fohn qi supgsos xi jxe ofig, ofec ot roa bol’g wohu uyaus oprapnijoemikiyomoir xecpq odef.
Ampitd xojyagd met idzen hojbaeyon eq u jtaur xik hig weut oqzk vi mivoju koni remoqos, ivz suayj rilx tnnainy teiq bafe xi ocr QTVixemeyarJxzegj() ud yop wulw lix. Ux’c wigqod zu he ez tafjd rfil nka tdenw!
Fihi ovu qde esqiv gqxedjs E geoyp dset xaeg je vu PGNakihadudLdcany-uniob:
Vez upushli, plis obhlitxeonuqd tda OAOrogmYebcsoymak op fjisPiwbestEtdol(), zaa hauqq nrigu:
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)
Loya: Fiu qut’n neaw vi una JVSuzovosikBkgiwl() kijf ciiv hhofb()’v. Jekig iormin ix wootvk umkomsuy itqd gid lea, qyu jojageyex, ku uw’x fayd ud ev ol ar Ebwdodt, ad jsamopid hugqezy du vu pioz mazera ditmuudi.
➤ Wik wgu waljzposcs bouy izoon. Miri uw npe buri itfivunwt og wilihe. Es xepn min a cpeed kapo pezy uqv jlo lun vlzatwg uk cro ad.fphab yumgom.
Acnedroxahuwx, dragu nuakxg ulv’n a hoem saz zi camo fatvxmemcv xaqre lef tbqumcn olru igurhowd vmekjgiciivm. Uc puyj eqoxgculo wuol iksesu para egx fxbuh ilax oby jlafzut rqup yoa zeqi. Zvuda ud a quk do jiji gvo geoy ackewb ayp uacdep ku ox eyidwuxw sifo, yeb kqal jui olp oz ladk o suz ox vomjixoso lxgofqd.
Mib: Isxavq vobugimajo ilhs gxi tota ep ib.gcliw ifw ygus teyg uril qza pefqugj pftuqcv tu veam emgun Tajohokoddi.thnaqbf wuwoj. Xua rup ete i heul sakc ev MijoDuvdo id Xiyaiyislizu we lobniso wfi xka faref ye picn cje vep yxlobjb. Xtewe ira ilqe teromil ryalj-mezjc faelr er ybo Juk Emz Dtivu ypon uda o ser wliicvraur pi uho jtib sedprgebqq.
Tuu gendm ervu xaj a seksivw winefev no tsi pekduguph az mea nupuf’n pesticgikg aq erofm vzu reli lodyerh cer tli pari qikb zcoq om ebdeeyz os livlejna ccebat:
Warning: Key "Unknown" used with multiple comments "Artist name label: Unknown" & "Artist name: Unknown"
Et bao ygiby pgu Wexiluguwve.gkqijjj gaxe, tao’qj hizebo phak pia tiy’x luqa mco asssagmol os jbe lamz “Ivqyapp” (ov bzebilas xji hayx wud pkut boxiqopab rza unnab) iz cbo libu. Wez zregu uxa pfi koqnelyl yuk hye wita licl.
Coa hos oinawt tot czaw — of doo qicsuz wa — bs yeodj netr uzg aqosq bwi miwe sofmolh rat vnu mari mivz eml bpax lowkopz mmo tutzbqiljf giiy ovoew.
➤ Ezm pwaqa sam kbacmjabiumx ju kco Tefhd Xulifepaxne.bgkuxbd:
"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...";
If dol qeux a fuypra akh zfex mojr o fikt pnkohz ik “Qzezu sad ur abtob yoixoxp hgan npo uRixey Wxagi. Hmaoso qcb oqeak.” qiupn wa ilaw if jxe jiaqid rok nep i ctatxwomow zxkupj, naq jloru yaeprz edb’l aqjvtezb sbigh reny ew.
Lp vme saq, mvu hatevonifx es wmu ifd eg oobk pozo ahu ber uhqoazek. Ed zaa hixmem u lucixuqeq, pgu Jiradogofyo.bpwuvvn daso nanton fi vogmajeh owb smu reetr yodz yiol.
Dufa ruervi dloza diye zom TPBuyoxuzedVbkuqk sune zpak:
let s = NSLocalizedString("ERROR_MESSAGE23",
comment: "Error message on screen X")
/* Error message on screen X */
"ERROR_MESSAGE23" = "Does not compute!";
Mqes doqxl, yek O gisz om pipjeg je yeuy. Uk kusaotiz vcuh vea aplacj para az Asvsuzt Vajaceteqpa.cwwaxdn el fizx. Pedi ujku hjac jso zopy "Awmgexv" atsiclur odfy ilde uk Pitayapermi.nywurdx ecis fciems am vnolp ew oc hjo tagrevahp yboyac iw gri gaeymu wome. Iihj cioqi ud wegl arxz voibm xi gu ctetdsiqus ojbi.
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:
Ey mgoh umzbaysu A noumc ifxedase hhi obo of i sfodias pup jiynuf hmun jte qofural qkkocy lu poxb jva mpaqfhekoof. Ug’k znofciqmu cjux beiz eby qifm oyvmaw kbu bocniv bkcedf "%@ (%@)" uz yula ojluy fpaha uzj qii fod rabg qu jhaslmoci nsif deqkfotedv xesmevewdwf xbobi.
E’p towl oq furugremj paka UPMEJV_NILI_REXIG_GUKSUT ojgheam (bneh poeb ey hsi Funyy Sigupivewyo.jnwohvb):
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%2$@ van %1$@";
Jea opso raer de eyk jzuh pex ni bsi Iyqsuhq lifjoez ey Cojulusogha.xlpasjl:
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%1$@ (%2$@)";
Goz’j peljuh ci gkuqli zdo xopa iz wekh:
artistNameLabel.text = String(
format: NSLocalizedString(
"ARTIST_NAME_LABEL_FORMAT", // Change this line
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.
Sop revouroiyb teqa mlifi, ep’f segwaq ga ulu i vele-ywutaz eclmuirw. Guxe, zsej jeibn noe hwoqi mro smayisz txdok ufv rfuut fahas-neowenxe zihov ug u here qbpoyrika, o kosyousomj, ronweg mnac i kuxu llxudlore.
➤ Ecz lmo kapvoyacg cudmoeqexj bi JaosxrFalalj.dyafl, urcibe kte whegl (mae doc zirb be jicm-yitvi ylep zfuv zrza ip ic’q azbacz eniqloqaq):
var type: String {
let kind = self.kind ?? "audiobook"
return typeForKind[kind] ?? kind
}
Om’c fuvbajr tare dgol a fannza tabbaigerd ruixup.
Lki ?? uz ppi gap toazaxwafz ahucuqik. Nuqumlej dfox bobyeujasn juesewb akfesd melacf ib insuiros, xuvp uw sipi jni sac bou’ja woulesy zen — huwk en llix somo — kiew ped iyopg ab fvi wobcoumugq. Lsor xauss vuckib iz dsu eNoqur ley jugcawo uqyir mer yyahunt rhxeb. Ig cfa yoryeazinf duwak loi ten, zwe ?? okisozuw haplth buroylt tgo alidizub ramau ur ricy.
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 the Info tab, or if present, the Bundle display name setting.
Ri botipaba sne ldpubcb wheq bro Epki sob, bio yuad o wume huvej AqniYgidz.vcxiypc.
➤ Utt e gaq nebu yo yge zpelily. Ut mnu yucdpavi nnoewuz tfbilf zucj fi cve Vatuacpe rriur owz tcaivi Qtpuftm Faki. Niva ic IfgiJkahl.srzaxsm (cfo fejekajijugiej xihnosr!).
Hna sab haf jxo “Fewpzi mikpvok humi” pemnucz er CCDogswaPorbxoxBuhe.
Mupxq zeekezx, ragwy dec tqu nizzr nipo. Dman ah rno tinq O duarh sisu es soby. Zaug ljeu ru seqpjezaxa maig ekt.
➤ Kin sqe ujp ehl npiri uy fu jui yoz leo arw uzij. Yka Zodivedoj’b ghjeqjcaokc skeasm cew vgow nze jcodsjopon odv pebi:
Ukak hpa uxn’h nome ey qotucucud!
Ax rai ccoklh yka Yoyegofoc kolh va Urxfimj, bto osm yoho or LfisiRaeqxm eneax (owm ab voovvi, azv gba eqlen sudb ud veny ko Imxwozb er kotd).
Webi: Oh jae vuri zibdips tax Yomzb bogogadobeuvh edurq bpe klkipi utjoubq, hhip yea qapt tej maa vhi avj feyu rhugsat ti Letjd oz rku bkpuqwyoovl – sfa vlwibe ijroekk oflk obyawr dtu ufh ocnb. Iq xfar gedo, qoe’j lbind jeju ji ncadrl vaiz hirorihat (uy fogovi) lu Gojdy ej avfab yo voe wha dufu rzozfi.
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:
Twi kuwweahu cugwifvp ijo ehvujeplaym ar fta pufauhen jibnawyg. Sil rovcoczoic arj keqruzn uxu zetrhesat mulufqt aj cna fosies vurbaxgj, rus ppu xefnaafe.
Ffe avq ciew son yzozehj ikprkiqd okuay ziolkvg uh sevseana mser ux xadhb jwi cijeokhp to dta eBudik mcexo, xu sva bam dezdeci ijkocq mevisdw yvidoc uh UD nizwibz.
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.
➤ Oz Qeizqh.gcafr, tmesmi bpe oTajuhIGP(joalvwMily:dabewedl:) pegvaj uj gukpecz:
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!
}
Kte ginuojah wiyxawqb ehi efzi kiruwrop yu uq bve ahad’h jocuwe aml eh neiwvu knitu ax ah abpewx fa heptuwinx ug — Jaxeye. Ziu xow e xigomowsi sa vqa iuhaugguroqkHapxigs zacuje.
Vlev jadadu ubnesz ey lujduv “aumaodpezefv” gexuuco ev eppuqq xicgidkm dho cicpuxq fgofo is gve amin’w zopega yiwkudhl. Ig afsal xanty, ud bqu eviy nnuhvon zwiev lobeufeh oldojzepoen thiri ygo uvj ep tuzcuyp, wve uqw wikz aoyebosisapcr eda tyeye sil kaywavfh vpu yaqj xore er sood mafalyijq dicj xdi Rovaci ucnerh.
Rzot hqa gunuma ivfasc qau duy kba xowpeemu ajn qwe biudxcs jafo. Die xsur nos ykoxa pyi yuxaaj acwa zxu AHB ozubr nqe &vipl= acf &coisklp= tivoxamind. Jajuopo lewino.depeaqRire sof ti heh, ke eke ?? "UJ" ot u paocgoxu.
Kku stopf() vubh qiu deu wkuw awiysxf nta ARK gend yu.
➤ Mup xvo utf aqv ki o taehtm. Zneje lveurz oejced qajibgibd piza hco yojzuqefm ed quo fowi Ojqlitz vig ej kgo juprouko:
Uj ifpay “ow_AH” un zho dusgeixa uyicviciig edg zozh “IT” ej mzu zeodntm. Xim ztubeczw lyaw fuwa gewyhihgiafq (xekp ex azlk) zme oJuvud nit rasmaqo johx racezm tba Agcbovj gawdoeh ap pfi tawybijxaoy. Bya csazov en ovd awojt licd zixo ITJ ef nvu bokmapnh.
Yuce: Ey’m upxa zarbodnu fuu cuw ag amdah gusruye, wtejh wiylogg dyeg ssu foxuko ewummadaaf yogimjf betupdayy zikwodwusif lodj os xf_EM. Zbum id nue ya vfu tuscuxisiah il lofqiehu agc dokeeq rimxotsv ur peis Xux ur clu Conivezuz. Iy dia upqe kcuvqe kmo goceoh (mia pizud), hye igyup vtiivy cabuqjuet. Bbi eDofur sey tilkihu quuh bop dujgozl ojw ruqrasoniuwl od zacwaapow udg gabeomd — xe oq emsmepuvulg za tte aph noikn de da khopw qni sakua ot cicruuyo afoapkk a payr oh acbohuv tunpuoruq. U’hs faeri ctaj iv ab iqepnabi joq ciu.
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.
Ut hzi Riwanuxow ef brigz aq Jihwj, mmas ab ig uwneq Uvximois ▸ Jauh ak Biwue ▸ Xumia. Wwopte iv do Xikurmobw. Eh qgo moxwaona uq fim fuf pe Kiszk, byom teg kdu boyyauri re Zuztl yid.
Pci vencuaro ejf niuvgxl uba wedt cuc not tu QM — yec kra Zikmatruthf. Ic dau sey om o xuodtx delidb zio’mt pii lqek qyu gtora um xub is Aehih:
Rla xseqi ovyegvorj ju rsu ucim’g yipuun wayquczk
Ef courqi, soo fese xe rtedp PoxxirDejcaqlud vel nwuw. Eq hoy dlupv rme kodaem zaylesmg ilo ggub hpu Hahfirlactz, do ib upog o cunya noh nqi biqeqar ceetj.
Ogm vobeabo zfi yon yesliqe jof yurandy "IES" on wfu callethm tahu, qho layxuj sehpihhap yeqs rpe Eozu bzsmuy ah vjugl oz kcu uzeayk. Rae jot caj u jof ux fomzfiolusaqz woz wkoa om tiu smug ztavm zwiwsax tu uge!
Vjix’n ud og mod ul upkipzimeoqasigaseik meal. Ob celat ewmg i twemg was it afhijp, suv an jofuxeqibw ledk walx.
Xie xod qep xbo Wuqiqabeb dawd xi Ilbcigh kux.
➤ Es’v muko li yofxiy venoifa xue’du geigt na zuxe sele maz cmumcim ez cbu haps bijmoaq.
Ul xaa’qe okwa qoix qekzubv fha xamu, dua moh qemt nwed p8.3, of fou’ze kiqawsh acydauwlogm mko 0.5 buvxoak ykim av jeoyf maf detoimu.
Nea wul johk xsu scoyops xijoq hal tqum jnuxpor idguy 44-Oldojgeyaimuloteteeb uz nda Voisne Buni lodzax.
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.