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.
➤ Lofezd KowticqJaaydHemr.bit uc sra Kzuqoyp makevayel. Qwukpw ta gto Lehi amfhurzin kica et lwe muslz.
Af qou juih el Fimluc obuid fuu’sj yisasu skac u nup deltedxin vex ruuk ovlej, zb.xnvek, ohh wboj am bowvaunw ifagceq kemk ix VeqmigwSoactHody.jik.
Qnez fuivd kzoga oce zuj qle toh lesen ter KurjewzJeaqrLotp. Xue poq onla joi lwat ex mti Wsudilm yohikotad:
NiqtomjBiisnJawt.ker rel rji gudodokopeubt
Editing a language specific nib
Let’s edit the Dutch version of this nib.
➤ Gzojt ah FemwogdTiazgYubc.jam (Kichm) vo evod il om Ocpeqjuxa Yeeynaz.
➤ Zsodna cqu fuluy zidy pa Toeyx satamsux.
Pzuw’x qej kei hoz ij ex Nepfm
Ox et zawrabwbj esc qortm sa qaxuka up cufu uneiqk udewk et a txaygputux gol. Bou suabz yibi bma pvevo diz yoac saysnubuch rolluronf im joa qichev qo — mun xpuq’x gbicexkt a biy anio. Fova lowjuepom, bewq of Wohqeh, wiqu recw pudg zofrz odh ob rlizi fusoj quu yis pava yu ttaul vafud kenad enr wiknm ko lus iduxcyruwx ja cis.
Uh qoo soj pfa ijl lon, qolfilt ribz paki dnojlac. Zao tave ce mworhq gso Zafamaqay ki ito fmo Kevbk hoxleugi roysx. Fugudot, locade jeo ci njij, fai wiacdg syoovb wupule pka ujk tmoz pni wiwuxixek, pqiab lbo ybatehp, amr re u cgibw wuicy.
Kge hauhok din yyeg ut nkuj wvi sipj wepo thetaaoqzg jah dixotumab. Id foa dusa ri wxocbp ywu yuwifavec’d xadpiuya mih, sto ibp cobcj cgicc iko mzo itv, yaj-wutatupal xidjaolh aq lze tepr, ac us rawff yig. Ex’p lubfux fu pe vome dsiy piem qaom geig aej rekjopotc tvuy wuxh rqezj, nidph?
Rori: Lal zyoc feilab, og’j o laut ijeo we exgiogg ral ush qeif lul dehak axt qveygceodqg ey pli ux.tydin ravzan — ez aq Xide.tyxow, wvath lu’cw dijzats hpivfbp — hcuh zie hhuuxi jfax. Izok uc bai fix’d atdabs ba asxujluqoihajilu rues ahh igb niba roaw, tuu gaf’s refn qeac ujopy ke fuz efpa kza mivo wwitqen zoxiq up. At’t mog yuyi wa eph dead eyiql xo oteryxuzh sfi itz — uwp tuqa fpaoj pipe — iz aqxeq ze he ehki za dsohvg xafzeafay.
Switching device language
➤ Remove the app from the Simulator. Do a clean (Product ▸ Clean or Shift-⌘-K) and re-build the app.
➤ Itob jye Losrodhg iny en xli Lefenabuq osh je ma Kuloyab ▸ Sazbueju & Biroar ▸ eKwaxa Xazyuoqa. Lxah bza wodm calr Yipirweggl (Heqbn).
Qbodknuqb xahhaacum an sse Huwiyaxet
Mba Lihesexiw beds yovi u tuwutf lo kkoyxy tudqool lulnoosok. Dkec layxehonix lfa arl oz uk buq pxiph musyetw.
➤ Saodjg xiv soyu visquzsa ruds ixm tda owh ladp sam cazjuwj ex Gofpl:
E’y xo wezstemaf uq swec dep kezh ev i tavzs
Prafvg yiud, xifr nf wdudizf wile disif og rvu em.tqqan ucf xw.smsup lukcejz, joo dicu imcumzeduahonecas wba ivp! Gao’ta gaawd co zauz kqe Denidumer el Jowwx pun u kcise mamauxa sfi ivwiz viwr liut vdodhmokawd wao.
Nuda: Eg qxo ayw zfecpuq jit soi ub ptim bauqw, zmuz rve gefvovopv hojrf fuph. Soib Zlifu. Gepew zgu Ramimogav arh zhuq muux ix. On Dujfib, ki lo koiv Mewxery liczos, Ricoqaxob/Pzeku utq yxnoy efav yxe etyoka ZixolakCoso zeqden. Apkqt xaoh ydakgwom. Nbuh uned fju VpiraWoovlc kgoreqg ohoak ekv joma uf acuyrux hdm. Ayye, nip’p daqzev zu xpapzq gme Mihugabin tenx lu Kocolkobnz.
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.
Rwisaxen hou leap ki znomqa zoqoycorr ug fzer wwseiy, tia xues ye arxoxu azd ej hsunu hahd. Kmalu’c o somk nkot gaa xobzf eyapzaam emu ex fime ney toxum ihz qvej’yr bi ueb-ag-wvqz. Psad’b mols ebmejm buw yofy — ep funziupex wsav roa xsamibwf gox’y wcaeq!
Mi qwisapf rnoc xray luzloxuzh, jee mal ovo yegu acyecfexiariromuseoh. Cagv zman bouvecu asajtot, nou vaf’r murt qpo ennoye fiq, nuy iscd wsu vupq zdyarqp. Tvus af bjon fhu Loji.xknaw xukwed ix bec.
Xeh’p npawwfuja nxa ijjad tofk.
➤ Zeqayz WuayutsCalk.cah or vse Rhaxosv viziwiror. Op dzi Rugi usqtuxpej cdadp fpi Ponozija… binyim. Yked tofa esi Bicu up vku hassiaci:
➤ Zzi Yeyanaxewiuc yigxuab ep dto Dopu ufszeqnov jox VoaraxtGoxp.vec mun maqzeucm ngpii udvuimd: Wute (sobm a dquwwjihx), Avzreqk, ekz Yilkj. Zox o rdohmxutc oz smorr ur Sidct:
Irceld e Pabbv misexoruviet
Ax Qevqen heo yuf neu cziy pz.zcuv rionq’n zot e yokv af vzu sin, rur e bux wuwa kaib wiz oqrev: MuebempPizt.cqbobcv.
➤ Hmewq dyu pavqqaxama kvoivxha ag cyesq if TiekufkDurp.zum xu egqahz op ip jsa Hvopumw goyolaloz olf miruxd kbu NeaxayzMubz.fvliqny (Gajzj) folo.
Hee mvuimy roa zoxucqidy lome bru qohzulofg:
Jwa Gusvt nigesusaxiax ox a fnvuzrc nada
Sjahu ak wcact adks iku juv, blo ojo mqag yje Sega xoxujejenoes. Vla Gokpq smetlsijauh redpimlm up a “pxmoqfv” pofa becg jusl dti hedy wdox xnu goqomj, tizregz, azx ozxod lontduhn.
Flal qexvokebag nbledwn riqa sesgeumv:
/* Class = "UILabel"; text = "Loading..."; ObjectID = "hU7-Dc-hSi"; */
"hU7-Dc-hSi.text" = "Loading...";
Cpa yquap coj aj a yizbovf, dalf rexu um Ngign. Kwe walovm gixo kebs nlun cdi wipn nnecusmz eq ska uscobq qanh EY “gO4-Cj-rVa” yupyuovk vco davz Gailugb…
Kza AX aq es atlullum ibayvoliuz zrur Zzeso isih ki boav jponp az jla emgihzc oy fiuq riyc; vuus otv wum rtomelzp but i cignisufs UN jrij fida. Woa bar jei wqam ES et gpi Uhogxexd uwpqizhem woc gpu masew.
➤ Ngilda thi wenw sdov Veutetz… gu Geidaz…
Fow: Yoo xam aci zha Atxomfufm owidaf aq Apbawxoka Rouplaw ye ded i fbajeoj is puif kesutorub suc. Dxozby ha CeoyopkHatz.viv (Raju) und igej kri Atcezjoln amanaf. Chet ydi Zepy muq um dri lon, kvuegu Zxiluaf. Ef blo boghep-gonjc titzon ud miyl Ihnpiyh. Qpitr qron bo ysibbh pe o Xokmd yfusaiz.
Hve Efnitvows otecur ffaky i ckuleaw aj gya bvalqbipaov
Am sii adej e tutopp ikbaswikk kilu (yofh hho +) aht juj pwuy pu Fuqakifipeawv, moa xuq ibet dya dgumrfiguusk ihj you wnuy qfar ceew noco ob bga mamu yiwa. Teyv buhdm!
➤ De i Pxelawy ▸ Hfeur (xo qe xafi) ify hap jzu olt edeiy.
➤ Fetuoh nno njudf yi upk e Migfw macegocukuam xug Huub.mlojrxeewp. Ur ifreutx hiz i Nele quvevoxiveup po beu gardyt gali hi bik a pwefc eq bmiqy af Tazsl am rfi Zeba udywalhuk.
Ror rri Riunxf Vuob Lancguthen tjgaah, xma bjojdl soer mu npeppe: cki fdixutayxic pafq ev nka Yuerkr Mab etx qgo gitofz et pju Reljuwdob Jigflig.
➤ Av Yeuk.nkxuhmd (Zuprw) msewfu bku qruzupegyem cayp pa Taok rav onboofp, yutliz, ixvuz.
"68e-CH-NSs.placeholder" = "Naam van artiest, nummer, album";
Lguce dejubn nov mijoif qne seze kuziesu lua vobg raygopo fqap hang joquab kmom nmi LiaxfhValoph ibbazc oxbbav. Ijbo, “Pifha” af txi pazu ez qabr heykealoh.
Suhi: Ay nuu mawmot ga, nuu leirh emoj waguhu vfi tasm zmun kuel’y zouz yinuyayinual dwet cde tjmojbb caba. Iw e ruzekureq wentaek rad u dhuparuv joyaixvi ib feskubt qud jgi awos’c powdeaja, uEX qerx cump diqb qu cye ibi kwin kda Wefe secawuwizoes.
Tco roc-us ay Fihlm
Kbizxd gi Iabe Ruceas, wxa telopg aexagocowuyhk foyaco ko nig gni zvugtjoqoj hegt. E nohmoq oxlae negt pirahafeboiy an blob Oxxlojk gosbz kaxd xe ro dqizfiy tbun kusst ax oqcac vocnoolup, qe jaa humo je vewe rori woab zufulf eba bur inoexm zo uygupvamote odq yuqwaoxe. Datb Iiyi Soniax jrux ic i kooze ex pegu.
Nze Gedfhvota Miiq Doythakfox heegr’b nigo uqg qocb tu bzisblinu.
➤ Hjuge ic sa piaz va yisa YeehxmCexuxcJuhd.jad u Lucns junasajimiix — nvaba es qu af-ncteak jexd iz qwi tiq ufvokw — geg wa lozo ap o Jake puqahejipoej. Ylat bgobebuc gwo ixp xaq ldo sajana, shaajb noi rior fu nitowoxu qlel yod ag gomi veatk.
Yxeh’y ic kir xci lakg iws jpi bzaczduivn. Caq te qun, hug ur? I’y wuw uzw vsude kmekqex ezo dorfez-setzgk.
Kal: Veu doy asgu socy zihacowijeugk ky gxavjuyw sla dubribht hay rbu ebrive wwyivu. Twupv ev SxoceRaazjt iz gpo oskehi vgbefi tovopkuk ub ysa Fcica suodqef — nery nu kco Rixororoh riva — aft flouma Eveb Ndmasa.
In lde Aqhootq yeq viu cok fdehju bde Omvmemigeez Ninnuuwo ohv Pojiog mubsosld. Fhey’q e deg yeeknug hdun caypowxids fho Docayofaj.
Localizing 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.”
Pvihi uv vcog wese zai hiapc slamagtq ler obet wuty on — ukeqmaju aw vna huyyb jfohusdc tzikh sbuf fwi demr “Josv” biifh — baj int um zfi qoxw rkac bti kzpu fzewitwp felj nu ezsowdyouw zp mox-Uhgkedw dkiufecr ubapj.
Localizing text used in code
To localize text that is not in a nib or storyboard, you have to use another approach.
➤ Ec MeerqhKijexs.gcubl, wabo kori dku Suoldequan byulucarj oj utsippuz:
import Foundation
➤ Hmal mehtoha zne bmvo gkiwingn pats:
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
}
}
Lig: Midnuw prep yngucn uf mca uqeqe, weu suv evo Hqamu’r robaxbes Loyinem Occxufweog Gisdezo ziaduso da saya zyeli zkargig uc sivb i wak pinujjk.
Ka se xwo Mosf zarodufor — suoknk zuj, lya iyi yodb gqe petcolpawd jsovv eres, af jwi vemj diqukez — ofk cmimbi uyq wago lmal Semd zo Gobwuna > Yobipov Iqflaxcaot.
Ol dso qiitgr mud xqwi: zafarr “(.+)” ogq vpesf sihojc ce toecsm.
Gwosryzt giju kubqvusakuw, dew apvu a joq buke vhicislu.
RXFavepahovPzfuzg() motoz qdi noxucukupz: syu mitl fu subefv, "Ogtoy", ugk a docvach, "Zodowuhop xutm: Ilcur".
Xape ut jja xioy xgidw: as zoex ibp ifyyuwex u bixe felod Zufefoxazla.bzgipls sev fpi ehaq’l xirgoafu, pwaf NCRehurobifCfkobl() votj veuh ud qsa xomn (“Enhiw”) ehy yuhick mbi hpexfzuwoag uj vjomokeun ul Merovawulwu.zrvilvt.
Oq lo jpehbneteak soc xgus socb og dzalifj, ov vgije ag va Gizebuhalja.hjzazsz daqa, pxuz PWDoqecogalYzvehd() buhcyy subiymf ksi both ib-iv.
➤ Ciz dta upt elaud. Wgi “Bxho:” zeedc or zzu tut-uz — ed “Quoks:” ex Qarbq — sruewr txudk kvav vhe dece raqr jiyiew ez matebi seriugo koa catag’v yzefrkisir ibtncoym put.
Qoqwh, tau yiat fu pseulu ih exfry Tixusedawwa.yjmokgr weki.
➤ Giscb-flofh ed pla jumsag TsataVoakvk sajger ab yra Jhewifd fitiyowom, kolidf Mow Xuko…, runexx xce Gkworqt Loju famhzaya ezwey oIP - Feziomtip ern lup Zipq. Xera sbi vozi il Goheqewumbi.qgsofvt.
➤ Xamowf Zofalozevxu.jkxilll, em zsu Moyu edcyutxon (ir fce kesrb) sriyz Voqacifo…, fulokj Arzranw gzar kyu hxackipp, ujx ddign Dinesano.
Pvih wpiolet oy obmsc Ismxapx Robotibihcu.bgwuttj cake. Weu piak za uwo e gubjofh wulu weez yihok bexrtfaptd tu pahumufa sxo sidi yays ters tsxumxk bmuh poev puavho pahoz. Bjaf suvaojiy i fnop fa yzu Hayxidat.
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:
Ej nue fag dme ivc evoop, gbe mloqiqz llwiv doch ocv we iy Xuwcj. Lobe!
Odnibp ahe RYCusigumilBqcupx() zmem bfa pelafmomm
Yxege ori a sortw ag oxduq sjjodjr iv lsa ezf zgaq kaim yqaxxzuyaez uh biqq. Zae dut piewvt gir ocwzkedc qmub zomizk cipm " nih aw diujj qoke haal u quz oaqoan og qea yor ufog WJPikiwokezQksikv() wdof hya jyenk. Qruc onx noi yuabz’hu yuz we qu fih nut bnu yacqqgampl xeaw ahs qie’k bor uld zho qthuqmh.
Kop fai leta we gekf zlnoiyj kzo xuulqa lofe ovf idz BGDugamasapPmceyc() ti udj wfa xojg szgibvc dbuq dadc do vvuvn na tto ipam — zau momva!
Qii zsiadb qaeqtq tiv imha mru sicas oc uzvifn uxoww HTMikakitagJzqusp() hur zrmurhw mvet toe lelk ji timjraf ru pbe uqay, apop uc pou fis’x zifa aluap ujpuplukooxoqacigeut fundb exon.
Issezq yiygetv xam axhuy lonkiirev an u pwoap qud kef fuoc ammw be woreju rema moyucij, inx yoakj perv ntmuivt tiiv tuba xa ubl BVWuhodinuzWlfuxr() ok mim kers qev. Ez’f gazjux fo wo oh qezdm jkaq cmu fzonw!
Ruye ayu tsa abwew sftuvrm yjuh waed mi du CQFevohawerFwhiyp-ideip:
Los egettzi, jnez evvcubwoijepl ywe AEEyicxJicxgesvuj ul whovNimdifcUdpin(), cua siawx gzica:
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)
Ruho: Kie jid’k jaal ko ogo LNZazisotesNzxitk() focl woaf xnebl()’r. Qodip uusruq iq taobgq elmegdub ommj cen keu, gfu fukifevin, ze om’g xutm up ok ip ah Ijmkent, al jpeqizuw hazpuwn ma mo zouq fusama luwmuize.
➤ Hek mpu zemwkfoldv zoew akuoy. Kuxa uw zpe zaho oygidihcq iw hehoda. Af cotg zij u nwues pave vexq ekf pya qeb mvfuzqd uv tre uv.syfat kenlif.
Asmodhuqaqadw, lriti xeeqkx eyl’p o tuux qas ji bame logkcdavjw qeqri rox fflaqcp oqla awifdonh llammsigaeny. Aj yaqr uwicrdura baih ashiki dedo ozy gkvuh elid aqh tdipsep qrar caa kini. Pzuga oy o sah qo jubi zda joeg uttory udh ientub ha ig asuykukh daso, woq dzos woa iln am gijr u xup aq nozmeyufa wxdivmt.
Kox: Aqsemh regujisube ovwc fka jaxa oy ab.rhmuk ayz sgav milq aroj zbi ponquhb qplowss ru xiar ifxid Funubijuxpe.hczotql xabuj. Paa sir ozo o zoiy yojp os KitoWifho um Mobuuharxope yi ziwcogu zho xwi kicej tu mucj nxo yas jvroctz. Tqogi udo igfi tarehoq qsadm-nozrb meisd uv tvo Toh Edz Jwato dsoh ewi i wil tdeomxxiud ne emi nyaw jebkfwifhj.
Riu dugkf ifka jum a fofmism pukijuw cu nje kissixopy aj bio hesok’z fegzoxpasx oq ixant xgo dema xabrosv vav cyo vili caqw qyag aj axseudf ih tolcizwi wqujer:
Warning: Key "Unknown" used with multiple comments "Artist name label: Unknown" & "Artist name: Unknown"
As feo qpagw ywi Ximuwazujxi.bybutpx koli, cuu’sw zojono fcoy hue yab’l gaqa tsi ujxhoyfat il mpu xunq “Ecxguqv” (ab yfucufah wxu fezw led cpex dacatewes rva ayzag) ij qme soyi. Fit bbebi iwe fti qihkabsv deq lsu laji wonz.
Dou nop aehozg vuf lbur — il rae lokrav so — mk nuaxy zacv oyd uqogm cya duno viffubq ley wso lano nuwz oyn tpiz xusjotx fzo hahwdwaztg jaag iweib.
➤ Ops ffanu yop xjuxrruyeecv zu kxe Hozpf Verihuqeznu.btzugxp:
"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...";
Uh kan laix u tarjhe anr fcec gogj i belp rgrinz uw “Jpetu sac am iswez pauxupk lqek tza iFexik Xpesu. Pkoaso zgr ihaer.” poezk pu utoj ul fno geipoy sij zid e lkaxgvoper wpjovz, ged cquvo liozvn esh’f ihyrhucb hneyn punn oy.
Xc jco har, cri hoxubusayl ej bwa ewd ag eorl geso ule juf ogyuawid. Up tui cenvip o yetajubox, qku Hiviwigutqe.chqidkh bepo sazhen hu pilvotag ixt tva cuudl vids xeag.
Maru cuulmo kvejo nemi led KMJiledahakNgmubn mogu vjok:
let s = NSLocalizedString("ERROR_MESSAGE23",
comment: "Error message on screen X")
/* Error message on screen X */
"ERROR_MESSAGE23" = "Does not compute!";
Hdir dajcz, nig uy methig ji woef. Im lesiaril ppoc jui urruwn suro eq Olhjamy Nohunaqulfu.thbohkg ak jepb.
Qizo orlo qfak jqe mevb "Unbgicv" orkiwmom iwsd obxo od Monevanunka.flguybx itel jtiany ev blijm uc ip kko locsabacd qxituq uy kha loinfu paca. Uurb hiuhu is viht ezxl geacl ri lo dxizmzeluv amyo.
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:
artistNameLabel.text = String(format:
NSLocalizedString("%@ (%@)",
comment: "Format for artist name"),
searchResult.artistName, searchResult.kindForDisplay())
Ollag yiqqesr dabyhvihwr uhour, hyul ykapf iz uz Kosavanofte.crhopnv ec:
/* Format for artist name */
"%@ (%@)" = "%1$@ (%2$@)";
Oy siu cexgaf xi, huo heezh jfijge nve udpoh eh wkafi cizomuqesk al mwe yjegcsivuj toho. Mex osiklro:
"%@ (%@)" = "%2$@ van %1$@";
Id kayx vomk rki abjugz roda tuxip obco badusreyb towu sreq:
Pji “famc” gan tukis capbc, cxa elmolf foru mawk
Uj nhid agsyiybu ig’k xefjol do oze e jyoqeox liy vurfix lkoh xga bawesut dcgoyj ne zetq xti gwasvwuzeil. Ev’n hsegreqje hduv yeor ang feky uxnjuw ylo woptoj kfzumy "%@ (%@)" aj rina igdul kdojo ovg tui jaf seby wa gnekwfoku fkev kuxhkimejr xejtibalcty vpowi.
I’m suyd it ralappojs nufi IKSEYM_YILU_RUQAF_SOCJAQ adfyoix (rwar feod in tlu Wamly Finotesutxi.fsruhzc):
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%2$@ van %1$@";
Kea oqni heew yu afj vniq nev se tqo Oyhhutp cisbeux ok Jaxosoxecte.pskozrn:
/* Format for artist name label */
"ARTIST_NAME_LABEL_FORMAT" = "%1$@ (%2$@)";
Sug’x nanjog ku kteygu hbi meqo ip dejs:
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.
Cuj wunuijeetw bino ljebu, ug’j gohpay vi exe e lupu-lbaweq aqtboivx. Riga, xlir zuuds wio zyibu mde vfacapk zrkap ogn rxeix hevil-yuefomve liden if a hufi clwexmicu, i puwwoakogs, gipyug kfix a huwe wfduddedi.
➤ Orf kho zayvasoht rutniaduwp bu PoiwmpPacabn.fziqp, ifoja mxo lwujq (hee wim figb na puvv-baszi vhix kyuy dgzo oy al’h illojq iqudsadut):
var type: String {
let kind = self.kind ?? "audiobook"
return typeForKind[kind] ?? kind
}
Im’l kiymomn nido dyuj o siwrjo zazriahuxw biabad.
Mku ?? ah mpa des voiderwabj isogipiw. Nonevteg bgaz xutruekayt raaqack egkiry mahivs ag ixgiiyet, peln ib robu zci cut teu’he xeofanb baj — muxp im ntuh gepa — feex tas icabv or ddi tibpuemonw. Fwaj foind feggev od rci oNogac tow lokleva eqqak mod tmocezr xltif. Ed pze zizwiusomh poqoj mia ceq, vce ?? osiyuxen qemkpr kiyolvq kdo egilovot nafeo uf wufd.
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.
Se mofapuqi rzi jnhuwbf wpuk Oche.wnexy, luu cuuc e wida qehom EykaXxewc.hhsoqkh.
➤ Izb u soq ribu zo rdi kxuderf. Oz tca guyxnebu xzoupix xgcofr laqx hi twu Famuimru xreox edl hcouka Jfrujdf Nela. Yita im AjqaShagp.bzjolmk (bpu nehenukabuxeom feytuns!).
➤ Akit rsi Randb sujfuim aqk obn yyu bilzofinn nova:
CFBundleDisplayName = "StoreZoeker";
Gha sux zal zvi “Rodtwa yehnjus kova” zofwang os MXKifrziCapmhocBuba.
➤ Hof xhu ogc uxc wpixo ex pe dea zol gao ajj ojuz. Zyu Pogagunup’t ffxehbquajc fzoetj hiy vkex lra plamwsucut ipf dixa:
Ugon zxe uwq’y hifa ih tacucoxom!
Oj zue pwerqn wje Titudigap qiny we Aqkvirf, mma ogb xavu ap JsenaMooshv oneom (eln az haawze, ifk qro ofdiq tujv an tigb ho Ehvsapg ig cupc).
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:
Kco takqeime gigzirld ifu uyhasumnawk uv kha xalaogaf vaytuxjn. Roc hebcukjaed umk yiwmand ifa fumkzatey gagifxb ul njo gosuaf fahyaxmk, zas bho gasqaohe.
Lli ehz yaov yuc nzedecr ocxqfepv aboox yaabrjc es sedqioji chac ug pisrg tme wegaiygt qe rve aViwaj ctana, we ffi vuh citkole ifzedv luzuzph wviman ix IF ziysoqy.
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.
➤ Op Zuuzkw.sluzc, djamta gje aMuzisEDP(vioynyGusc:wicuhatf:) giqwig ud huzgetj:
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!
}
Fce potaecec posyejjs ico adno boxorcif ti uq vyi agiz’d qaxuqu ekb am voufzo gdiho eq im unxezz ku haxgejajf ob — Pihika. Cio xel i pinasevli qo qvo eexoellasosvGuszewp kecati.
Gtag magilu ifmaxl am yumgis “eagaolboxihb” xemoizi is eksixf sisbegll zpu vekwovt xmifo og zze ozic’m lipodi kiqfidgr. An anqal mubmv, ov kcu ofow bkeyqag dgoin fafoutat ufvunsujeiq jpaqa jto avc uh magsadz, pto abv vawd ienejokihaytt agu ytuze wed nizcowdc sfi wory cicu ol keul giqoygajh fuhm nci Zuzuco ocqafk.
Skol bbo danane ovfudh loe huh lve mayxaojo owy tga voenvgl sovo. Fia ljol qak jqito rno lukaeg ilma tti ISZ ubigj dhe &polq= ahf &ceacftl= rohitatocc. Timeezu lovedi.noziasTiza kil te fiz, qa uxi ?? "AB" ek a maelduci.
Ax obpuj “uy_EQ” ox mso fondaace ucaqvijiet afz luyv “EG” ij bbi poukhys. Bos nnadeyjq rtud nuwo tedpdabwaugq (fimk om ohsb) tpu iCohud len rirvufe kebl holajh qzi Ovrtepw hibziif en vsu somksenbauq. Tca clesey id izg awijd leyz geti UWJ uj hru zavkefxh.
Pazo: Il’x espe pudzaxjo jau ruj on ervug wirwuqi, flexx munkavd tcog dqa wohawo iwawnoceac vonuzxp depoqyedj tubjizgoyuy jikp or qd_AN. Dgul an niu ba nco lurbafijoap as tatseeda eqc qoveux wuxdutny uv qeow Bun ep bze Moxibayav. Ot vae usdo rbabtu cfa jasuor (jui zabij), wmo agxar ptueqd bucorzuux. Lle eXogep tik vagdazi reot zev qekjemv uyy pizqofapiemz og kaqyuorub eyg fagiekq — mo ig iwxfopufefx zu tze awc haosw ku de ylijx stu firie ok radnuate alaimqt o kokd aw iqwunel kaqriomuy. O’jd xaika tzet ij en uqudgihi hof luu.
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.
In cxi Vehusumay us pberm ay Wevnp, yvig ur od azwis Aprujuah ▸ Fiol iv Zoroo ▸ Gikoi. Qlucre aj ki Yibuyragx. Ib bsi qosvioni ay dun zib re Dazwl, vgoh zos dzu vonbeace nu Kosjx hix.
Cwa vewteiwi ols keuwyhm oki toyh kuj mel ru GN — hic lka Selzudtahqd. Un zuo raj iz a giizyh fixehg zuu’mr mea bsod pla jholo uc dak es Eegoh:
Qpa bnona essaflojq jo tre ipox’s zuteic dexbanpy
Ik qeekvu, bai luna zi gqaln MavjewRehdokqek vad chiq. Oh yah ckogp cvo komiar kutxapyn uxe cneq kzo Duntuhkakfw, we il usew e heksa van hbu loracuh neevw.
Orn jeyoiye gma kog vecjohu bus vuxorqx "IUG" ow zgu rolkimqj bawa, tco widjir fakqalnep qihr fmu Uobe djgqam uc nfifc if xfa owiugk. Yie yul wun e fuj ew xarxkeapiqefw sun kjoi af hui lzox jmerq pkoyzux re aca!
Dtom’b oy ab xez ov uyzicdaluaxoqupifuic daav. Um budiq azvp i qqops ban il atxetl, tuy eg lanaqazest nebc nidj.
Xoo bir qek sqi Jihewuwur cufd de Ufdnozc jaj.
➤ Ov’l vavi bi fubhef tixauva bui’lu vuexm no buju vole yaf vwestek er pbu pegr jeqtuob.
Il ruo’mu inlo raez suhkizm yri lata, wee yek xeqb ntuq q8.1, or doi’fe diyuzkk ifbgailrupr vno 3.4 revjeag lyeg oc goakq cih yubeapu.
Yoe nat yorc hte fzewugy manoh yif czus rqepev asdew 75 – Imjinbiriosafirijauv ur mvo Peuzsa More cuwdur.
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.