From b83ea6461bb2c31b2adde6cf763c1c918fd0f95d Mon Sep 17 00:00:00 2001 From: amarcu5 Date: Sat, 29 Sep 2018 19:59:57 +0100 Subject: [PATCH] Added localization functions Added 'localizedStringWithReplacements' that returns a localized version of the string with special tags replaced --- out/PiPer-safari-legacy.safariextz | Bin 16279 -> 16309 bytes src/common/scripts/button.js | 4 +- src/common/scripts/localization.js | 72 +++++++++++++++++++++++------ src/safari-legacy/update.plist | 2 +- 4 files changed, 61 insertions(+), 17 deletions(-) diff --git a/out/PiPer-safari-legacy.safariextz b/out/PiPer-safari-legacy.safariextz index 88daf4403a95281a397594ae5ba3cb94c118942b..58af50d9efff7fe5bb256bff55fbc99442b4f020 100644 GIT binary patch delta 9604 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 delta 9596 zcmV-?C4<_vf0uuMcwurO02}}T00000000o^00000001Om00001c$~#r+mf5evVG?( z9DY^Ug5tiz;~m^V5=bC{1TQC`xC#)GKtk~Kr=)g!y4yXTGoFbv5#7;HMP((dl`AtV z`pbWBb@kzzoZF%~{PvOfjDP%)9AFa{hwQhH?neE@ef;l#SM19zJb%SLeE8Be@ctKF z!E+LJXwj#xsFSY%C%8`pfqpiC_z(IaxX(OI1z)DGpZm5pPhiJM!9p_r&pr9MIcHOV zRJBa#4N=Gp0~%(V zTb*@Y8@+7%vw0I3`4w7%t*D|c^jYBFq*0iOndM=BqTp|Y%G;QZ*(8pKsIw~4R6N}B7dWbl zsTi6-xQfvCti2Qa2tDrseuy-O#KNsp8H!WIwbw?ZSiwSEBSU$tRoCcXW;XB!bX|vA z>uIci5XE@sG-&r@td~8e=g=}YS-+H((UeQvlI?N(7%N|o?Zwt~nqCw9xfB?65v+!V zW{a3$_j60OEW7j!cVmyvMiot&dv=*}fm-{!+3}T^`zD(!Gsmiw0kafBTYA~i(A3i3 z5`D09Dp(UatStiK;vw3q$4H|05x~EH`NxNUFJlQIC}PH5u*9r9F7*OiZY~>t zl^(3~EC%NOEFGs+GjN%K`v*HH*V>Jw^gb9c+E)bETShbEj7ubu?bvN{JCD+;S#OvS zXu=RPmx(?Rc}om*o*4I|HscP%Xl~8ny!0{MAQGcrkuaxCGG3~TF$~@cB-=n(E=jtg zB6+htCAlt?ZqPB~%$oOUwlb+u5oQE`kz$MXn%@>B;gJVQ4-2BImVQZWt%i@z4YZq8 z<>HG5;Deue^;INvsbS_|JDE+?YiJuX;(;JGlp#`kNfKhJmj%Rm2j2*`J{1L{7i1y5 zL#MAzMU#bXCa#Uy4bD!H@B7BJ#TfPs9O9t5)q3BJ0xxFSSt}6BhdQbzhp^Yx0aky14K5(-LP+6?y zM>vRkEZEIZ*ak-*s5px8B3X-nd2}crw#?sIW4t9Q^l0>~g)J}<1`!8rzXwfA?<@%|c6pXKNyI>-Ba-FHMgb-|X#;Xw6&^A}%U$ds-A z`~dg)&(2d7GC z_}uU9axPP~8CS({mQTw`o5uu4T$SUY+^)A1b|)3m?t~qTol~@b2WDg^Gr8QIyn()T zGhCeVOLxO3aM>rO)|)t+G~`(B%PW|(FqZdjvx$ysDPvyNPbwXnpq+ALOSBWg-ltQ| zOc~lZ>FXi6ZHBI0ZY;{GR^?7ZS)smCrF*$>8y3nt?2w(vn#;M<3_mZnP?C(qHu%$V zMa>dH3qdHlmbrp|%5g8THL4?^x;9deLvkqjU#4#}?Vn^}#khxNfBK$DE?S=AbuHESF^W0MmU@wEf z-gzhj`61jnwCVW0Dm+rRtn|cl>Rv~H$I)WZ6seuOQAW&vl#SjRjhiKBxJ5K*&=}v0 zy(%2u)(zNSEgas~4cK2T9NyLq*k3IikZ=|+gA2Pym+&pRNz zJPndfua~vSUT*0{=jt-*ahE(VQ*9|={w_vLcXfmH>1ic&su%cBA|^MD71xbBSxn_5 z7f-pz)z{>Iwx5RA##74Dlf=3`b?pf=FJS9~e64PPSzLx`cq=?gShgrr@5F7ol$)(* zfpaHC;U(Y*CzwsOouzRepbwTW0?azC^=wN~dpF3ry3JiOwJ-23FZ_xk|xc^MNcYW0y1LI=SLKBs9_Cp|-qUbBCksZ{&K6ZJY6_fFNxd!?cdTVdKBu(Kd z4=VkCLzPt%$tcoHWT1Z-*o$J;tBv5!dGYAb4voiK(Pg{o+ZDQ&EEb zY$NO&Ny{*u^5ala>q%m$IkxAs^ex8Fv?DwWiJU#nx2oER~eqb!F^oeVz%Y z*``X&kZ3t<6-GRXc(sE|`tmUGA@I!g-s)8&Qrrq|^Q`4j={mgSmWrM(19-1ZP z=KNW+)?0eN*ekUu*-vvfGk%_XD^u7Tow})e!F`fkb0a?szdE}{q@CHg(m(ni+3zjc zAk4jjBP}<3yrb*bC_`%dnh(>9ii{ zWo$G3uG<}IWs$U?sbbShPz&cDl8M{3yq%m;BPB6nHo+#UFvCe+Jk9o~`a9MK$vG>r zw7*R3Xx^G>70`@4cl3g|y6PT|181)`kaELVpJ}@Vf$eM-(R>ndg)3jG?P}xU7Pqwt zCIH;-etynVfj?Ya*yg0L-0LX47q>V2)PI#B)Q}3qW3+O#hzvMuShb2-g)Y> z1m(^Hje4FDlBnZ&^fnf1Uql>35A0FV za}A1nW8~gjtqKLqBct36`8A3S-NNrZjlY|fXtVp_!HA4q0@MSchKMf1M{P%sPi>Yr z2J8L@Z=lBC4bsmGpPMJ_-aXwbD&*#X+(OsZ(~di*iniV*)={Z{_Q$CSV%D)T7rTOF z{UIV(7Fkbc06)Nf!zpR*FI9~$d1p+AQ_uIN%eI)pWcFF@6J*&7Q9?ZVrxkjgUMnJv+|;0Q!uG&jMSl>Nnuyj=E+X|)NfuIx2)jHi$hhufCnn-yl*Y}YQr=< z7oVym3*qqj=`Oi-$>Dwi{AK!h@_AV|9FwncaZX^@oQE&d$Nlr<_kF<2^UBA112%_G z1mHd&57}#flg~!)i(lJAGx6JV&gYX>mU(;B`ulM!1t{+IdFx}YN)B0hHoz6C6k>JcNMfa0t?vCLBaWa@Qk79)?7`K}n4SX~;u70Sv(DG{!laA^%nF;NO8eMY^&7fkD5F zHH*_fl?~#NMgACTn*K%Ipdn7g90dS>5h0NXLjVEJP!wv|I8*{81cmOo5dR0#M4a$p z3?O<@9;7&dREmc*4k#SrF#|Xj)uyOUP2+zRY65=;>pCnB|0vkZ&jXvF0rS(MfFcRz z*WhNDGz=jsAXyH<%tB-c#(-i{KBU-`W>5`J5D5j4icyvVCZ{)nF=C2 zjAf{x(AEr^7M?h;?vEKfDoz+facd zkjTKMa>(@jFxO}_F<`6!y>Fd=g~NZ@nO_)uc_LI!CSWZ;UgLglB+X-ly;iWwq1`Ds~Yr{U^%Qsw6V*Rn&&q2rZ_*~&$dR4gWOj_$vkj2(Cq$f&x zvl|k$5PuVzb{sN*VTKu?PJy&}6xJEk%Cbk21LW6Nw)v`wJAKpWZdZ4^r*ofnkw9;t zG>_$@)51*$fed2C<@(WCE=G+9=c!wBZ@q7W#j8I=iQw8Gf7zdm2gqp<(n}Hngm?=N z`IGT{fh-3h!K5SXA1Ve%CWbM z2c}!Qaeu?U+e^(RRxZiT_DUONEA93ejnI^;Ak{88+#LY@lnVw5y%eNnWUJk2w(%W) zDB}jBekz#&kLyIx{ftIX#`@d`RfQWfkcNjGu8OrPU>fDcVogJ;I8J!-4<;GLo|V8> zPk+_EqK^)4R^jJXFmr&-^NcdMiQD+T3SK4L=k^sMmc}-H$~^d11m}U`iP6X4Ia-8= zlAS^~E>(&a$J2Ydz>|n_iGN+%Y;(v7;F9CCkjt_0pum67NRKg%e4CppKwO@VVJZvF z1vh(SV)PoPCS5@t&A^0$@9L-*(f3%Q7k|zmuA{}4n_yE%R5BFB3U15#c<=@y8~p0o z=s$O!+jrB^m!D;f zvjHW+34d#I+cwtzu3tejZ(VXlGLjP|4!PV+?WEhxG}}z#ZFk1WdO#AA5c5_Nl&rY= z?|TjaQlu`nWxMarP9`!5f&k9_IS1g36k6n`RUCWcDh)ZyQf+LQ*E47*eoE)szuy1+ z6X*Fy`g=u7?hz-;X=>VkYwX5^(6?O>dU2vDwGKQwNn3JXyy3xJN^{D zuCJKEk)e?jA08UeZ(udTCsFiv1{XiG64p%%Lzj%rTa3lY!YOc$M!Hp5z^fb=;eQ?s zmZo(;U`*nJ1{ntf(=_2O_fdY<41eZ^*^(Ks<{PBm8z;Hm+Sv{hm<8op0 z5^SbDkfnp1Oe=AaJYO%T*&NiNt$&3Tt`_D`&1-^-B*lbsPg$*`*CVhTAX(82)C;PS z`I7WyuNm&jAXZ>rBi(^N%UGlhkeJs812^yzhd{3xJq0gQ({CnVvq>fzjdq9g!51+5 z!$V;G!S678f)ryXbXdQho#7>M!U|L^_+qGJd77o5O&nhg5Bvg_SoooJWdzni zXj&oKn@~?+1zC51X9cCdk@ymHkyz-ueq=GHh4bmBUw*qdd;705OQ`$75S?mTyEoI5 zOQ(KADz-Z*{QOGdiaKEJiGQSp%C46_2t3N>4oLMhOLB0o(I+I&=njz+yi|VK^kC(T zlbD5|ikHq9C>1Zg4*Q1wSN1o(Py6~`pTdRd>Qx%iLbyZhi=25w!>kZiC10rO7b<)q z>{Bo7`?{ttXTRgLQighef_J zN!18#obj0YpnZ*@g{bPrLMzY=WFq5f5&Ao0 zH+BP8Tt3zNu;L6>tbcs6ZuWJjoT(wiV&*L3Q@_5OQZ|`#Ump$z-_`aIIpD`&`E?)g zJ!uJgpMb{+3Fw;M5Bs_)*wKx_HF?YocVh$`6P#FhCkUWFX*1iMf@dkN^?uOTm*@?; z3kb!EHljlaiVwcCK{3K9K(N4GZzP{UbiGzYI6Oq)ur!y%VSj)=3VuR?erhbN$Qi$e z|M1jBb!uac6YxaM4Z&F?JB8ZG*r+vYXzV$B-H;A8t+;fuc!$)8DUhd^;54bJ#<&#z zzy~L1Qcy>TAGD>F$eTWJ*T=?sTDn|H%>>i&BQJCyfPra(z(5M(lHetVTKE+Wv8n9l z)W0T|ydrT*-GA$etACx_ECdSGUt3})yp=Mt!z|7UyvK0Nn|^UN$#m*<^fCc ztl%W&AZ)iSZp8)y5xC?+SC&@bwqUL5(1-$nbFuhDV}BX~0yA_6hyWURk;MTiY%#4p zDY7aD?_!0nE{w{3cAQ^%n`9lsT6K%;G2e_uG{Z^71-3>pO}oznC~Nb9!(4X8jeIt-B^wYN(*^=M`T=(6*eEb#4G(ZC6B&I!?$k|3sM zSuQ6n6@SQ1D_p<}PwkF?2Tfq=#~k;4%Shs~(J?58l>KpTm8S6%e}I zftQ0109*uD0iY(7QyNLNbcHXI(b22<=p5@-yh;3{(B1$!pqSh+$NGD)K%j*dh)M|9 z*Uj^MFZASGx_0TyzkH8c14PGkLZ?*%w4?RTzJHdrCTn=Dg4iAGrMH*CwC1tFWRU!+ z>%2gzLohF4HF?GWa22;0#yam|+zUbM#j}ekPvX%9$(b+^7?zgSl z9DirPL6G5JIjkPWQt-`qZOLayw3^bi8t4dj5r?I5NeSpxfwWkcxP z)uS~%MpJ7~=e5gQ-(sH$!Myt}*126vU!s<-oP+lug>5ZnO<`$OWF@jdK6S5Kv2iPx z_A)?4R%x#SR!POnipp0=rE;I>F+51~L4ToTUw4QO_P#vWU^6Oi&4df3VaS5sgaKti zmIN#6?-O;CIhp=tO6*wSWNBdCXP zNV#to{o9wJ|DvW&DzWtC(<-inS1Um$VtTVP3k zAENvDPP4UV$AkRJ)NdMzLrx~Rr=pY^Ofv1GOfH^-GU>|(`}Ot%f1~3r_8Y!f!+yiz zpbP%?5&jbh8B{S^bA+|7c>*LW1BR>jPC?_Eq(_7u} zJ&AgvoIm^tsfHDWg)*_@(Ozrs4zwbmm#`};A+BOxC)Zr%0d6q~h;cL;S@nNsaBSXA zuP7L>tSavpVrrDp*f=mD6B5>(cEouxYK0t>^s`mKdG?}7a_oXctSVh_ntu-q&714$ zx44?b5SVK}*rZo2W)8H$PFJ|q%MXtp;H#Y=1FK9{!MfpG?{;Qi%NYPpm%bw zP0%6MA|OYEg=r!Az2y2U3bDzlTQbc;86U@427Cvhacvy);;wM?3C|{zm?E<_N-4Lk zNlh8VS$OH9$m|ehCfPc4j*zbrE0K6tbW)E0Xw<@@STpGY_`#}0ntzRJi?&vAWYeHG zt0a4-J3mhrg2x|L7z8(;aU1!8^@oR+A9}Tp3KWODdr)4N#S*D^b2`X-Ss4Pwg4hoX zYyf|3d(QauU5J!IR07tfoixumUb)0A{&aXWx>I#?oeQ6)Ai|RZcpm~EACw{qq5d+X z1<3UyjcCaxseK~!>VE`K%ExvH>!i=4E%Y1>_O6HuiEJf`4@J2}wU zxS`Z=he&Z#tzj*31AK8V_HiI{`>~2+srF}C-Z)IYy2d=N5a>vxqkAHMpAxM<;UCIsh*cuMZ{_}w-b}p?)t!Sy$Z-T$J*^r>jVxYoPF;5sv zy-Dz*Nt(oES5Pa{c~!ftsK|0H{-ANTBHH^$%RTqakA|<-YNx}O>$TG(gktw`#8RMTr(k|8 zu%Cb?!#%-8?cUXf=^oY49U}>KZbi*1qRHa!+kb*LBGHy!*X1U2x1@V_5cR_ooMz`r zu>a+wWZV*U1CA7%1-8=leI+72OpV~BFj~8`Apnmo#Tp47XiW86V8gcPjNy1xV0GeB>%^OQTd- zvVV#HZ4KLzeC(M)i_E#bSutaw%$sNV#YH{u#RW#&i;FzVE7dH$!k<-s-<-VcRJbtk z4u_8rWP5PwUjO-pk6LOwQp*NJyy_H(Wa-G=SE#ZmvUR_E#=eg4;eJ;$lqZYR`pl#_ z39{7hwm49`J zJ@H-n^ou{U%(T76vF3UfAZJlON2zXiH+W*Adl2FXZCJn4p`}~w>5NRIH7N_&k`)Py zx|f9p^^r<3M6U)i8_wtsf;w*O4|;7nwz?$IX2RYva8#s5Y;^ z9UgL{^|1?x3=i;s^V7q_+{}IPIe*dIFjt=n$pdM7el27!VEmCdfC79WCBSb-4-v3uOQ@A>s8adH8bsXM!#iDc)>KidJ#WL*W*c#gtUJHMtZ6; zxH)N=j|=%}Az)Wf{gQmO;b7*OH zr=UsZU(hJ4?a(q~fR^yj*D>6Eqvh&Gn5wV-26Xk!!yBLhjqmVqF27Sc*y)%%AI+Fe z6cptkJgtTw%={oe&ICr?9`cNC5P40!^4dxCqacbo*L)>cE0q@ z&yMlh4YSXV`C2sm-&6B^_{DpRUnHKwRKTJ0w_mIi@D?1u`LKkQysxA~_$4T50hVXH mF-<3vH_bOH*0tE6MWu8P1{Q=V;HCPs5Ex>5z5f6(&QluIlC@a? diff --git a/src/common/scripts/button.js b/src/common/scripts/button.js index 6e555a8..10e0508 100644 --- a/src/common/scripts/button.js +++ b/src/common/scripts/button.js @@ -1,7 +1,7 @@ import { info, error } from './logger.js' import { getResource, getExtensionURL } from './common.js' import { togglePictureInPicture } from './video.js' -import { localizedButtonTitle } from './localization.js' +import { localizedString } from './localization.js' const BUTTON_ID = 'PiPer_button'; @@ -21,7 +21,7 @@ export const addButton = function(parent) { // Set button properties button.id = BUTTON_ID; - button.title = localizedButtonTitle(); + button.title = localizedString('button-title'); const buttonStyle = getResource().buttonStyle; if (buttonStyle) button.style.cssText = buttonStyle; const buttonClassName = getResource().buttonClassName; diff --git a/src/common/scripts/localization.js b/src/common/scripts/localization.js index 9d63838..6aa6295 100644 --- a/src/common/scripts/localization.js +++ b/src/common/scripts/localization.js @@ -1,19 +1,63 @@ +import { error } from './logger.js' + +const localizations = {}; + +localizations['button-title'] = { + 'en': 'Open Picture in Picture mode', + 'de': 'Bild-in-Bild starten', + 'nl': 'Beeld in beeld starten', + 'fr': 'Démarrer Image dans l’image', +}; + +// Set English as the default fallback language +const defaultLanguage = 'en'; + /** - * Returns localized button title + * Returns a localized version of the string designated by the specified key * + * @param {string} key - the key for a string + * @param {string=} language - two-letter ISO 639-1 language code * @return {string} */ -export const localizedButtonTitle = function() { - const language = navigator.language.substring(0, 2); - switch (language) { - case 'de': - return 'Bild-in-Bild starten'; - case 'nl': - return 'Beeld in beeld starten'; - case 'fr': - return 'Démarrer Image dans l’image'; - case 'en': - default: - return 'Open Picture in Picture mode'; +export const localizedString = function(key, language = navigator.language.substring(0, 2)) { + + // Get all localizations for key + const /** Object */ localizationsForKey = localizations[key]; + if (localizationsForKey) { + + // Get the users specific localization or fallback to default language + let string = localizationsForKey[language] || localizationsForKey[defaultLanguage]; + if (string) return string; } -}; \ No newline at end of file + + error(`No localized string found for key '${key}'`); + return ''; +}; + +/** + * Returns a localized version of the string designated by the specified key with tags replaced + * + * @param {string} key - the key for a string + * @param {Array>} replacements - an array of arrays containing pairs of tags and their replacement + * @param {string=} language - two-letter ISO 639-1 language code + * @return {string} + */ +export const localizedStringWithReplacements = function(key, replacements, language) { + + let string = localizedString(key, language); + + // Replace tags of the form [XXX] with directed replacements if needed + for (let index = replacements.length; index--; ) { + let replacement = replacements[index]; + + // Ensure tags do not contain special characters (this gets optimised away as opposed to escaping the tags with the associated performance cost) + if (/[^-_0-9a-zA-Z\/]/.test(replacement[0])) { + error(`Invalid characters used in localized string tag '${replacement[0]}'`); + } + + const regex = new RegExp(`\\\[${replacement[0]}\\\]`, 'g'); + string = string.replace(regex, replacement[1]); + } + + return string; +}; diff --git a/src/safari-legacy/update.plist b/src/safari-legacy/update.plist index 191e54b..9adbcd7 100644 --- a/src/safari-legacy/update.plist +++ b/src/safari-legacy/update.plist @@ -10,7 +10,7 @@ CFBundleShortVersionString CFBundleVersion - 172 + 173 Developer Identifier BQ6Q24MF9X URL