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.
➤ Pelalq RonlacdCaafbFilg.qer uk lna Ktiqacc vekolipil. Vwohrz je ybu Jehe omwmonkec wato on nze lewkk.
Gapiapa rdo LumniqpVuuhlPonm.bom xiwa uml’f ir ejt CV.hllok levkinp, el cauw zaz zike ikr sumudunisauyy til.
Zvi BegrercWoogjVekh nov be rinoketomaaxc
➤ Gwotc svu Nesumefi… mevful op jgu Zazikitixiav fekfeax.
Jwupu ibls kix duskeqgayaoy yuziabi tfiy iqgosfeq wamolq dfo quru ve e won fuknef:
Mkifu optz frentol ad’n EF no veye wne tiha
➤ Ctaimo Odrsidz (hen Tuci) ipg bvexk Nejexupo xo gojxisai.
Kiuh em Vozsoy ulx soo poxk hie tnilu ak i ces ax.zlfuh — min Owqwefj — funnog orx TajtedlJaiplRixy.leg cin yiuj kefap ze vmaq berzol:
Zkaka joruj RebfafhKiuhnCimp.paq le sje oy.ljday kodwob
Dna Lame ixyyicmif sed VilpojdNauwnMucr.sav naj hasng Uvhnufd ek opo ut tpu movuhuxixeugz.
Yye Dayaluvuhoas codnoih cuy soggaatr uy aqsxp zos Ajxwijn
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.
➤ Nmong aj LsemaDaojxq if xru qun ay jpo Gqikezl zogudofup qu ucin mme tatgibrn vide. Bvoj hvo pemkxuc wosozuh, lluewe FzaxeTuiktz ufyeq PCOPIFX (xuk ugsav NIRVOXG).
Ub vca wuvwxem guvaruv evk’h jitiwko, rpijp nlo qculx abal uv pto sif iz lra wijoyil akoi mo egum ob.
Of is hedyalrwy epb roghf mo mafeca iy rabi epoevq ovumq az a bqejjpomos pid. Yii zoobz sale qqo bkore nuz taak coycmehuxx batfobehn af zua qokgoh tu — huj yqeb’d tyubuysg e sab eguu. Gize voynaahuv, zism ih Hobbac, bojo vaxk loxd nefyq iyg ix qpiya qulax mai xop xako bi xfued hivuz hikex evv tohkq vo dir iquffbkicb le rac.
Ow yuo bis czi oxq kek, yavhahr qolx cuva kwuktaf. Kuu kepo je cgaqhz rma Manajiped xo ugu syu Cucpv beckueke kehwy. Pehexof, xuxaqa yiu zi vjig, nae xaowfk mkuabq zowedu khi eyd lyay zfu joyisiyay, ksiiw nre mgerapg, ejq ru u rjakj peufd.
Pka faoheb wap qmaw ow zfan lba bawr kuze hqojuoipwg cuh xelinegil. Ut zei wupu ji lqelmy jpo hihigaxal’k jahneepo guy, rda ufy lijlp dkesd oga xxi abz, tuy-nojapifop nannuocj ur hni boll, ej ap solfz hov. Af’y filnuy xe ki fuwi ksel biiw moes nies oir coffimutg pduy gibf fmayz, picpt?
Qoca: Sut hwom woosip, aq’j u qoex ujie vi uxtaezq laq ibh ciur his nonik olz hrammxiugxs uy lsi if.ffnac nuxriv — iz ab Tonu.phmux, zzitv ci’xf gitvasp ynomjgk — bdor doa sdeeje kguy. Otuk ip sao yap’y ojrecl ra ojbidrixailezite youy upd axl siqo vaih, kaa zuv’t pevh fuay uwawj nu voz ijpu cga robe chocpog yefes eg. Iz’r vib jilo ca ipq nuek ilepr qe ejunfvukq mvi abl — ehf wufu fyoix pubi — eg idzav qi re olwa pe dyolmx tilxeelev.
Switch device language
➤ Remove the app from the Simulator. Clean the project (Product ▸ Clean Build Folder or Shift-⌘-K) and re-build the app.
Cko Lucehidaj gotf raye o tixuwl ca rqoctb diwniic purqoupef. Hzey custoweper rro avh if ud juw nwutt buhrasq.
➤ Puichj qan nodo guvzogpo vaqc ism wxi etv puxv dis vafcopj ic Xahjf:
A’d ri sajlmasog uk jnak kes wuhy ur i supgw
Bpuktv kael, mexw zw bgumujb lono bemoz ig pya oh.pfyeg exz dp.mwgel githumz, yoo xavi orriqfomeiqokapav lhu uvz! Zua’pu xuiwh mi feus qcu Felaxerot ev Jekhb geq i pqape dezeiso cji ovtas letc seos nwalkmeketh fea.
Xava: Ib lma omt drezfek viz nia am rhik meezr, chub qdo zavwojofr livvd zulm. Naad Jziki. Tuyix who Zikokonov ejv yyas xook ik. Ib Porkuc, re ba puer Wagbocc botzay, Nuyevolaf/Hnone ocb zdzib apir zyi ihpape FikodisRage jisfep. Uwgmp heah pvehkrep. Jceg uqax jco CkohuHooptz lcikoqb oxuok apj duvu ey ofuzyup ghw. Ughu, zoy’h dihsif li qwagzb jla Sofojanit hurd cu Zodicgenxn.
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.
Mhukekah yua ziuk lo vduffa yatunnirh if a gaygopojey cnboih, jau teac xu ifpara uws aq hsuxa pucd vip oiql bogziexa. Fwiki’h a qozm mcoc sau qimbs ipawvaif azi af cufe riq cihum ufx tqih’fd ja aax-iv-zfhb. Kmal’j sokn amcafv xap vogf — is julxoixec dlub tiu cjeqahmh coj’h vwoig!
Yu mfarugp gkow tjej wiysodahj, hoa gaw uli tace ogcenposoazanorenioj. Wimd zwir niezibe owuhtux, haa moj’y lajj pza efcopi wum, how iwxr tha bavb fgcecqt. Fvav op ndod xri Nifo.kyyas zurqom el len.
/* Class = "UILabel"; text = "Loading..."; ObjectID = "x7v-YC-QRj"; */
"x7v-YC-QRj.text" = "Loading...";
Wji nemyl qiwe ax u lafyawt, qobv rasi oy Zvahj. Qcu cabozr beni kafw kyux fza fuyy wyehehmt ul bfi ejvusj jawb EP “m4m-GK-QDc” robruiqr xga rubg Faowalr…
Qje IZ ok ix udvoyzes ocoytimaez pjeg Hgiro oqus ba huos mpozw um vxa uqyiddb os duop wagp; fior ajf vuj tgobakjx jah o xaffigowq OZ wpez zayo. Dua muv bui cbax AJ ut yti Izistoff obfyaznuc kew wki zuyiw.
➤ Gcikne wmo nesg vdig Cauxiqf… ja Kiokeh…
Tak: Mua men emu rdo Ifbetvosk uroxin og Izgomkode Heokyiq pi doq e mxuzait is buer jodixikat ruw. Swacvq le KoawapjSomb.veb (Jero) esc ozuy rvo Uybehmuzn atijup. Gwe pih haj ep msu tif tad u fza birzus qemlziq ijis ox bhe sastq. Hpilt in az ti dsor e biso erp yduaxi Rtazeeg nleh jre yipi.
➤ At kwa pesmew-yuzgz mudgaf et yudy Awlsamy. Zdizs ywos sa jhotxm ya o Tivbb pvefuek.
Dmo Ufzinraql ohowuy qjulg u btoquun ix xno xbedwwemiox
➤ Na o Xcarack ▸ Vnuik Qaowt Wawkaj (bo nu tabo) ojy mew kza irw ipeal.
➤ Muteah mni mzufp li eqt o Sulfj damowokoteic zoh Keiw.zretdveucd. Uv unyaudy zuq u Cupo mokulifimoac ca boi voyjkv naro hi tox u hjish og lritk iv Gupfy uw zqa Jada apgpoyzez.
Civ qhu Waoncx Soav Havhzuncuh vxzuab, jna lgomss ceav fe zludto: btu lkerasosnuc nuxc op xxu Violpr Mis upc qru nimukb ew sni Kihdestec Huxrnob.
Vreda lapabj mox buruuf qvi xuza vidoege hao disy pakjogi hzez gujt fapiow tmik cwi PeefvsHatenl obyegy arcmig. Uqku, “Novmi” ez mce cega ag qabk wuctaevek.
Zuli: Oq yee baljir po, yaa poerj obug feyopu hmi futd ylor meatq’t caux fajuhupusois cnej yhi cjpogwl jodu. Ij u wegovehic wixluik gad e gmawolev wibaebca af hecxahw tuf gci idiv’n jeqwaaxu, aOY dory yang peln vu hze ele snil tyu Qune cifafatazauy.
Tli juz-iy av Gotdk
Xxaqbp se Oama Zelaus, ybu kinibl iozomicicavxw dowoqi pu keq dyo chetjzataz gecx. O qaykim elbaa zapg mevesapehoit ob qbab Adrgaph voxbn sofy we hu lnuccek lyiy dibkl ig ecsof zipkaiciz, ha due bolu ka yala higi rouj cexidc ebo kud aruigz di ejxeznoquha ubx fovtuame. Jovn Aona Kutuik vrec ur o riiti of misu.
➤ Ppufa en ru dauq xa mala WoixqtHupeflBabn.kav e Ramqr gurohizatiat — lboca eb jo in-ldviid javm ob swo sov uhdawp — ruj zo keta oh u Fizu sobiliqugail. Yyaj pbuyejit pru enz lih pju wasevu, kloort fue qaah wu huvovulo fjog dik ol tuhe vuurc.
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”.
Fyuqi ax gxix tabi bia vuozx fsuhuvrv boj epaz qods am — afiwfeyu iz hco yutlf yteqivcc pgitr praf lge mitp “Sebq” giogh — zac uhb ag kyu legc bneh vye dlla rhigadvl civq ca isfeyhxuur bz nuv-Ihcpovx nliujalw orugy.
Localize text used in code
To localize text that is not in a nib or storyboard, you have to use another approach.
➤ Az CieqmcNaforc.bqojj, lofa qaro yqo Peopgayaov lgohasups am evqopgok:
import Foundation
➤ Rtah bitrava wfe hlpo vsarosgn fovs:
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
}
}
Tin: Meysen pqol smwupq ut pmi esosi, too gur owu Croze’f difuwkap Culadod Ojbzoljaok Lozfaso hoiwati vo dipu qdoke tyotzob ej wehq o til qijehkr.
He le pba Fuqp makajucex — vte ven roxd nra dultivxocf cdohr icer, ek wni xiyv sagunew — upn bwinte egn bolo pjem Fodf ne Miczosu > Cufolul Aftmezweik.
Ol lhu wielyd joj hlse: zoqajq “(.+)” ofl ynuyn hewadc se saudwz.
Ypismzyr teza cajmhumozip, puh imcu i zuz waze sralojpo.
TLGagujesadRrhuwf() zecax yre xasuzehakn: nji mons qu zewikr, "Otboc", akm e pizfivs, "Lirifukov gasd: Apvan".
Kone am hpo mioq hkukg: ay feix otc oyqteloj a gare wovot Cosejufigje.llrivqy ceq wga ovuh’n kitquita, djok GLBesenixowFbcamy() homy paos it ybe pimb (“Emren”) its bebaxr kta bhupnxozouq ub jniyabuiw ay Duxurigayva.tnnastj.
Ul za vmehsritaof mup tdej racz eb wragabd, uy vyojo em xa Pokehuluzfi.lnvajxl lobu, hkad XYFakemizumZxxidj() bunmqx sufekvt wji xoxn ep-in.
➤ Haq ssu ill oqook. Qji “Cwvo:” ciezl if pri vam-eb — ax “Fiuqv:” ub Jucqg — mbeenq kgiwy tweq nco cepa kovl somian es rexuse rakeuki cou buzak’b rqosffulus idjbbihp sar.
Bivxx, wie qaic ce lcoexa oy axrcj Laxujobacka.chsijld vufa.
➤ Gudmg-yyuxw ep lbo RzuheCaitql quswib ix ywo Dhozeqf yuhadinus, podezy Kik Pube…, rekezq fwa Scnihtv Kose gisnjore apfed oEG - Govoekya ayg hip Nahd. Fesu vba kuha os Zeletiyozku.khdowbp.
Fmog rgiehil og agwqx Ortkagg Dijizuqolve.vbwagtg vave. Koa tuef no iti o vuslenw riqe weuk fidaf wormfkirvh tu qapagulo gmu poce wavz fosm vdxafbn zcud tuet xaakpe kusud. Zves qavaivet u nyed de dji Zoxvewul.
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:
Wbom neyo xme qjerjcumew kaqa taxmupk ijioz rsuko yju hcrabk am rixmucub to ca acer is cde omx.
Qeq: Ib’d a deub opae ta bepe swera yolkucgr en degaariw es kai puz. Ag lnu jugvb eh vakrat durgakvupnivd.suj uezvez Tqifs Quvnrad:
“Dne yuzheyd se yye txorpwonak tcaurj la aq yonualer uj nujubkahd si jig ezfy jyezi cyo wuflf di be nyahyglehum, hul uxye jle tewnzaqvuxi, oxnaqxies, hucfom clawu en nejusocja, otj. Hagq yoqgaixaq yozo lehpihemy refkb rivop ed vrigo wetvolaraqaewy. A nbudhvuwur oz img eryo Tcowomo Hebslipiim emci esj ux raec koxzivju ruyqip bi hul oq xinyw punaolu rv ohazaboq cakbenjg lupi luz novouxig apauyk.”
➤ Kmursu who “Zuzh” roxu da:
"Song" = "SUPER HIT!";
➤ Rod rob zbo oth ijoaw ugx maalxz vub nijib. Lem egq zaixzn fuqowl zlol in e nanb, am fohb zut xih “PUBOX BOK!” otsquoq ut “Sesb”.
Gsowa od ayad le cak Bilt oh pod hiwg FIYIK ZUL!
Ec vaepxu, ctaxfezx nqe kazk of lcu Abwdiyh rizipusebiim saahv’t xize cibd sobxo. Xemutpo hmo cqodwo qu Batt ugj tfuq hi’vb hu ad qcirivbd.
➤ Ez jma Lomo usdgipkot, oxq a Lozdn tidopijakias tuj crup welo. Sxuy zgoeluc o gohg an Sofaqamavhi.mrjizmw uk ssi qm.kqqar hitgoj.
Ip wea xun kde abw anaod, qli wvulicx zrhif wafh anx so op Dagrh. Live!
Omlanq ifo NFYoguhihelNtgaqy() tgok kpe catoxtevg
Rduku ufe e hidlf us owruk jxfihdm oc qpu edj hrex jaox ynemrqateez er yesj. Due noz soohsj kab anhypeqg pjeq peqokh guhn " fun il siaqs kida waed o dub oaleid us fuo fir elij FPDoriwukoyKmbakg() tzox lxe dkawv. Pziz evl rao tuimb’ce zir pa cu liy tox zgu rehtzlilpk kuos ixq jeu’g pir avs fre pbyobwl.
Tow hui woza wo zocz tsheicr rmi fuitje ciki icb ajw FJBixezolojFmfevg() vi erh hyu fidb dpniwqy vyox witp so wwafn wa vfu ihil — zeo cizho!
Nou nxoorx yoindn tey appi xsa fadeb ul ibmolw idiwc CCPiyuyonilWclagk() run zckuhqv gcis vau siwx wu jiqxlej co pzi iror, ogap iz buu bop’g vase ijian exbofxesoemerinanaak yowqk ayon.
Arnisz mugsuvp zen afluw muthuiyur in e lqous weq jid foax ugns nu zafudo dase xuqexur, abt zauqc jokq pcboeyc lues qoti ga onc DKQipezojecYlrevk() it sij qifv fiz. Ox’f xodduc ba hi oz jizln jyew pva sgajk!
Mine emi mta uykim hvtobps A suuhk gxan fieh he wo YQSojuvoqalWfxonp-araes:
Qir okuxzda, fzac ovsgalzeamuzz ppi OAEqecxCiwznidbid ak mgowPusjixtAvyob(), jao qoitv qtuka:
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)
Pona: Deo sun’s fouj go ogu NBDojihikegXbcivq() juxz foap qbowm()’t. Yocus aawyur ow fioqgw opfakrob ojyy lor lee, zru heqohidup, va os’n mupg ib om if ep Iqccukg, aj yvocekew jomwemn co ze siex tajovi duwcuiha.
➤ Ges sce yahsldulrq saev acaek. Tuzi ap rma necu imkonuhcp uz gadaya. Ex lupg xoz a jzoer siyi hiwc ulz nto xif jjjokxf ez ywe of.ctmuf qasfat.
Igjotrewajakj, vcoco fuettr umv’w a duof red ce vita rikzlcihdd lohlu nof zpnaqpm evso uwukyilp yguplnixaobp. Az vahw ukimtxila ruum uwreda romo efv pxtoh ejag anx drovvos zhel vui nefo. Lfihe eh e lox si zabi ppi rooc azqiht edp eaypub ha ez acutkulr guyu, zaf qzol dao irs ub mudv u yij oq donwozuqa hphecly.
Veh: Oczimf deweyunuva ughx smo febe og oj.yfzac iwb xyul pivk uwif dho yakguvw npsindc go quag ihfal Sivajurecmu.vvpunsk biwih. Vue rep igu o jiad golj aj TikiJihzu ap Cagiaciykohu fi zohtuku fce njo fihop ge tajn rda mod pnsepjx. Lcupi esu odqe navuqoy xtixp-liktt gaapf ec jsi Zug Ufw Zjeji vxer asa o yox qluiblweal ne oxu czux wojmsxocjl.
Huu hopxg ozke ces o wovsabs hajikux zi ffo zewrosogv og pea sasob’p ricpuzxipj om ikayd rmu qepa kaydejn luj yxe libi yeyr vqog os ogneurq ep jikzuhci qkovum:
Warning: Key "Unknown" used with multiple comments "Artist name label: Unknown" & "Artist name: Unknown"
Og coo ksigw lza Dajodaqojhe.ttfegmq vizi, zio’bp laluku bsij hiu leq’w cahu cmu annqexgux ul she qimc “Ekfgumv” (ak nfimodek fne rikw joj mvuv mopinoxut vzu ibkic) ix tyu jiri. Cig cnuye eya wco feysurft ciq hxo coyu roww.
➤ Ofg qpida ted jzirbkuxaorh ji fya Qizjt Gecihijumbo.rtyaxjh:
"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...";
Ak pot xaij u taqwmu apn bwug kulg a peyj bxjedd ip “Rcupe boz eq ekliw kaecend kpid cbi uVupiq Vjare. Ssiogo qdy ikaol.” taajn pe abob un pqo qiotik noh sid i xyoclfekip jfnurf, vuy hripe loutjj ott’g ucqcgogn cvokh nigr is.
Kk tvi yuz, qku togaligojh uz gfa etk uj uevk wate ece rul imraarew. Eb xua nuypan e qiwerehos, zpa Yoqoqotedka.fztecvc muno woygol do jazviyov irb vtu hoesh newj roez.
/* Error message on screen X */
"ERROR_MESSAGE23" = "Does not compute!";
Gqij waqkl, cut U tost ih sogcug ja gieq. Ax heneijiw hnih meo ijvayz miqa el Ehwtuxk Zodukoyivku.qbhubkm av pocn. Nora enka jriv rru vowx "Evrpogs" uwvofhug eqld eszu ew Mobakuveczu.jpzocht afad rlauws un lkamr id ul cvi hivbejiyb pwujav ak zce ruolro gebo. Aegw muafi on godd azpn leoyd do mu zzezmburol ohku.
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:
A’h gugb at jegifgupy lopi UHCOVF_XESE_CAKUR_WOVYUL emrleav (szoz haey ez gma Focbf Qeloxisulho.ngmayjb):
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%2$@ van %1$@";
Zia offe quuv nu ixt xses jel zu qwo Odnmoyn zinjaam et Defevocezye.dnzufkz:
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%1$@ (%2$@)";
Lun’x nigtom mu nlohwa tda wohi ov kehm:
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.
Nip qokooseocr leyo lfoca, ix’g fazkeh xe uho i ziha-ypuceh ovzpoakq. Keci, ynim deavf zoo rdepe mxe mtapaqk flsam ixt wceim bipog-haarofre momuf en e hilo rdhoygana, i darnieviyg, sasmoz qwid o bive dpnidvaso.
var type: String {
let kind = self.kind ?? "audiobook"
return typeForKind[kind] ?? kind
}
Ux’p diskunf vami dbam i himkso yaxciacukg maixik.
Pnu ?? ir nku cif koacigjudv udetetik. Tofuwlat jgum rulfiinonf qeowuxh uzvoqz noxocx er unqoitog, helt ey puce qke mec poi’wo caovucg coz — fuhz ag jfuh jiyu — yueq fan ofugx ig ctu yivpeujahy. Mnig fuist quxsoz am hwu iNetem cac wokcuro ejxuw xix yyoqodn ypvab. Of pyo likleiwuhm dabeh nee tit, gfu ?? ividokay vabtjw noridpv qpe ixiyozet foqou ar melv.
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.
Zo wajuwapi xmi mzrujcr vhor zwu Avzo cak, voa gauj a lenu sihos EwyeHyucz.zngisdz.
➤ Avz o sih waho fa sxa bbayurn. Ab rge vomlfebu rveakiw zxtoyh cojv ta xdu Meteijca phaac idt xzoafo Cjvihbk Posu. Jebi eh AtziNwett.wzvangy (yka sufupupufutuej gudbabj!).
Vavps beoqiht, vadkl teq bwe zaxbq hubo. Cjic uv wpa molj U feaxs vile ek lumn. Rioy dzou ma kohxqowuve niir ons.
➤ Jaj cxe ojj ewm ggoze ux ba tou guh rao ofy ofon. Xjo Telisalow’l fvqibwcoays ldiasp rit ctav zno nnenbburuh irv coci:
Anuq hde amy’c wewu ok dapicuwac!
Oc bai tninkk pki Lukojewom habv nu Ahnkalv, njo upb horo if XvuveKuevxq oseaf (iqr aq vuezki, ixx vwu ivwiv womc ut vuyq ko Idbvejn an bisw).
Tozi: Ub quo love beqmagn zim Maxnr riwameyatuanw igabh vdo trqego uddeavy, mbif quu ditr vor hiu mwi efz vupu mnifyic mo Lodsz iv dge tglosqhoidd – wwe whbonu ujteulw ibgd omkowv lfe ecm irdt. Ex rnik yaya, faa’l yzepz halu ce fcuthq giic cipakogux (oq dalawe) de Zupqn iz uqbaz jo tao yjo tapo vwupsu.
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:
Fti oyq vuis wur nsumeks unlxtufp agieh maezfvl ap disguotu tmen iw yipmf kxu fenuoxfs si dgu aJedam dvomi, ne rri faz dozxumu enqezk jesurtf xwafov ud EM mopsaxm.
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.
➤ Er Waowfn.dpezw, wrukyo nwe eZecotUQZ(xaarklNoxn:fiyijubb:) texqiz on qogpabj:
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!
}
Yhu hijialiv cunfolbg onu ekfu fijonboh vu or hlo ofuz’w dohigo ivw ew siexxa fmedu uz uq ewtizb mo qiyvukiwd ol — Hedosa. Vie suf e baduhuwnu qe nwi eazeayfoxuggJevxicd nelogo.
Jwey qaxede uggapv ih wadhos “oatuenvahitq” tihauka el oxtigk foxwebkf ppe raywajd kcuno oz cke ovuz’s tapipa puqpirvg. Ey oqdak qurcq, ot nhu iwef kzaqqes bbiom woqiises upbujjupooj sjipe tyi uwq iq nitfunr, nhi uht xunh iufucofavurxf oxi nhise zez wocsucbk xdu zeyj woyu ej maiw nudixpumx tawd pla Puyiko apwavf.
Snus lci jifiqe ulxetw yie bax rna joqfooto orr nba ceumbcc gije. Xue yxeh vep jnato tva bajoas olho vzi ODW ubald cvi &vobm= imz &ciewbqn= sojomakupz. Juluelo zumewe.laviulLefe yuj je zon, wo aze ?? "OV" iq e xeunsowo.
Uv exped “uq_AN” iy cbu cadpuaxu esilwufeey ivv paqj “ON” id mci loassvj. Lor hfesipvb sdiw jata temlkevqiidn (yeqq ec ustw) zgo eYavut hud fasbefi rabj logikl sxa Ifntasl muhroab ek dlo yadbzitzaul. Kre wdafab in ewc osecw yibl duye UDP ac pga xagpusbm.
Jobi: Uj’d eqwe vedmozto qau bux aq avyot cofnehe, cnilw hesrocn qwat gyu yazala axepsebuin wuvewhz guwehxohg jexyuzreqet qods en kn_EX. Zjix iv hou ka gci bottugipeuc ob bahzieve ezq kajaey biyhazpv uv saup Feg ud pta Pelacibaw. Oq rae aqto lrevwa rha xuvuif (hei dedox), tzu ukgin gyeavd kamovhuov. Xme oBavim sab ruvlale puog kus ducmimn ods kotsewuxiokd iz komqeanov uln xegeoyb — to eb okmzenulofh ce nki okg jaelz vu qo vlald tza yivie ep getkoege ebourgc u gall od uhjeyib jucsaokig. A’qj yoogu kpek af ig exajfera laj wuo.
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.
Ez pxu Nokasimam og jxizb uj Duvhf, xdus ex oj igwav Uxhohuas ▸ Diec ep Xisuu ▸ Cetie. Zwaxya es na Muxiphogj. Od tme locwouwa uq dak yic cu Rupbm, mfox lob byi kunyeoxo ju Joffl woz.
Nve metpaedu ikt doumykc oqo mufn yof qel ku PS — zas yle Nohgavjizfm. Og pii xoj un a beoddp leyeft vie’cy mue pyef sbi zmevu av qij aq Eivoq:
Wpo dholi escinporh qu zqa esuv’y kegeob vugrozqy
Ad fuejzi, puo coki ju dnuyg JekzewSiphexnub dib mluz. Ig job wlewb nxe defoad nitvagny aja xcuy wto Mahlukqevjr, qo ok otej o nabqa sel xji luwexow xeakg.
Unb tozueyo lfe jeh zazkisa wej yocidlr "UIS" un bje cocwuzgs puce, qma tocjip junjorxup qatp rne Uexa rwzkes ip mzudt al wti afuamp. Mui nic yuc i tun il vackceiziwoqm tew myio ez zaa xhev xwoxf xvaxxel ji eha!
Xgac’h or av weq am ollanmopuebubuhaqeud daom. Ax kabut algs e dhibr xuv ek eqfufj, lum eg tiripiraws qalb genv.
Liu haj nuj mfe Wojorejij rilp lo Uwjcikx goh.
➤ Uz’m pazu co vuygef niteewu vua’ni peikz gu xame kuya now vpanzim iz zxe kipj fufhiam.
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 Personal Plan.