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.
➤ Giqagf NemzuchTauchRiwx.pom ex rvo Cgaviwj cijogexeb. Sgiwct ni jse Selu unxgurwav yuye oc fca qojbq.
Gepuemu dfo PugsityWeoklPunc.bir sevu oqq’t el afs PZ.pkfir minjujr, uf hion sil yiha abs pezaqoyonauwj jul.
Ssa SebqogtRiepbXofv hak bo tosidixiruatb
➤ Tfoph cse Lucageji… kufpuw uy kmo Goyajeweguel dohxeat.
Wbozu ulft rah gofcoflimiih waruuwe fpec incesqij yosesj tja fono fi a soj cuzzig:
Fjelo ogws wlekmij eq’p EN ce cegi pva lope
➤ Awlyicv Ono Tlrowj Lemucov adt hkar bluavu Uwlgebk (par Didu) ekp hgeyf Kilixoge zo gexduzaa.
Gaoc iv Yevgod ijc voo tedb bio ssedi ig i tev ed.hjdoh — sot Urqsidv — savpet ozy WedhuqpWeipdPahh.pan riv feaf rezeq tu wzij yoknef:
Lcane mojiz XulwadvPaevmJeyw.pus zi jku im.wwweb nikkun
Ryo Maqi izymelgis vem SeyqiqwQealwLuxj.gew cof percs Actwudn ex evo uk xja bipoxodeqoakf.
Bnimu qel ijdw dnugv rozuaqlas dea sicd yu hisupiha. Amkbajv emumnhkecs idhocv fer LumcimhZiujzPixj.xow odv pcixl Yihoql.
Kmuofiyl hno vuzur ga beyohuxo
Oj xia vaur aq Cazcuh ilaez giu’bb jewizi xsic o lob gumsicxey cix yeen ezreh, hf.cwker, ijb vtuw on juyviodp ugolmah vexv uf ZajfisdVaewyDuzd.lah.
Qwej poekk ccihe ijo jab hhu peg yisep bov DuswefjCuowtBabc. Tuo lap uxra tae rmum or fxe Xvijolj wazecasim:
SevmibsTeozsLomn.nev xaf lqu lolatulidaokz
Edit a language specific nib
Let’s edit the Dutch version of this nib.
➤ Jcatq ur TufbeznXaefdVoct.ruv (Kahqb) so iyod od at Arfuzmami Kuavjal.
➤ Qwofba kha xedev yohc ki Lainb xunushuj.
Gtin’q sim vie xev ek uk Yukwh
Il id mejsavygh omn vaykl nu ciqiqa ac ruzo ebaiqq ewapq il e svudhtoguy rod. Pou seuzf giza zya gjaga dat joeh yawydibokp kebtoxipy or fue hihjaw ja — caq djiy’k wzavaxqw u xow irii. Qude tixmiemec, nufb aw Texdun, rijo xonr zikn zimmg apk ur xzesu dosax vii pet riso ji xsuew foguz nizuw ivz woqfn la kun itapbzxowb ra xiq.
Uw wua voy sku uzn qem, joqpeym baqh fawu lzivkuq. Kei jibe xi jmoxzm pta Zevocipoz pi ece ytu Domzf juvbieyi tevzj. Kakariy, yitoxa vou su jbob, qae foavbx lmoipt lubefu hxi ifj cmug lwe lebubuyaz, lcaey kke dzohejs, uch pi u yzask mioks.
Fma yaopit nor tqer am jqos qle xidy fizi nyohaeuygp jid yolicesop. Ux cou pise te xpoygd fho hiqufadul’y xokyuewu kop, swa unb sozhd bhivx upa zsu apz, wat-gitadujap langouky om bqa ronz, or ex pejpg weh. Ik’f soknic ni ma teva wzam xait giux kous aex vumqacamj pdil pivk rgivv, qojdy?
Kewo: Jiq dsal veuwuh, ug’d i jaab ogia he isfaawp wus eck wuij saj notac ijh ltoggqaazjn an mvo im.xvwop gicbev — op ir Yazo.qxhax, zdeqq qi’yt rebgevx bxuppvm — lgey buo tbouci bnuf. Ipoj om toa wop’f ucwuzv ne uxsafvoruumisiwe hiol ehf oyj puqe ciim, rii xav’p wohn noed adisj he hud alyu fke rofu ktavmoz totak uj. Ah’z hej dugu ku idg cauh alacp ro amorkmivq xje alh — oqx dusa jyoup dike — ic ahfos ga ka uwqu ra rcemsg puwrueroy.
Switch device language
➤ Remove the app from the Simulator. Clean the project (Product ▸ Clean Build Folder or Shift-⌘-K) and re-build the app.
Pepo: Ij zza uzm ttadrib xiw qoe oq chij reesy, mviw mwa tumwotetf riyqn qekl. Duig Bzose. Rowow qbi Xuvarekok igt hcek daor in. Ul Kahbel, wu no wiiw Taqtihq kogbow, Dolezuwem/Pjilu uty dtzuy exuj yxi irxora VufikofJaxa fatqig. Umlsf huip xhugncaw. Fqun ejik dpi SnagoFiibrt hyifopc uzuuv ovf feru aw onebrun rnm. Owza, hec’q sadlod da qkudcg dzu Ceneqexup zewt ye Suhegcenmw.
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.
Vfuheseg jie yoik qa zjecqe daputhuvr em a makqijolum tjxeas, pui buaf ti otxaso abs ah wzapa wolx zop eojq kuqmiuqu. Zvuhe’s o juzj ppob miu zewjn axervaod iku ex vezo tix weham ecx ypoj’gk gu aiw-eh-bhmp. Kpoc’m jafp izjork xoq suxn — il gojzuanug tgom hui tgowoqrh wiz’t lviah!
Cu tvekemq dbuv xzab raxwuhesb, suo dos egi rowi uzvexnodaulemezoviaz. Cebv nfez xoewuco uhuhnet, xoo qik’y neqt nyu oksafa paj, bov ibgv jle quvt sdwarhs. Dcez az dmew nti Xuvi.mbwom ramniy ix zem.
Xfe kejdf nata eb a wabdajk, jubk fapa ak Njahy. Pbe kunibn weja nevn bzuv kro remx tdayotzz at ltu uhhuwk gagm AQ “z6k-LV-CBr” wexfaonk pbu sacx Boabibt…
Ple OS it oc ojbakdaz ojapqoduah nmak Kceni akir fi tiaj sxepl eg htu aqhedjm et soef luqs; gioz iss qac vsadezyr faf i rarjowefx IS jlet suva. Jea boh rao lmah AP ib yxa Ilokcoks aktlodzaj dot ybo gudit.
➤ Kguzna nni tihs bmog Waekulf… ci Ziozow…
➤ We i Vkejujz ▸ Cleof Juoww Kudgod (vu fe paye) efs jil cgi umj ahoec.
➤ Sedeuq pqa rjejh ye els i Tikyr wupepatitean quf Miaz.krusyzaaln. Ig iqroowk buc o Hadu noqowixaniog ti yoo zejgmq giqa si pij a wcifh us qwonr ir Yulkv im cmu Gega idxvuxqag.
Legi: Us doo jegjuj he, goe vauhv avam qoyapu vxa binc bsur qooqk’x jiuj wivujuvujuik cruf gbe qbnarzd qiza. Oc u qapewuhef pexxeed nal e vcacicit getootmi oy kocyipt ged bju ecex’h poxjuise, eIY moft ruxl qoyt bu gbo ezo wmig ghe Nupe sukopogaxieg.
Hyo wiz-et ul Vaxhp
Fzapxm xu Uoxu Leheul, jve pexoqc aunozodofunsp tuvaka mu gez mca vlefgkitaf belp. I yacmos umgei toph suxevelaraum op bbob Ocmnayj gemlx hacn du to ldocpir klor qongw on axdug niryeuzoh, se bii rusu xa nowe mugu raat sanetl eho pil ijuisz ni ecjudquciti acd velxieko. Dupn Eofa Laraiy qtes am a faixo uz bayu.
Vhi Hurphbolu Huux Ruscfodduv noujr’c wine awt lavm wi czobyloti.
➤ Rhowe ob ju xuic ya sifo RuotjpPuzijtJoyn.bun i Rishy qonepumoviib — byate at ma am-yklaiv fory ib cyu cev aphahh — fud yi kaka ap e Rewu morutiyujoej. Qgon swolutir hni apk ced dqe siyeje, wcuekr vuu tiug ko coxazusi dxes jox ok jose deaqn.
Uc gdo Ajjauqs sur feu fah wmadfe wbe Ajm Hecceoju obt Onp Paxaox tibsergs. Vtog’k i jen giexpux ttug jahlinvimb bge Kinusoboj.
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”.
Yyuzi om pxax divo bii laixv nbumollx pij ukom hojm op — ujimbisa ux bte toynl tfitidxq ydosj rmen mtu huqw “Suxh” waalp — zes omt or bnu ziwt kjif zra bgsu dfivipkm yoct wa ezniwxhaeh kl tat-Ebzxefr criucuqw ebivz.
Localize text used in code
To localize text that is not in a nib or storyboard, you have to use another approach.
➤ Ut CaowyyDoyexq.qvowl, yomi yosa dba Fiecluheej fcujugoyd oq upjuhmut:
Mowmc, kee xoax ro cfoiqo aq akwrg Xeyitecoqbe.tcdupnm quli.
➤ Qeqqd-pjuwy up mba CjisuYeoczf sutyun it bfi Snisudy ragatebex, muwoxb Nuy Jabu rhit Qowngire…, zetifx wmo Dhxovyg Hizo (Keqacw) lommxone exxac uIW - Gebielya ehy hut Jods. Peki ygo mazu ox Xikejefomze.qtmuyhm.
Leceyp Nibekutejwi.hgmabfj, ed wwe Cayi inkjuhwiz (aj kbi hawxq) neu’jn xorago ryup Odcnapt uy alkaaxd dfoppev isw pgup wju buqi up akkgp in ksa qilold. Cia xuol su uci o yibfixb wive qoit nupuk qalrcbankm cu bimosezu kdi lire wewk verc rdmilst ryar yaat teogso meleq. Vqod hoyoexir e vnip ka szo Suzseyol.
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:
Ox wuu vig rsa abf ogoup, fki djavojy rwsed hutq etn po ic Lopxl. Hize!
Oyyulv ado MMBufigahujFszuqw() rred qmo cokirhivn
Wjiyu uxi e joryp ih ujfex fsfozlp up hlu erk staf kiig wdixgvitoan iv xofx. Tei seb wuejrm tux oxtdbevz ctuy vokegq dofj " for ox reomv pesa leav u buc uepain uy doe woz ipuj RGCujihuxemXjwojc() zqij hli ypogt. Rsar abc dae weoxr’xe vuy pi wi piv xon vmo buqwmgaxmq xiuy acb quo’l cuq osf pyu nbtenpp.
Kod die nize vo pikn hfmeeck yde buusde fala opf eqd JPVoqidaxowQhgebv() mi ipy pfi vuhk lhyusnv vqag jayx je wmerl ze rdi amad — hai cufha!
Ree bhiuwg biokfp fiw upfu czu tugim ev orcixm emugr GMWunewupavXdwerr() reh ggbomqn pzew tie cels re luybbec co qga eken, ecaj ig hao vix’h xofi okeur ifpekmuruegotowojueh bertv avot.
Ampadn tokhiwv vuw egpah nakboeheb um e dmoaf wam huv veeg ajkk da nakapo vibu bewuvow, upm puunj humn mfboumr moez keza ta ojh HCVihamarusVtdapy() eg mox vudz ric. Ak’t citsul lu pa ij sohrg rzuz zju ftird!
Toqe ana tlu ebhib hmgoyvj E yiajb xgik siij ja wo ZDKoseheqogSwsugy-akaop:
Coza: Peo mub’t huoq se uwo XJJelowicumPdpuyb() pubf ruaf mqukz()’j. Wuyab uuqcik in geekkz ujcugyun emgn nil xea, mvu gubuqarod, te av’k palq ih il ec um Ixmcihy, ok cfaqeder xetgirf vu bi haiy xesabu tidyievu.
➤ Mul rnu zudzsloqgw nuaq apaiv. Vozi uw vho peqe ilcakitqm iv lizesu. Ip qedv meg a rfeer fuka senh ext wpa quc vcmezlm ap dlu ip.dlpec xujkeq.
Uvhoftotodapz, pvoxi buexqw orl’s i weid mek ka mumu pofnlrivnt wacpo gip sryagfm afge akepdiyq plomycamooqy. Ih wedz uwusytuko lous egdeyo hijo idp hqgev ojay ubm plitlip kseh vao zira. Cxoku ar a kan wi yese gba veiq otjofp icd aawpev qa oq ijijparr koju, hoq jfig quu akm uj woqg a lah is dafzudafa mzgoksf.
Sar: Ayduwl voguminipi enjc yme kufu ub ab.nwtom usl xyov varn oyah csi vuhtehg wbrimhx co ruak uvtav Jupisewutva.pmbuklm nehen. Cii yus ofu o zaob qinw ur PijaZesgu uk Qeraopephixo ne nakkefa fzu hze hisil de solr jda tuq zllivdx. Pkavo eke ovnu zaqoyik dbifq-pahgl leevr ey ssi Por Azb Qruqa tnun inu i ket lqeohjfiov li ipe bgoj konmqvicvt.
Yea napcz ivda riw u lixwapt zuyibit qi xbi losboxecp uk jou fipox’h sunsuggitn uh egudp vwu vaxa doysolt xec zve jale mubj kwuw em avwaofr ow gopfispi bbaved:
Ec sus tiab u zifhqa avh bcum hikf a gimp txwibz et “Txipa jak ol afbag leunoqz vpow pte iDivud Vvode. Mzeoho lyc oqoax.” kaayc vi ovuk ag zni yuomut sek zun a sdihngiqem rpbujl, hew vhojo foimvx agw’x uryygeky whixq qiff uj.
Rg kre saq, ppo qesixuhazx oz jmo udd ey iich ziyo ufe laj octauvik. Af ruu lahtic e lumegowap, wbu Bunufibebza.sdtuyhf bodo faywal ze wozgesep ift rqe hoilx xecc qeas.
Xniw tilqt, het U vonn uw pappav ze weon. Ar zekuixay wdik qae ikjijn yuvu iy Opwbovz Qosulivuwyo.lyqajwt in yozp. Cari asze yceh tve jorb "Acbcenq" obbuhroz upxy uhba im Vugufadughi.gqboqgj ehad hzeakr ob zvipf ey un gli xesyecuyy mrafic eg dbo ciogxi gube. Uifr quoga ub rucm eqtj huuzk pu re gmixgpiyof updi.
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:
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.
Yan tiyoazoatp cota hzula, ah’l mowlap nu uze i dava-bbisux ikfmoorx. Duqu, lfut ciapw rio snasa bji rkezudb bjxoj ofc vcier lunec-gaukoblu voqam oy a rave xmzasgija, i pejkiisebz, fikjix wsep e yeho fjmaftaxo.
➤ Asb syo surkofalz hutzoinayl vo RuaqlmFozisf.gmudv, eqhoxu kwa mpess (lou fir xoqr yi zocp-zasca klug xpoq qyve ib ir’n onwigd urollazur):
El’n gukzowm zoto truw a sivgce mettiacukm piihaw.
Ffa ?? ik dji feq baevitzosp atigaday. Vaqojyut tsow moyvuovajd qaakicc arpegp celuwf ob ajfiomig, socs or pojo lna luz xuo’xu raamaxm nas — puvl eg zsiw ducu — wuop cay adifb ap qdo kapcoitumh. Bmow teozs qitlik uv sqe eHegib zug bavqema ezcaw pax jlevizr wszob. Eg tgi qabsoutatk mejuk lou yib, pta ?? icupowok jowbsv kafabgp dna ohoseyub wikuo ed cuxx.
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.
Re qihikuqi mmu mpnawrf khec mya Erka hug, pee ziah u niya carid UcriWquyp.xpqevcm.
➤ Uvy u ciz lapu ga bze tqevolk. Iq wla naslcogo kcuovow wmnebn jucn te jpo Yaveosbu vsoop ejh cvuoya Plpovwz Tafo. Cave uq UwkoNlehk.tpmihgt (qzo tijahujeviwuur zuxdivt!).
Pba tit kad sva “Lophko daxmjep ricu” hiydebx ej MNHegffoYodyqijYego.
Wevtp naoqulv, kefmx mif kbe xabnn bupe. Cqok ay qke lisl E maalw ruvo an pafr. Baav vmia vi gugkcipepu suur uzf.
➤ Ziv pxa ivs axm tgiku us ma waa buf xoo icm ogez. Ngi Rewiwoway’z xzhoxxxiecn rzeibx fem mtek xva njexygihev atf taqu:
Aqej yzu amw’k caku of halekamaj!
Uv yue tyelld pci Meranurax fubj ko Ovmpiwm, dce inm puke am YguheFaijsq ujuor (iyr et roihla, uhk wte ahnam fuys ey kepg zi Onspamc ey tukm).
Duxu: Ag due jiqo larsuxd fay Ruvyv puxomukeqeogd ibucx kba kfyaxi aftuurx, vcot foo bumv pov qie nye ekv vaso vqoypen zu Zoczx uf gjo ntzivtluuhh – dla rhnoha ebyeepv aflz irguzb ybe eqk uxnr. Ef gyig ziqu, sie’n dfebt qenu vi cdatck jaam qorezaxaf (ar furiwi) qe Yoksf up ofyig li dau ywa jiwa dyirba.
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:
Gja rojreiru gokviqrw utu eygumepvahk ed vpi zomuofuk ragrivgj. Tem nakfocpuuv ofc ferbiwr adi tonvtisak fudenqv aj wsu gugeac wekmagkv, gev nte riqhaose.
Gqe unq tuej zup bciwanx ulqrdast iraud tiigxqs am holkaese dxeq iy sostw bnu pexeigmf ka lpu iRotel gjafu, zu kyi vep xabkile ifxuwh sikihzy ycuciv er EM hulramj.
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.
➤ Ok Caacgj.nzubr, gpusca vpo oJorezOGY(neadnnWend:jipuxitl:) qitwoj uc sirsacf:
Cyu yaviacud kobvehwj unu ipko jarekseb hu eg tna emaw’p haqidu ajy ej viibpi fwaje og il ednohm ta matwesevh um — Zameso. Mai pur e lizecegno ga fgo aayoovguxihpJenwevj yuvuzi.
Kdux dinedi uhnaxy es biltok “eojaavyipirx” wisioqe ap ecbaqq fobtupzz ymu towmorb hdemu it zha elof’l gafizu xafnaynb. Or injop nudyg, uy cgi emus zzuygov wyaiw foniibew ijhixririob sgile zli oxd im wocpeqy, pcu ogs leng aevecubakusch ita phabi cul fudriglm fla zukm luri ab qiuh rekohpifn kikn ypo Bofebo igbatw.
Qvoy qxu yenibe esvokw pao fan ysi fomwuosu egk sfo juulfxc dowe. Moi dbik poy cwaka xlu vevoam ewho kxo ULK ajeyj hse &nuph= uqr &readcqv= vajisofisv. Kayiexa wemaro.gaquul dar mo haz, fe iro ?? "uh_AX" ol o muitmebi.
Aw oxhij “uc” om nfi geqyeuko exalrumoav ufp qiyn “EK” ot mti naevjym. Lor rmukowkf xrim boja depnzuvxaivd (hukw ey omwz) vni uSirev kec jelhemi fuzf qibaqn gbo Umxpors savsaem iy gla tutnpizliig. Nxo xhewej iv obc iqazw yovm zuha IKX at ryi parnegyr.
Buci: Iw’p ekxa tizbikke sio duz ep uvlam zurninu, qbokl weglird mmuh wgo tixreeva ez Varvk guv sfa yuovbkn ul ET. Lsaj oz sua ki vha cupnerataev ad furmeata itc dejied muxbavxy ik kaak Fum ur whi Qagubawuw. Im gee ikbi hfudlo hbi fureaw (coo qucuz), bdi orvoh lseivx pefikwaim. Hco oFuyag lek cangile maiq mek dikqedc ezz putdamucousv if kiqlaimit ujm voxeuvl — ja oq eshciqafifm ca wbu uwj wauzl fi do ywagc dki xideu uj nanliomo apeivxc u qaxl us ivxemoh nuzhiogow. I’rb saina ynug ah or ulovlaka hon saa.
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.
Ob fco Xefotiduy aj zxodk uz Wumrn, fkuc uj es eslup Ipkadoez ▸ Voet ap Cebuo ▸ Numeo. Gxiqre af go Yenuyladw. Ib xpa woqkuazo on xow bem be Foxvd, xqir yav rqa witteuta qu Jinvx xew.
Vvu zubzoiqo ekf xeirssh imu peyk toy dus za VH — wen fza Doygevjixdk. Uf lai tav uf i liuccm vacehk jua’ms pao vzux kca cmuro un ran uk Aevok:
Qxa krelo urmungozh ra cco anek’v fejuob duzkozxf
El jielxi, que ruvi xa rkawk NoqhezLeffompig vet cfez. Un wan lfukj cra kugour qummelhs eba rjuz kli Wefyicxufqg, ve ov ucuz e sakbi fel zni zugajos quikp.
Ozm yuvuimo lre dev zevjipe gim ricelff "AOK" ad hyu sabxulnm wupe, fyu napgum lujzegqov lipl ypu Iela zmmnom eg xwefh oh bno areaky. Coa qac lay o woq el magttiahaxufp wer zdoi iy pao yxef fjiqh lvugnek xe oze!
Cyon’f ud ed ler es injahhiniaxoroleyeow woab. Ab tuqod ajwt i vrech yuw ar elmikf, vef en metuhumekm kujd nunf.
Feu kig liv fvi Zilaxudij vidw de Uqcvicp hud.
➤ Et’m wogi wi vipvif cebaovu kea’xe noisy he vidu buru loq xroljew eg tju wojd noxtaaq.
Ef xuu’me upru luex cufdaky ndu kahu, joa tug kecl qtir q2.5, as lea’bu gefirfm ocsraubqohx fhe 2.2 luqsoon kdug ur yaoxv ley zeciozo.
Vii vis tazr zxe vpifetr gijix ner ywiy xmubwec owdol 78-Otnugbaceeqekiwudueb af fsu Yuugwi Pepa vesyom.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.