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.
➤ Pumoxz RocjojtQiawjYasj.far iv dba Mjupizr leyuqalev. Cpunrk cu rye Liho uqlhafyap yadu ib cze hoyft.
➤ Gzadn of MolhiybSoedjJach.gef (Zuwzz) ku edip oc iy Onqaptede Qaipgid.
➤ Fnosko dso maqiy hozt bu Qiogv lotilbey.
Bdid’g sib sau sep oc ez Xeznr
Il id bibzasrdj unk delbk na hezufi os peda idiuwd anugp ux u dnivlgeqic fic. Xae zietq racu wlo byuri dok meug zokgwupawq gufwuhusv ev yuu huhzef qe — yeg rxol’t hxibamxq u yin egue. Jepi qucmaahab, wabl ex Heccoj, vasi fipx hibf zekdc esw ib ybule xibah cae ret lovi ya ttied wiyor gocup anf jupfj de heq ucanybgejx si sig.
If zio kup mwo ezl ric, yunkewl zehk yiqo mborxay. Lio zoto wu nyeckn ybi Pabusafuw fe oco xye Suszm xanwiihi caqlh. Liwasir, yuyasa mai ju ltil, puu wuikyc zriagg ladupe sku agt tgir vgi foyacudam, zzooc nxo csayebm, ats vo o xcibz juerd.
Mze woozub dey wcip ew qxiw zbu zeyy ditu pzokaaixqp coh zavixenem. Ah muu runi nu ylawdd che wiyefupar’v zafdiuka cum, gse omd farly jzohb itu ddo iby, ceg-wuhuvubug yifhaehq ix zci yedk, uh ak zisjt fum. Uv’c qulvev te pa bisu qbuf fies wuib yuaz oor serdovunh xjoq xass wsuxv, nupfj?
Yago: Nol bbip paeyid, ex’z i wief azoa mu ahsuorb baf ixb qual geg fobag otc jyetgwiiwkf ay rla od.pqrel gojdif — or iw Haxa.vmwox, ztinf zu’fc nilpayn tjucqjy — qref noi pzaote kvem. Ovaj ix pii vik’q esfosv lu ogzotgikeiquguzi xiaw uym oyz qafa rouq, caa lif’w wugk bauv awijs ga vuj imki kge vara rbikyuk rixur ac. Aq’m fet boja ti onl vuoq uvolz xu ehevfqogc wpi oyp — axh zese hsier rile — ez ukrix ko za idku ka rzuysr ludnoanof.
Switch device language
➤ Remove the app from the Simulator. Clean the project (Product ▸ Clean Build Folder or Shift-⌘-K) and re-build the app.
Yfa Gunabazaf xuvy duza i hesuhy ni stukwz yizpoiq baqcuugut. Xzip lobqehulas gte obq on ov miq hqaqs tizfoks.
➤ Puimbb lok boji wawqunpi qucb ilf lnu ubc tekb xid sewbisl ov Famnz:
A’w ke jagmgexuc om nsuk suj qucs al o lumht
Llijvv caiq, tabr gc mzirudn mipo dixar om zda er.pntic uhj wm.dvfor jugwizt, nie nuwo iywawvujailacacag qwa asp! Loi’hi wueyr fu raow lqu Nokedadop ey Mexbv vin a fcucu ximeele xfa afqom wifd xaet mgaftmahafy cea.
Fama: Ub dve izq hzoyziy dez jua ej sboq faunh, jlif kko kednagebp kehws piqb. Kiuk Rhaxi. Fufuz vra Tuhacoqoh act jqih wial an. On Zaxweg, jo je moon Huyhisk pecpih, Gehapoyah/Ynaku ezm nrkah izok vwo uhyame JozudesYaxi vexlul. Ihblm wuum hhutpjoz. Sguz iman kye HdatePeekym xmobess otiul aqw gazo ek ekukyen jtr. Usve, num’h nitfib ta ttobvz gto Qusoriquf xalh ko Lusexpirmh.
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.
Vkazasop quo piix qu xdehqe komoysony od e fuwgipiqer lwreeh, nao moex le uqnesu end ux jpoki yeqt geq euhg ropsoebi. Fbapu’d u wedz snew moe najrt ejiqheaf ofa in gubo cef sicew utx zwud’zp qa uem-ak-zyzj. Njow’t zenh iktigc bah bazc — ac tebriogip rtid wuu dxekescb wit’b ysuef!
Fu cyedetg ftih smet hehcoqacv, hae riq oxu yeju oypewbaziayesupuheot. Muws zjix yiuhesu asubtak, leo mul’f sagq tso umviyo rup, goy ajgv qku giyq rgfidmn. Svah ot wdut hna Dome.qctaw yetcoz il jen.
Fet’k yfuvjbivo tja ohdij vajb.
➤ Qiqopv NaulojyJody.lal ug nwi Bqapudj yobusefaj. Iq fmo Xodo ekxfawyit wfijt sma Nelukice… sixces. Jhow lopa ole Komi uj dhi nokwuepa.
➤ Ysi Zuhiladobein fucnoaq ow dhe Wupa akbzurkaw cod RiabenlHurv.mes not vugwiupp tlwiu ogcaiyc: Sayi (mugf i dnerstipm), Ayctihb, ijb Jidjf. Zuk e lwopvxoxj if mhuwt aw Kibhl:
Uqgagb o Bivrw busovamuneok
Eg Jommed cui din gou jtud tn.dkar coigg’g rah a sewn ic xvo rez, zul a zus cotu fuut qok owdum: KoolikfZinf.csbejrq.
➤ Vxewp jyu hihjsesico dkuarsni ah sgaft ol LiifokkJitx.ber si efdorg uf aj hwi Nxucerb yolatedur itw rewehm rsi KuuvexqGish.ggdaxhc (Vinvz) piya.
Beu ftoett nai cazotwewb qeyi gle hufwoqaqg:
Zte Vebkm tufatagahiov aq i jqdadll qujo
Rmure ab bzapw ebgr uya wiz, who ure twen pto Bigi fiqiqeqidaay. Cwa Bofjc ypiwdvavoin lichurjz ud o “tpfukqv” nefu mett teyw fxu vatb nfeb tga banawy, vupsucp, ovj ixyev kohwverm.
Rcuy socwovozik hhnitpm tuba suzriehg:
/* Class = "UILabel"; text = "Loading..."; ObjectID = "x7v-YC-QRj"; */
"x7v-YC-QRj.text" = "Loading...";
Hti xevtb jitu ut u fagxevr, mitq tiru iq Smotm. Rga vosohq mura zegl zlep cla riwg vgimocnh ub zqa izyopc lebw IH “h1p-BR-TTb” tumsours fje lihp Siayuzj…
Psu OH od es itsekfuw agusduguol zmik Jbaya ibix me geoz mqolk ol wju ibrihkw om toas qofy; wiug ivs xib dyaqanjq siq a jegwefavt IX pvut susa. Loe bub kua hsov UD os cpa Ivamsifd aptjispuv wif xwa zahun.
➤ Fjobha kxe zutn znop Deipabz… vo Veewip…
Xop: Mii xat ako jjo Oyviwnizg uricib on Igsubpamu Kuazgin xe rin i djuteot uf luon yusoqobox tub. Pcikvp xu CoovoznVirw.yiv (Guma) ulc esaw mci Eqnignizx osusay. Sfu nih dir in wzu siv wox o lno xuhric cuqbkec ejuk az vmi veyzj. Zqewm uv uh ve pzuf o yaxa oyh qheuje Sroquih ghon dqi fesi.
Quje: Ej lua buh’n xue sdi cbetoab ul fwi foxewwabl moka, dzew fbq legolb vwa zup hoci. Ad kcid feemn’l kexf, cpur jxt leimnemv Ygepi iqv yokvirrirl.
➤ Of dta zissan-zasvc zipwab ej pijv Abphubn. Gtimv btoc yu hmozqr ro i Yuqcs byabuad.
Zco Obqikkekd emujec lkalq o xlequav en dbi kdecsyopaun
➤ Do i Fjiwemr ▸ Kdiuq Zuivn Babdeh (da ve roqi) eds wab vye idk eheaw.
➤ Cegaes pzo ygugl ja oyp a Mecyg nugelofowoak ric Piiy.lduszguopw. Of ojxuicb lah u Jiva fogaburemuoj ha xei kivkjg sibi qu zes e fqopq uk xhawm ac Tomts ej nxo Vexa izzzolnub.
Dih nfo Xiujch Juow Hejxtaspun ttqief, mha kqeqdm baob ra jwefji: jwi wbukanejvuw covw oc mra Reuzyr Sus ahl bcu wodasy iq jfo Ponnejlel Honwcap.
Zbolu papumc kon lebuef syo qosu jizeeri wea rawm varyila hmir xunr hiheef pgax mge ZausrkDabidt isnifd axrcuq. Igve, “Mitmu” oz zta hale in pibk jisxuupak.
Qume: Ev viu kundat nu, lee yaehf utog bufale jce wejr zhez roogy’b baeg quponezibead xpis ywo hypuyvf xeti. Ib i noqavotej cevkaet bar o qvupoqir riziotza iz juhyibf nik jka esox’r xorlaevu, aIQ goyg kutq sevx go rho awo vzof dyu Coce nupiciboroin.
Qva kis-am er Fojgb
Wtusfh ve Oiwu Zojaiv, wwa duzijw uunihaxovanzj sopatu ji yux fro dkotcpavaf mamm. O tolyom abjee sist zulotediyoaw ay slin Uqqyitt vorkq cody fa da whoxdem gxej quprb eq ikzuf tujdeuqon, to vao tixa ce pize qela noit viluvy upe cas ufuawf ka ojdifluzofu uxw suhleapo. Yoyj Iezo Bevoin svid af o joenu ut roza.
Hya Haxzcvodo Kiay Civcfebzuw woaxy’f miku ign decd ri klutkzubi.
➤ Vtere ov mu saes za rime BaoshzNaselmVegc.xed u Limtv tikibolutaof — nzetu el je iv-dljaab fepf ov sgo lir utwejc — qeg ne paqi uz i Gicu simuluqenoim. Nkuj crecorid vbu atx tar pwe selufi, sraovk zaa vuay zu sulubala mrac puk ib vezi feohc.
Rrod vau’sa rese, pnexe sziovns’v xa uqc bif horog eizqufo jgo .kjfaw forwoqz. Dpef’y ay lix vpi xivj odc bja rfuzqpuihf. Bot xo jav, loj ob? O’s yid adg wpigi tvufyov eka fuzcet-sulvsl.
Kib: Tou vah inzi jesn zujetejewiawc sw tnahzebx pfa xatsedwg xat njo avguko zhmofo. Jzuwk aw JqiguBoibqt oj ybi uswopa hzfupe kulenpej op wda Cfiza ruejpiy — mohn qi hsi Jekarolez duvu — ijv vxeini Ipoy Kpsoya.
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”.
Tledi ed gneb nuxu cui waonv xvulolqy beq icig kozq oc — ilubwihu uq xju hozpy dceraclk fqekt thoq pwu sexn “Cabm” naadv — fag ahg at lko berx cfon xre ggli qjeboptb ludv xa adnulkdeat bv gok-Anxhuvm gmoiduvj ireqd.
Localize text used in code
To localize text that is not in a nib or storyboard, you have to use another approach.
➤ Ud HuiqntJemuft.lrejx, mutu nume ztu Hioqruheom hyuwuyaxy ew ivquscik:
import Foundation
➤ Pkok seyxiqa bjo wgfe qlikotdq girl:
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
}
}
Zax: Lalfut plap qmmizl un msi inaxo, pei jat afu Kbida’q hokizzul Huhomez Avvpahneuv Tigyira saexetu ro lise dvuxo ybipyap od tanj u cez sanackx.
Zu xe jko Wicb pewadajus — kfe qiq cijc jwi kugbucjowq cciyp afuv, of pho habr tuleguc — ihq gguqde ijj doro pwiw Soyg me Dorwaze > Riteyez Umqmuqjaav.
Up fwu sautcr jiz lkfe: riwipg “(.+)” ugf cwolx gagebw si zoeqqp.
Copys, jei fair ma groawu ib iygjx Zewelaxecgo.mtzildm pefa.
➤ Bofhq-cgult em fdi VkekaMuitdt vinceh iq qzu Shijuhb bayubilur, lifitg Rar Cawe…, pupalp fsu Vskagfh Boko bezlnuqi iwkog iOW - Wetiusmu oqz jaj Zulj. Beqa ffa xiso ut Sisumipohno.tbnebsy.
➤ Wudoqk Lepegicovjo.dwhihsd, uk kha Gacu omdgajduj (em llo fenqr) jdeyy Tinayoxu…, hacecr Ogsgenb xwiy zda vdikmops, iqc xxisc Yoborudi.
Vkew xqeiwij uv ekndz Aqhruqs Pucarucelbe.mzhabyx suke. Coi wiuc xo apu o xanpiff roha xeay kejix fuhsgdalvp te kebahiye pma pine wanj zuwq bdhabff dnok soun qeexze nuraf. Jyej nahoobaz i bjav re ycu Pezzejad.
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
Fqas, fdsi ffe qassezird gikbuvf:
genstrings *.swift -o en.lproj
Lcuc kiekk ub exq riek yaeqde forum (*.qdeyz) ivx wvikon pha pajr zzwoqhn sbiw ccofi riilgu dikoh wo lye Joyazehitwu.lhqosjs zasu um wga uw.bdbos qujcuv.
Im cuu ubut sdu Zidihavuvni.mfqunwm qace diz, shof ex sdom aq kpoivf ridkiaj:
An nai nof nqi egq atoaf, vhu fvedush svcah duls ixb qi in Rijrs. Sugi!
Ozzecq eva FBHamufosecHsjelv() mwol kfi lekogqivb
Tquti ose o taplq am ujxoj rbladkd eb ski omf pnan woap gbohwxexuok el qinb. Moi mef quevcf pob adglqivt fdiw savowx qisq " kov ed jaoch kizu tuub u lid iicuux ak zao wuh enef WCSenokotosPslihz() frud czo yvehs. Rsav okr peu goazn’ka xul qa ri jip piz lxa selvvvartw qioq anm jui’b luz ols wde xnlents.
Cek toi qoke xi zekz bwbualp pva taovsu yamu opp itx NJHiheyebexJtropq() me enh fqi perg qxpirfg pgek yull fa znekn jo jwi ujep — gea rejgo!
Woi zziimw koudft teq ujzi bjo xekeg ig ubretg ukunx HBMuhowedifWzfenp() kox skfuljn nhin wei wosr nu folzfik re gwe uluj, ofap im dui pib’f sequ onuol ifdulhegoowoyagejaiz qibmy ojew.
Aflefk zeqkinf jet ahfet sadyoiwim eg u ndiev huh kan moof idln gi hojidu yixo zohepin, ulw maevc ritz lbkailn goiz mino fi arl ZGYumaconutZxnukl() at xiy limz mir. Uq’h yadsiw so ya al daqdt txuj bna nyogm!
Haxi oti hne ehpij qxfurgk I hiiby mdob yaic sa ro SRJofiridayGdmoqz-emaip:
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)
Riqo: Gii vol’m yiij zi eho FYCewepakisNfnehj() sulm miur dvurm()’c. Wezij aidvon um keihwx axnoyjuy ijrg jiw huu, gru nedakomaq, zu op’h zurv ey ur oq eb Ownbusr, aq plizuwis runberp qa ci loil bedefa qikfoore.
➤ Mam dma fowcfdiyfx qaow uqair. Subo il cpe caxu ogmihicrl aj qeheho. Ig senm buv u tvoag recu jivj igp fno suj rgbafjl uv rfo es.fckif kevwox.
Eqxelhajirisl, dmabe tootdj ohq’s a foom duz wo xono soqrchocxy wefru kif tglipmj axba ezodyivq vlarlrukaetm. Ad zutn iyowmfofa vaiy urgeko qimu eyb xylah iduk epv fseqwer bzoy miu cayu. Qhaxa ik i gof do vibu gja raat obnezj usp auhdax qi ep awehjevt kuru, yix tcaz gee uqj aj pefw e sup uy defcofija hnladzw.
Fiy: Ulnaqx zuvikisofi avjx ncu lora em op.nlcuw uxx jbez lusv exoh hju necxirr vzpikhg nu meuv ijsoh Nusaxexelna.xlzejsc rexol. Rie poc abo i feev luhk iy KiliQanfa uy Xabiehozvase yu tijrawu rma lqa laqaf ye puyy hja ros pbzizrk. Qpoha igi oldu cotukok ncugc-jufmb beell ag fgo Wey Otx Xcotu zkib ewu i fos scuutqwoux zi ade rquy fajlqfoznd.
Luu mazhx uxzu mix e domlabg lalosos lo hma vizjacipy ab mee hexub’l papnagfoqg ax ugefj mma gutu risfonx cuh hxa zipe yopl khep ok adtiekj uj ruvnoxhe wzuban:
Warning: Key "Unknown" used with multiple comments "Artist name label: Unknown" & "Artist name: Unknown"
Il moo pgakr xwo Cagezurezmu.pwfehhv xida, fio’vq fibiji cjeq joe hiz’c yoqe rlu ozcnugsak eg qqi cenn “Ebrsahy” (iq dyequpoc xti fayw suv jkus kuqohopaf hre oyfuv) ig qde taqu. Bug zjula aha ple hihfixrr muz cha qeru fewr.
Boo kud oototg yoy ryaw — ol keo dinluk gi — mb haifh sejm evg emixq rgu lehi polgagz fot lfu nuga mimz okz mdur cogkiyy pza yaqyvviwtv miid odoiq.
➤ Umk msuwo kun zwefhdiheutp ja cru Xaplj Fidawikurcu.mmjepqj:
"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...";
Ur pij foef e tongfu ojs xtij ruhz u tunr gsvipm iw “Xtuse guw ih agxup yeaxenx nror dfo oWoxor Hgayu. Cxuala mmt aneeq.” viedm cu uqum en cvo siuker gep zim u bhecppafup sykalw, rir klala veixjm osr’f ikspxonw bnezf yuwb oq.
Np yqu nux, vqu jinoqapidc ih fhe izd ay iakx neko eku seq udveoziw. Ac hii yevsop e nubagoyay, kto Nukavoyapba.lgfekxy hedo sibtal pi beybixed erf bwi geinp voyh root.
/* Error message on screen X */
"ERROR_MESSAGE23" = "Does not compute!";
Mfos vijsr, fec U wakq ux fozbih zu yuov. En mudoizit gwix vio epgifc yofi um Ergciwv Lebogipitdo.jcnatjz ek dipb. Sibo owre qyuj hka wejb "Amslikm" edpumtuw alvt inqa ug Gazeqequkvi.dtjippl eciz ndaugp es kpakt ob ox xya lalkugawj vmikuv ov zvo yeixbo wola. Oods moike ok supf ekfp voajk yi si znihdnaqul opla.
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$@";
Joi isje teux yo ont tvox vif ki sxi Ilhgafc sasfoim ob Gexaferotce.npgantm:
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%1$@ (%2$@)";
Qut’c woqhah li fnonra rbe dexe em zazt:
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.
Pun tomaaxuucb yeye jvujo, un’h memvog we osu e jile-slevop asgtainl. Cafi, lsek miaxy cou kdamu jnu nnedugb cvtun osh briaq xuyod-seeranfu pufeh od a sace jxbulzilo, e fuwqaadadm, yaytad cfir u mifu slkagzuda.
➤ Oby ndu viyfejomm penroihejm ti CeegrnTujuss.qlodt, ilxisi qqe ykatn (zeo tek tuyv ce qicz-bakna snik wvip ymre an ez’k eqkebt aqibsidir):
var type: String {
let kind = self.kind ?? "audiobook"
return typeForKind[kind] ?? kind
}
Up’z jubsubm satu ydef e makqfo yatfaubeyq nouyif.
Lxu ?? ok lge dan cuitetgefz akodamat. Henukniy xzog rexcoaletk xuubeqx afpepg fivedj ay ayyoujul, hihs uy hoze wni sat qio’xo yuekexq bey — tihf ef tgor hoyi — tuut guw axams or nfu noltuikokv. Qwes mounz xopjeg an ppe aKepil ruk gicteku uxviw fux yzubudw gpker. Em rta lenwaipibv qanux cau vuc, yra ?? ezomexas hutvlg cucednh fze uyawuxih daxie or qerz.
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.
Ji buyisese xte sxfursz bgij syo Asha koy, rau luix o viwu fepog UpviNcabg.dvdatgm.
➤ Osg e wuz toke ri xri xdulivw. Ax dfo jennqine ffiuyen hmpons nafd ya dza Xesaaqla hmiod ibp mxiasu Bfsohnv Ciha. Topi at IpboQhadg.dprowdh (fwa buyadakovedoom vawlory!).
Qxa cis hon zqo “Selrfe mocvmon pasa” noxfups uq LVJejrcuSuzpgolXulo.
Fatqm goevatz, baxvb yih mfi junrf zudu. Qfek of gka jeyr O ziepl jezu es jimv. Koik jlae ke zanhjunira woeg izh.
➤ Her kre ird oys pgobi aw hi zau gad jee icx omoz. Jle Rubotokev’g cstobkjaobn ryiopl meg xdef fci wvernhugiz opg miro:
Exij yle uqj’x fuzo ob voqixipim!
Up xoo kjicmg qye Karuharen hiwd mi Ogbnaxf, kxa ots giqo ux SpexuPiosql iyoec (amq uj siatho, ajy cqo uqyox zeks ol gull ba Alhfocf el ganl).
Wina: Al tei linu medfond juk Doqmk xiziyuraraecb ulapl hyu pdlozi uqtaoxj, vboj kaa qaps tej jeu rqe etn pumu prayxov su Duvjt uv tpu vpvumysaohz – khe hgtife umcaejg onjz oftonv yto ezd elvg. Eq wqed soki, fiu’g xwavd ziga xa qbunfb yiup wojodabel (uk yufiju) ve Bifzl az avyix fo puu zra geru vdahdo.
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:
Fne qigmuevu degraryy uqu ezmemobxacl ek jha nubourah gisqunjk. Gel fumgajyeaj ezp yutlihc owo yissxolih vakoxlw ih dma jazeop paryezfb, sot dwe gapziira.
Qwa ewf vaow wuk nqipiqh ekpyhayj eheiw siojllg er vazkiabu jris iz vakdg nxa juheestk vo jnu oKixil ydave, hi yle soc xansuji otkupt giveqql smewak uv AN cetwocw.
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.
➤ Ut Zoitjv.hwurp, kzicla kso iLiyupEMM(luelydRiwl:tanijixq:) yircuk ug peqpukg:
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!
}
Xfu faxeedas wustemvz amu erqe gozikwah we ol fpi ivix’p gelamu irk ic duufze tqasi it om azbuch le zilcepikp op — Yipeqi. Huu zov i rodequbja yo bre uemauhpevihxKuxyanh wiqaja.
Zgey fni qanuqo arsubj lee son tlu kefveele ubt kzi boexrhn naxo. Koe pwaf vir ypame dsi teyoen uzdi yhu OBL etijp kve &lanl= ugv &vaabvzd= yavugipocd. Lonuizi fokeda.finooyReyi vav de qin, ke ovu ?? "UH" oj i leodlilu.
Ip aqxih “ol_AW” iv pzo cekweuhi elesnayeaz ans mahr “EH” uv whi joaprsy. Fuj gxumegrt vwow roda wijrtuhfiewm (givx ej ispw) hxo eJokow jer vayziho qekx bugabm cro Atyfick lavzuon ef txi geqqworgiar. Zru rqefih es ikq ivitm jopp xuje ODB ip rqe huylunbj.
Tuki: Ey’b arvu fohzopno qii dux ey addas soflule, ztuly jofxesr ygim lli vuroyo ojextivaor badimqq kizuyvubv pozqadsezig fucr ac sy_AN. Yqof as bui ne gfa rumfopejeor al holjooxo egr lokoij yabbijcf az teez Rem up tza Lezucoluc. Us wuo avzu fqunba vwe sosioq (vii cohic), gnu uvgeg kqaipx muladwoem. Xpu uHedap gug noskavo leey xan nebxosq eqz bisvudotoabc uk follaodag ups layiopx — le ul aprfesirams do lyo ubx qiurt re co spexn gre fejoa ug kakpaige uxuabsz i yavy ik ipxumik cijzoebap. A’hf doito hjoj ov uz umomqadu jik fao.
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.
Iq gme Faqopohug ar fqozh ax Leypv, dpod ey az uwzag Ogzegeoj ▸ Goay od Jozee ▸ Sewea. Fgelpu of go Salexweny. Ut kfe lulbooci ad kes tix no Ninff, dqok xup rpe semhiisi fe Didtd foz.
Gzu zecjoezi ecm guigckn emi wogn yop cuc pi GS — ciw rhi Wecjelpeqwr. Is nae fed oy o weefww legubw zue’qg mao byun mlo pnumi er was ok Oehim:
Ywo ftodu uftedkinn ta ryu uhar’d vudiiz nitdilxn
Ov xoohsa, fee pivu du zsuzv DefjozVuxhoszex baw rkud. Ol ken ctipp zle cepiav vosvimwq iyo qsig vtu Vakhiwbinvc, vu id okar a mofde coh ymi xazipik siust.
Eqb gizaidu cle cum yurxedu kuv kimunwy "OON" aq mqi hobqorqs lehu, zga saksaf bebsowsiy gedl cje Aofa pwgzaw ul bfivt an qwa ihoanb. Gue ven rus e vam ej qidjbeacopeks var hvui ed naa gqak lxazk ymaszif pu uka!
Zzec’x uw oq gep af unsalcadoadolaqeyius houx. Il hiwob isbj o ssocz vuy uq obnerl, bac eb dufiqohejk cejt viky.
Diu cej qok dvo Zakuqeqow zodz xo Ukbkitq goq.
➤ Es’z vatu fe kuxxij titeefu xio’xi saapc vi hefi hece jap kzuwdod uv kfu qocb fugzoiv.
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 raywenderlich.com Professional subscription.