From e967b6832127cd6ee1aa604fe955acdcf03d7e43 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Wed, 24 Mar 2021 23:37:53 +0100 Subject: [PATCH 01/19] Update MultilanguagePlugin.php Made changes to accommodate different MySQL version --- MultilanguagePlugin.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/MultilanguagePlugin.php b/MultilanguagePlugin.php index 9119fb5..7010c0d 100644 --- a/MultilanguagePlugin.php +++ b/MultilanguagePlugin.php @@ -63,8 +63,8 @@ public function hookInstall() `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `element_id` int(11) NOT NULL, `record_id` int(11) NOT NULL, - `record_type` tinytext COLLATE utf8_unicode_ci NOT NULL, - `locale_code` tinytext COLLATE utf8_unicode_ci NOT NULL, + `record_type` varchar(190) COLLATE utf8_unicode_ci NOT NULL, + `locale_code` varchar(190) COLLATE utf8_unicode_ci NOT NULL, `text` text COLLATE utf8_unicode_ci, `translation` text COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`), @@ -77,9 +77,9 @@ public function hookInstall() $sql = " CREATE TABLE IF NOT EXISTS $db->MultilanguageContentLanguage ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `record_type` tinytext COLLATE utf8_unicode_ci NOT NULL, + `record_type` varchar(190) COLLATE utf8_unicode_ci NOT NULL, `record_id` int(10) unsigned NOT NULL, - `lang` tinytext COLLATE utf8_unicode_ci NOT NULL, + `lang` varchar(190) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; "; @@ -89,7 +89,7 @@ public function hookInstall() $sql = " CREATE TABLE IF NOT EXISTS $db->MultilanguageRelatedRecord ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `record_type` tinytext COLLATE utf8_unicode_ci NOT NULL, + `record_type` varchar(190) COLLATE utf8_unicode_ci NOT NULL, `record_id` int(10) unsigned NOT NULL, `related_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), @@ -104,7 +104,7 @@ public function hookInstall() CREATE TABLE IF NOT EXISTS $db->MultilanguageUserLanguage ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned NOT NULL, - `lang` tinytext COLLATE utf8_unicode_ci NOT NULL, + `lang` varchar(190) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `user_id` (`user_id`), CONSTRAINT `user_id` FOREIGN KEY (`user_id`) REFERENCES `$db->User` (`id`) ON DELETE CASCADE @@ -170,7 +170,7 @@ public function hookUpgrade($args) $sql = " CREATE TABLE IF NOT EXISTS $db->MultilanguageRelatedRecord ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `record_type` tinytext COLLATE utf8_unicode_ci NOT NULL, + `record_type` varchar(190) COLLATE utf8_unicode_ci NOT NULL, `record_id` int(10) unsigned NOT NULL, `related_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), From 6aaee76e75ff77460bdd019ea05bf71a6e457839 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Wed, 24 Mar 2021 23:40:23 +0100 Subject: [PATCH 02/19] Update multilanguage-config-form.php Grouped up languages option into a 4-columns table --- .../plugins/multilanguage-config-form.php | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/views/admin/plugins/multilanguage-config-form.php b/views/admin/plugins/multilanguage-config-form.php index 5cfe41e..6f59b04 100644 --- a/views/admin/plugins/multilanguage-config-form.php +++ b/views/admin/plugins/multilanguage-config-form.php @@ -42,22 +42,30 @@

-
- formMultiCheckbox('multilanguage_locales', $locales, null, $codes); ?> -
-
- - -
-
- formLabel('multilanguage_locales_admin', __('Admin languages')); ?> -
-
-

-
- formMultiCheckbox('multilanguage_locales_admin', $localesAdmin, null, $codes); ?> -
-
+ + + + + + + + + + + $code) { + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "\n"; + } + ?> + +
" . preg_replace($pattern, "", $code) . "" . $key . "" . $this->formCheckbox('multilanguage_locales[]', $key, array('id' => 'multilanguage_locales-' . $key, 'disableHidden' => true, 'checked' => in_array($key, $locales))) . "" . $this->formCheckbox('multilanguage_locales_admin[]', $key, array('id' => 'multilanguage_locales_admin-' . $key,'disableHidden' => true, 'checked' => in_array($key, $localesAdmin))) . "
+
Date: Wed, 24 Mar 2021 23:42:51 +0100 Subject: [PATCH 03/19] Added Italian translation --- languages/it.mo | Bin 0 -> 1708 bytes languages/it.po | 79 +++++++++++++++++++ languages/template.base.pot | 42 +++++----- languages/template.pot | 150 ++++++++++++++++++------------------ 4 files changed, 175 insertions(+), 96 deletions(-) create mode 100644 languages/it.mo create mode 100644 languages/it.po diff --git a/languages/it.mo b/languages/it.mo new file mode 100644 index 0000000000000000000000000000000000000000..d9294ead8b144af7371e23fef7619553dcc68828 GIT binary patch literal 1708 zcmbW1&u`pB6vqu}5n2j@3OJM>dOe`Df?4lIsYtxp9-5?5q(oV@3s*X^U%aoeJ!WQ{ zr0_3r;lL3IAr71o7ZA6c;6H!^5(n=50U-E}cby*+;(#UZXFYHHethRW|9bt(XA!O! zaKDcGlkkA+&pBF-@&7N}FX0|N6-BRtyWq2620jm#;49$A;C1j*a2@;#d;|OqyaxUa z-T<#X9YtS)OJIoo6Zi{kKZ7GYe|sg0UIzaFUjwgRjiTqkn+qy1#9ISj1oyxY?-BSW z_&FHj{Q!pde+0h=e+Pq~FP_2A#*EWL@-wEAz0S1PbRb-04r|)e6VuSKt~_}|r9Ncx zR#&dTw*7+p(T1r!!@8rZywN$kXp;|gQ+O&CD7M z!S+C>?B1buO*7;-UYdDdCvj{_KGc0<^EfpbpTyIJ1O8wySeEWu))`!hTaWeKespF> zQVBsv^BAhB?M%JT)`_VSYF(UM)iP? zB;<9z54JTm#J*v&vikM_S8qophHz$a}5tq5~9E*={_jb2;x6TzD_6NO1r>g0b8s&LD@o`;f zsYaB}v~}#q?@jNk)$@Jf;Ly`*tHMd*{1aNmIGkmk5FRE)V|AhK8(X@BDx47>-FSIK z^S|R;72O=u@b;+Jw)963PLrVH%UURtZi2CbRy}HrkmV|4G#SdzniLaQNI%*^{3f(H zHn#2Bc!_p26=7WyCIk~8mEcow`gJ?Jt~O3WI9^O_yK^!9P53ml>djYM_pKWg3?~ofdtXz~WLGo*`, YEAR. +# +# Translators: +# Daniele Binaghi, 2019 +# Giorgia Menghinella , 2017 +# Giorgio Comai , 2019 +msgid "" +msgstr "" +"Project-Id-Version: omeka-plugin-Multilanguage\n" +"Report-Msgid-Bugs-To: http://github.com/patrickmj/Multilanguage/issues\n" +"POT-Creation-Date: 2014-09-21 17:49-0500\n" +"PO-Revision-Date: 2019-09-11 11:48+0000\n" +"Last-Translator: Daniele Binaghi\n" +"Language-Team: Italian (http://www.transifex.com/omeka/omeka-plugin-multilanguage/language/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Multilanguage" +msgstr "Multilingua" + +#: MultilanguagePlugin.php:56 MultilanguagePlugin.php:62 +#: views/shared/user-language/user-language.php:2 +msgid "Preferred Language" +msgstr "Lingua preferita" + +#: MultilanguagePlugin.php:64 +msgid "Multilanguage Content" +msgstr "Contenuto multilingua" + +#: MultilanguagePlugin.php:228 +msgid "Translate to: " +msgstr "Traduci in:" + +#: config_form.php:4 +msgid "Select the languages into which your site can be translated." +msgstr "Seleziona le lingue in cui può essere tradotto il tuo sito." + +#: config_form.php:41 +msgid "" +"The languages available to translate content. To learn more about " +"translating the core interfaces, read this." +msgstr "Lingue disponibili per tradurre i contenuti. Per scoprire di più riguardo alla traduzione delle interfacce principali, leggi questo." + +#: config_form.php:49 +msgid "Check the metadata fields that you want to make translatable." +msgstr "Seleziona i campi di metadati che vuoi rendere traducibili." + +#: views/admin/translations/content-language.php:2 +msgid "Content Languages" +msgstr "Lingue dei contenuti" + +#: views/admin/translations/content-language.php:25 +#, php-format +msgid "Default language is %s" +msgstr "La lingua predefinita è %s" + +#: views/admin/translations/content-language.php:26 +msgid "Exhibits" +msgstr "Esposizione" + +#: views/admin/translations/content-language.php:43 +msgid "Simple Pages" +msgstr "Simple Pages" + +#: views/shared/user-language/user-language.php:40 +msgid "Select your prefered language" +msgstr "Scegli la tua lingua preferita" + +#: views/shared/user-language/user-language.php:43 +#, php-format +msgid "The default language is %s" +msgstr "La lingua predefinita è %s" diff --git a/languages/template.base.pot b/languages/template.base.pot index 3db6a87..7626832 100644 --- a/languages/template.base.pot +++ b/languages/template.base.pot @@ -1,21 +1,21 @@ -# Translation for the Multilanguage plugin for Omeka. -# Copyright (C) 2014 Patrick Murray-John -# This file is distributed under the same license as the Omeka package. -# Patrick Murray-John , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Locale\n" -"Report-Msgid-Bugs-To: http://github.com/patrickmj/Multilanguage/issues\n" -"POT-Creation-Date: 2014-09-21 17:49-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -msgid "Multilanguage" -msgstr "" +# Translation for the Multilanguage plugin for Omeka. +# Copyright (C) 2014 Patrick Murray-John +# This file is distributed under the same license as the Omeka package. +# Patrick Murray-John , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Locale\n" +"Report-Msgid-Bugs-To: http://github.com/patrickmj/Multilanguage/issues\n" +"POT-Creation-Date: 2014-09-21 17:49-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Multilanguage" +msgstr "" diff --git a/languages/template.pot b/languages/template.pot index 60deab0..5554fb7 100644 --- a/languages/template.pot +++ b/languages/template.pot @@ -1,75 +1,75 @@ -# Translation for the Multilanguage plugin for Omeka. -# Copyright (C) 2014 Patrick Murray-John -# This file is distributed under the same license as the Omeka package. -# Patrick Murray-John , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Locale\n" -"Report-Msgid-Bugs-To: http://github.com/patrickmj/Multilanguage/issues\n" -"POT-Creation-Date: 2014-09-21 17:49-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -msgid "Multilanguage" -msgstr "" - -#: MultilanguagePlugin.php:56 MultilanguagePlugin.php:62 -#: views/shared/user-language/user-language.php:2 -msgid "Preferred Language" -msgstr "" - -#: MultilanguagePlugin.php:64 -msgid "Multilanguage Content" -msgstr "" - -#: MultilanguagePlugin.php:228 -msgid "Translate to: " -msgstr "" - -#: config_form.php:4 -msgid "Select the languages into which your site can be translated." -msgstr "" - -#: config_form.php:41 -msgid "" -"The languages available to translate content. To learn more about " -"translating the core interfaces, read this." -msgstr "" - -#: config_form.php:49 -msgid "Check the metadata fields that you want to make translatable." -msgstr "" - -#: views/admin/translations/content-language.php:2 -msgid "Content Languages" -msgstr "" - -#: views/admin/translations/content-language.php:25 -#, php-format -msgid "Default language is %s" -msgstr "" - -#: views/admin/translations/content-language.php:26 -msgid "Exhibits" -msgstr "" - -#: views/admin/translations/content-language.php:43 -msgid "Simple Pages" -msgstr "" - -#: views/shared/user-language/user-language.php:40 -msgid "Select your prefered language" -msgstr "" - -#: views/shared/user-language/user-language.php:43 -#, php-format -msgid "The default language is %s" -msgstr "" +# Translation for the Multilanguage plugin for Omeka. +# Copyright (C) 2014 Patrick Murray-John +# This file is distributed under the same license as the Omeka package. +# Patrick Murray-John , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Locale\n" +"Report-Msgid-Bugs-To: http://github.com/patrickmj/Multilanguage/issues\n" +"POT-Creation-Date: 2014-09-21 17:49-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Multilanguage" +msgstr "" + +#: MultilanguagePlugin.php:56 MultilanguagePlugin.php:62 +#: views/shared/user-language/user-language.php:2 +msgid "Preferred Language" +msgstr "" + +#: MultilanguagePlugin.php:64 +msgid "Multilanguage Content" +msgstr "" + +#: MultilanguagePlugin.php:228 +msgid "Translate to: " +msgstr "" + +#: config_form.php:4 +msgid "Select the languages into which your site can be translated." +msgstr "" + +#: config_form.php:41 +msgid "" +"The languages available to translate content. To learn more about " +"translating the core interfaces, read this." +msgstr "" + +#: config_form.php:49 +msgid "Check the metadata fields that you want to make translatable." +msgstr "" + +#: views/admin/translations/content-language.php:2 +msgid "Content Languages" +msgstr "" + +#: views/admin/translations/content-language.php:25 +#, php-format +msgid "Default language is %s" +msgstr "" + +#: views/admin/translations/content-language.php:26 +msgid "Exhibits" +msgstr "" + +#: views/admin/translations/content-language.php:43 +msgid "Simple Pages" +msgstr "" + +#: views/shared/user-language/user-language.php:40 +msgid "Select your prefered language" +msgstr "" + +#: views/shared/user-language/user-language.php:43 +#, php-format +msgid "The default language is %s" +msgstr "" From 92d839f92a1159d671305b43677b84b06f6e9f85 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Wed, 24 Mar 2021 23:44:24 +0100 Subject: [PATCH 04/19] Added esperanto flag --- views/shared/css/flag-icon-css/flags/1x1/eo.svg | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 views/shared/css/flag-icon-css/flags/1x1/eo.svg diff --git a/views/shared/css/flag-icon-css/flags/1x1/eo.svg b/views/shared/css/flag-icon-css/flags/1x1/eo.svg new file mode 100644 index 0000000..3c448d0 --- /dev/null +++ b/views/shared/css/flag-icon-css/flags/1x1/eo.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From 2bd5d1fbbc9b841d38dbf84bac15d161b1f86132 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Wed, 24 Mar 2021 23:45:12 +0100 Subject: [PATCH 05/19] Added esperanto flag --- views/shared/css/flag-icon-css/flags/4x3/eo.svg | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 views/shared/css/flag-icon-css/flags/4x3/eo.svg diff --git a/views/shared/css/flag-icon-css/flags/4x3/eo.svg b/views/shared/css/flag-icon-css/flags/4x3/eo.svg new file mode 100644 index 0000000..e55d0d0 --- /dev/null +++ b/views/shared/css/flag-icon-css/flags/4x3/eo.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From 679147e105654e4639cb637352cb5ac31862a2aa Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Wed, 24 Mar 2021 23:46:24 +0100 Subject: [PATCH 06/19] Added esperanto language --- views/shared/css/flag-icon-css/css/flag-icon.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/views/shared/css/flag-icon-css/css/flag-icon.css b/views/shared/css/flag-icon-css/css/flag-icon.css index cd30a7d..bab3de9 100644 --- a/views/shared/css/flag-icon-css/css/flag-icon.css +++ b/views/shared/css/flag-icon-css/css/flag-icon.css @@ -414,6 +414,9 @@ .flag-icon-eh.flag-icon-squared { background-image: url(../flags/1x1/eh.svg); } +.flag-icon-eo.flag-icon-squared { + background-image: url(../flags/1x1/eo.svg); +} .flag-icon-er { background-image: url(../flags/4x3/er.svg); } From b3a5e0602121bfbe9854ad212ffc36a10187f8b9 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Wed, 24 Mar 2021 23:48:48 +0100 Subject: [PATCH 07/19] Added esperanto language --- views/shared/css/flag-icon-css/css/flag-icon.min.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/shared/css/flag-icon-css/css/flag-icon.min.css b/views/shared/css/flag-icon-css/css/flag-icon.min.css index 15af963..5e6d8d8 100644 --- a/views/shared/css/flag-icon-css/css/flag-icon.min.css +++ b/views/shared/css/flag-icon-css/css/flag-icon.min.css @@ -1 +1 @@ -.flag-icon-background{background-size:contain;background-position:50%;background-repeat:no-repeat}.flag-icon{background-size:contain;background-position:50%;background-repeat:no-repeat;position:relative;display:inline-block;width:1.33333333em;line-height:1em}.flag-icon:before{content:'\00a0'}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ca{background-image:url(../flags/4x3/es-ca.svg)}.flag-icon-es-ca.flag-icon-squared{background-image:url(../flags/1x1/es-ca.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)} \ No newline at end of file +.flag-icon-background{background-size:contain;background-position:50%;background-repeat:no-repeat}.flag-icon{background-size:contain;background-position:50%;background-repeat:no-repeat;position:relative;display:inline-block;width:1.33333333em;line-height:1em}.flag-icon:before{content:'\00a0'}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-eo{background-image:url(../flags/4x3/eo.svg)}.flag-icon-eo.flag-icon-squared{background-image:url(../flags/1x1/eo.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ca{background-image:url(../flags/4x3/es-ca.svg)}.flag-icon-es-ca.flag-icon-squared{background-image:url(../flags/1x1/es-ca.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)} From f262f62b66897809c2380ebc2130064df6ffaea6 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Wed, 24 Mar 2021 23:49:44 +0100 Subject: [PATCH 08/19] Added esperanto language --- views/shared/css/flag-icon-css/sass/_flag-icon-list.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/views/shared/css/flag-icon-css/sass/_flag-icon-list.scss b/views/shared/css/flag-icon-css/sass/_flag-icon-list.scss index b441723..b548392 100644 --- a/views/shared/css/flag-icon-css/sass/_flag-icon-list.scss +++ b/views/shared/css/flag-icon-css/sass/_flag-icon-list.scss @@ -69,6 +69,7 @@ @include flag-icon(ee); @include flag-icon(eg); @include flag-icon(eh); + @include flag-icon(eo); @include flag-icon(er); @include flag-icon(es); @include flag-icon(et); From 97d76ee2b3341eeba616b1fbf6d88eacca902771 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Wed, 24 Mar 2021 23:51:30 +0100 Subject: [PATCH 09/19] Added esperanto language --- views/helpers/LocaleToCountry.php | 1 + 1 file changed, 1 insertion(+) diff --git a/views/helpers/LocaleToCountry.php b/views/helpers/LocaleToCountry.php index 7ec0906..76fe202 100644 --- a/views/helpers/LocaleToCountry.php +++ b/views/helpers/LocaleToCountry.php @@ -6,6 +6,7 @@ class Multilanguage_View_Helper_LocaleToCountry extends Zend_View_Helper_Abstrac 'ar' => 'SA', 'cs' => 'CZ', 'en' => 'GB', + 'eo' => 'EO', 'es' => 'ES', 'et' => 'EE', 'eu' => 'ES', From 9bcf72805d18d105acca1381a0886b828c84e9a4 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Sat, 27 Mar 2021 22:13:51 +0100 Subject: [PATCH 10/19] Added display mode option, changed language presentation --- .../plugins/multilanguage-config-form.php | 106 +++++++++--------- 1 file changed, 55 insertions(+), 51 deletions(-) diff --git a/views/admin/plugins/multilanguage-config-form.php b/views/admin/plugins/multilanguage-config-form.php index 6f59b04..95408f3 100644 --- a/views/admin/plugins/multilanguage-config-form.php +++ b/views/admin/plugins/multilanguage-config-form.php @@ -1,47 +1,51 @@ - -

- ', ''); ?> + ', ''); ?>

-
- formLabel('multilanguage_append_header', - __('Automatically append to header')); ?> -
-
-

- formCheckbox('multilanguage_append_header', true, - array('checked' => (bool) get_option('multilanguage_append_header'))); ?> -
+
+ formLabel('multilanguage_append_header', __('Automatically append to header')); ?> +
+
+

+ formCheckbox('multilanguage_append_header', true, + array('checked' => (bool) get_option('multilanguage_append_header'))); ?> +
-
- formLabel('multilanguage_translations_reset', __('Reset translations')); ?> -
-
- formCheckbox('multilanguage_translations_reset', true, array('checked' => false)); ?> -

- -

-
+
+ formLabel('multilanguage_translations_reset', __('Reset translations')); ?> +
+
+

+ +

+ formCheckbox('multilanguage_translations_reset', true, array('checked' => (bool) get_option('multilanguage_append_header'))); ?> +
+
+
+ formLabel('multilanguage_display_mode', __('Language display mode')); ?> +
+
+

+ formSelect('multilanguage_display_mode', get_option('multilanguage_display_mode'), array(), array( + '' => __('Flag (default)'), + 'code' => __('2 letters language code'), + 'name' => __('Full language name') + )); + ?> +
+
-
- formLabel('multilanguage_locales', __('Languages')); ?> -
-
-

+
+ formLabel('multilanguage_locales', __('Languages')); ?> +
+
+

@@ -72,26 +76,26 @@ $elementOptions = get_db()->getTable('Element')->findPairsForSelectForm(); ?>
-
- formLabel('multilanguage_elements', __('Record Elements')); ?> -
-
-

-
+
+ formLabel('multilanguage_elements', __('Record Elements')); ?> +
+
+

+
$options) { - echo "
"; - echo "

$elSet

"; - echo $this->formMultiCheckbox('multilanguage_elements', $translatableElementIds, null, $options, ''); - echo "
"; - } + foreach ($elementOptions as $elSet => $options) { + echo "
"; + echo "

$elSet

"; + echo $this->formMultiCheckbox('multilanguage_elements', $translatableElementIds, null, $options, ''); + echo "
"; + } } else { - echo "
"; - echo $this->formMultiCheckbox('multilanguage_elements', $translatableElementIds, null, $elementOptions, ''); - echo "
"; + echo "
"; + echo $this->formMultiCheckbox('multilanguage_elements', $translatableElementIds, null, $elementOptions, ''); + echo "
"; } ?> -
-
+
+
From e2fbb87adb5b3c873142d8ad2c5d3f528ce2ff3a Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Sat, 27 Mar 2021 22:14:37 +0100 Subject: [PATCH 11/19] Added language display mode --- MultilanguagePlugin.php | 1655 +++++++++++++++++++-------------------- 1 file changed, 818 insertions(+), 837 deletions(-) diff --git a/MultilanguagePlugin.php b/MultilanguagePlugin.php index 7010c0d..e130efb 100644 --- a/MultilanguagePlugin.php +++ b/MultilanguagePlugin.php @@ -4,908 +4,889 @@ class MultilanguagePlugin extends Omeka_Plugin_AbstractPlugin { - protected $_hooks = array( - 'initialize', - 'install', - 'uninstall', - 'upgrade', - 'config', - 'config_form', - 'define_routes', - 'admin_head', - 'admin_footer', - 'public_head', - 'public_header', - // 'admin_users_browse_each', - 'users_form', - 'after_save_user', - // No hook for simple page form. - 'after_save_simple_pages_page', - // No hook for exhibit form. - 'after_save_exhibit', - 'after_save_exhibit_page', - 'after_delete_simple_pages_page', - 'after_delete_exhibit', - 'after_delete_exhibit_page', - // No hook to browse exhibit page: the language is the exhibit one. - 'exhibits_browse_sql', - 'simple_pages_pages_browse_sql', - ); - - protected $_filters = array( - // Note: the filter locale adds some filters. - 'locale', - 'admin_navigation_global', - 'guest_user_links', - ); - - protected $_options = array( - 'multilanguage_append_header' => true, - // The value is: serialize(array('en')) - 'multilanguage_locales' => 'a:1:{i:0;s:2:"en";}', - 'multilanguage_locales_admin' => 'a:1:{i:0;s:2:"en";}', - 'multilanguage_elements' => 'a:1:{s:11:"Dublin Core";a:3:{i:0;s:5:"Title";i:1;s:11:"Description";i:2;s:7:"Subject";}}', - ); - - protected $locale_code; - - public function hookInitialize($args) - { - add_translation_source(dirname(__FILE__) . '/languages'); - add_translation_source(dirname(dirname(dirname(__FILE__))) . '/themes/' . get_option('public_theme') . '/languages'); - } - - public function hookInstall() - { - $db = $this->_db; - $sql = " + protected $_hooks = array( + 'initialize', + 'install', + 'uninstall', + 'upgrade', + 'config', + 'config_form', + 'define_routes', + 'admin_head', + 'admin_footer', + 'public_head', + 'public_header', + // 'admin_users_browse_each', + 'users_form', + 'after_save_user', + // No hook for simple page form. + 'after_save_simple_pages_page', + // No hook for exhibit form. + 'after_save_exhibit', + 'after_save_exhibit_page', + 'after_delete_simple_pages_page', + 'after_delete_exhibit', + 'after_delete_exhibit_page', + // No hook to browse exhibit page: the language is the exhibit one. + 'exhibits_browse_sql', + 'simple_pages_pages_browse_sql', + ); + + protected $_filters = array( + // Note: the filter locale adds some filters. + 'locale', + 'admin_navigation_global', + 'guest_user_links', + ); + + protected $_options = array( + 'multilanguage_append_header' => true, + 'multilanguage_display_mode' => '', + // The value is: serialize(array('en')) + 'multilanguage_locales' => 'a:1:{i:0;s:2:"en";}', + 'multilanguage_locales_admin' => 'a:1:{i:0;s:2:"en";}', + 'multilanguage_elements' => 'a:1:{s:11:"Dublin Core";a:3:{i:0;s:5:"Title";i:1;s:11:"Description";i:2;s:7:"Subject";}}', + ); + + protected $locale_code; + + public function hookInitialize($args) + { + add_translation_source(dirname(__FILE__) . '/languages'); + } + + public function hookInstall() + { + $db = $this->_db; + $sql = " CREATE TABLE IF NOT EXISTS $db->MultilanguageTranslation ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `element_id` int(11) NOT NULL, `record_id` int(11) NOT NULL, - `record_type` varchar(190) COLLATE utf8_unicode_ci NOT NULL, - `locale_code` varchar(190) COLLATE utf8_unicode_ci NOT NULL, + `record_type` tinytext COLLATE utf8_unicode_ci NOT NULL, + `locale_code` tinytext COLLATE utf8_unicode_ci NOT NULL, `text` text COLLATE utf8_unicode_ci, `translation` text COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`), KEY `element_id` (`element_id`,`record_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; - "; + "; - $db->query($sql); + $db->query($sql); - $sql = " + $sql = " CREATE TABLE IF NOT EXISTS $db->MultilanguageContentLanguage ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `record_type` varchar(190) COLLATE utf8_unicode_ci NOT NULL, + `record_type` tinytext COLLATE utf8_unicode_ci NOT NULL, `record_id` int(10) unsigned NOT NULL, - `lang` varchar(190) COLLATE utf8_unicode_ci NOT NULL, + `lang` tinytext COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; - "; + "; - $db->query($sql); + $db->query($sql); - $sql = " + $sql = " CREATE TABLE IF NOT EXISTS $db->MultilanguageRelatedRecord ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `record_type` varchar(190) COLLATE utf8_unicode_ci NOT NULL, + `record_type` tinytext COLLATE utf8_unicode_ci NOT NULL, `record_id` int(10) unsigned NOT NULL, `related_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `record_type_record_id` (`record_type`(190),`record_id`), KEY `record_type_related_id` (`record_type`(190),`related_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; - "; + "; - $db->query($sql); + $db->query($sql); - $sql = " + $sql = " CREATE TABLE IF NOT EXISTS $db->MultilanguageUserLanguage ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned NOT NULL, - `lang` varchar(190) COLLATE utf8_unicode_ci NOT NULL, + `lang` tinytext COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `user_id` (`user_id`), CONSTRAINT `user_id` FOREIGN KEY (`user_id`) REFERENCES `$db->User` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; - "; + "; - $db->query($sql); + $db->query($sql); - $this->_installOptions(); - } + $this->_installOptions(); + } - public function hookUninstall() - { - $db = $this->_db; - $sql = "DROP TABLE $db->MultilanguageTranslation "; - $db->query($sql); + public function hookUninstall() + { + $db = $this->_db; + $sql = "DROP TABLE $db->MultilanguageTranslation "; + $db->query($sql); - $sql = "DROP TABLE $db->MultilanguageContentLanguage "; - $db->query($sql); + $sql = "DROP TABLE $db->MultilanguageContentLanguage "; + $db->query($sql); - $sql = "DROP TABLE $db->MultilanguageRelatedRecord"; - $db->query($sql); + $sql = "DROP TABLE $db->MultilanguageRelatedRecord"; + $db->query($sql); - $sql = "DROP TABLE $db->MultilanguageUserLanguage"; - $db->query($sql); + $sql = "DROP TABLE $db->MultilanguageUserLanguage"; + $db->query($sql); - $this->_uninstallOptions(); - } + $this->_uninstallOptions(); + } - public function hookUpgrade($args) - { - $oldVersion = $args['old_version']; - $newVersion = $args['new_version']; + public function hookUpgrade($args) + { + $oldVersion = $args['old_version']; + $newVersion = $args['new_version']; - if (version_compare($oldVersion, '1.1', '<')) { - $db = $this->_db; + if (version_compare($oldVersion, '1.1', '<')) { + $db = $this->_db; - // Remove deleted records. - $sql = " + // Remove deleted records. + $sql = " DELETE FROM $db->MultilanguageUserLanguage WHERE user_id NOT IN (SELECT id FROM $db->User); - "; - $db->query($sql); + "; + $db->query($sql); - // Add a automatic deletion for users. - $sql = " + // Add a automatic deletion for users. + $sql = " ALTER TABLE `$db->MultilanguageUserLanguage` ADD FOREIGN KEY (`user_id`) REFERENCES `omeka_users` (`id`) ON DELETE CASCADE; - "; - $db->query($sql); - } + "; + $db->query($sql); + } - if (version_compare($oldVersion, '1.2', '<')) { - set_option('multilanguage_append_header', $this->_options ['multilanguage_append_header']); - set_option('multilanguage_locales', get_option('multilanguage_language_codes')); - set_option('multilanguage_locales_admin', get_option('multilanguage_language_codes')); - delete_option('multilanguage_language_codes'); - } + if (version_compare($oldVersion, '1.2', '<')) { + set_option('multilanguage_append_header', $this->_options ['multilanguage_append_header']); + set_option('multilanguage_locales', get_option('multilanguage_language_codes')); + set_option('multilanguage_locales_admin', get_option('multilanguage_language_codes')); + delete_option('multilanguage_language_codes'); + } - if (version_compare($oldVersion, '1.3', '<')) { - $db = $this->_db; + if (version_compare($oldVersion, '1.3', '<')) { + $db = $this->_db; - $sql = " + $sql = " CREATE TABLE IF NOT EXISTS $db->MultilanguageRelatedRecord ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `record_type` varchar(190) COLLATE utf8_unicode_ci NOT NULL, + `record_type` tinytext COLLATE utf8_unicode_ci NOT NULL, `record_id` int(10) unsigned NOT NULL, `related_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `record_type_record_id` (`record_type`(190),`record_id`), KEY `record_type_related_id` (`record_type`(190),`related_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; - "; - $db->query($sql); - } - - if (version_compare($oldVersion, '1.4', '<')) { - // Set language of all exhibit pages to the exhibit’s one. - $exhibits = get_records('Exhibit', array(), 0); - foreach ($exhibits as $exhibit) { - $contentLanguage = $this->localeCodeRecord($exhibit); - if ($contentLanguage) { - $this->updateOrDeleteExhibitPagesLang($exhibit->id, $contentLanguage->lang); - } - } - } - - if (version_compare($oldVersion, '1.4.1', '<')) { - $db = $this->_db; - - $sql = <<MultilanguageTranslation` -SET `text` = REPLACE(`text`, CONCAT(CHAR(13), CHAR(10)), CHAR(10)) -SQL; - $db->query($sql); - - $sql = <<MultilanguageTranslation` -SET `text` = REPLACE(`text`, CONCAT("\\\\", "r", "\\\\", "n"), CONCAT("\\\\", "n")) -SQL; - $db->query($sql); - } - - if (version_compare($oldVersion, '1.5.0', '<')) { - $flash = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger'); - $flash->addMessage(__('If plugin Translations is installed, it can be removed since this plugin integrates it.')); - } - - // TODO Remove deleted records from MultilanguageContentLanguage. - } - - public function hookConfigForm() - { - $view = get_view(); - - $locales = get_option('multilanguage_locales'); - $locales = $locales ? unserialize($locales) : array(); - - $localesAdmin = get_option('multilanguage_locales_admin'); - $localesAdmin = $localesAdmin ? unserialize($localesAdmin) : array(); - - $files = scandir(BASE_DIR . '/application/languages'); - foreach ($files as $file) { - if (strpos($file, '.mo') !== false) { - $code = str_replace('.mo', '', $file); - $codes[$code] = locale_human($code) . " ($code)"; - } - } - // Set default "en" and instead of "en_US" to avoid issues. - $codes['en'] = ucfirst(Zend_Locale::getTranslation('en', 'language')) . ' (en)'; - asort($codes); - - $translatableElements = get_option('multilanguage_elements'); - $translatableElements = $translatableElements ? unserialize($translatableElements) : array(); - $elTable = get_db()->getTable('Element'); - $translatableElementIds = array(); - foreach ($translatableElements as $elSet => $elements) { - foreach ($elements as $element) { - $elObject = $elTable->findByElementSetNameAndElementName($elSet, $element); - $translatableElementIds[] = $elObject->id; - } - } - - echo $view->partial('plugins/multilanguage-config-form.php', array( - 'locales' => $locales, - 'localesAdmin' => $localesAdmin, - 'codes' => $codes, - 'translatableElementIds' => $translatableElementIds, - )); - } - - public function hookConfig($args) - { - $post = $args['post']; - - $elements = array(); - $elTable = get_db()->getTable('Element'); - foreach ($post['multilanguage_elements'] as $elId) { - $element = $elTable->find($elId); - $elSet = $element->getElementSet(); - if (!array_key_exists($elSet->name, $elements)) { - $elements[$elSet->name] = array(); - } - $elements[$elSet->name][] = $element->name; - } - $post['multilanguage_elements'] = $elements; - - if (!empty($post['multilanguage_translations_reset'])) { - $cache = Zend_Registry::get('Zend_Translate'); - $cache::clearCache(); - } - - $post = array_intersect_key($post, $this->_options); - foreach ($post as $optionKey => $optionValue) { - switch ($optionKey) { - case 'multilanguage_locales': - case 'multilanguage_locales_admin': - case 'multilanguage_elements': - $optionValue = serialize($optionValue); - break; - } - set_option($optionKey, $optionValue); - } - } - - public function hookDefineRoutes($args) - { - $router = $args['router']; - $router->addRoute( - 'multilanguage-setlocale', - new Zend_Controller_Router_Route( - 'setlocale', - array( - 'module' => 'multilanguage', - 'controller' => 'setlocale', - 'action' => 'index', - ) - ) - ); - } - - public function hookAdminHead() - { - queue_css_file('multilanguage'); - queue_js_file('multilanguage'); - $enabledLocales = unserialize(get_option('multilanguage_locales_admin')); - if ($enabledLocales) { - queue_css_file('flag-icon-css/css/flag-icon.min'); - } - } - - public function hookAdminFooter() - { - echo "
- -
"; - - echo " - "; - } - - public function hookPublicHead() - { - queue_css_file('locale-switcher'); - queue_css_file('flag-icon-css/css/flag-icon.min'); - } - - public function hookPublicHeader($args) - { - if (get_option('multilanguage_append_header')) { - echo $args['view']->localeSwitcher(); - } - } - - public function hookUsersForm($args) - { - $form = $args['form']; - $user = $args['user']; - - $defaultCode = $this->getDefaultLocaleCode(); - $userLang = ($user && $user->id) ? $this->getUserLang($user, $defaultCode) : $defaultCode; - $availableCodes = $this->prepareLocaleCodes($userLang); - - $form->addElement('select', 'multilanguage_locale_code', array( - 'label' => __('Preferred language'), - 'description' => __('Default language is %s.', $availableCodes[$defaultCode]), - 'multiOptions' => $availableCodes, - 'value' => $userLang, - 'required' => false, - )); - } - - public function hookAfterSaveUser($args) - { - $post = $args['post']; - $user = $args['record']; - if (isset($post['multilanguage_locale_code'])) { - $prefLanguages = get_db()->getTable('MultilanguageUserLanguage') - ->findBy(array('user_id' => $user->id)); - if (empty($prefLanguages)) { - $prefLanguage = new MultilanguageUserLanguage; - $prefLanguage->user_id = $user->id; - } else { - $prefLanguage = $prefLanguages[0]; - } - - $defaultCode = $this->getDefaultLocaleCode(); - $availableCodes = $this->prepareLocaleCodes(); - $userLang = $post['multilanguage_locale_code']; - $prefLanguage->lang = isset($availableCodes[$userLang]) - ? $userLang - : $defaultCode; - $prefLanguage->save(); - } - } - - public function hookAfterSaveSimplePagesPage($args) - { - $this->saveMultilangueRecord($args); - } - - public function hookAfterSaveExhibit($args) - { - $this->saveMultilangueRecord($args); - - // Set language of all exhibit pages to the exhibit’s one. - $exhibit = $args['record']; - $contentLanguage = $this->localeCodeRecord($exhibit); - $lang = $contentLanguage->lang ? $contentLanguage->lang : null; - $this->updateOrDeleteExhibitPagesLang($exhibit->id, $lang); - } - - public function hookAfterSaveExhibitPage($args) - { - // Force the lang of the exhibit page. - $record = $args['record']; - $exhibit = get_record_by_id('Exhibit', $record->exhibit_id); - $contentLanguage = $this->localeCodeRecord($exhibit); - $lang = $contentLanguage->lang ? $contentLanguage->lang : null; - $post = $args['post']; - $post['locale_code'] = $lang; - $args['post'] = $post; - $this->saveMultilangueRecord($args); - } - - public function hookAfterDeleteSimplePagesPage($args) - { - $this->deleteMultilangueRecord($args); - } - - public function hookAfterDeleteExhibit($args) - { - $this->deleteMultilangueRecord($args); - } - - public function hookAfterDeleteExhibitPage($args) - { - $this->deleteMultilangueRecord($args); - } - - public function hookExhibitsBrowseSql($args) - { - $this->modelBrowseSql($args, 'Exhibit'); - } - - public function hookSimplePagesPagesBrowseSql($args) - { - $this->modelBrowseSql($args, 'SimplePagesPage'); - } - - protected function modelBrowseSql($args, $model) - { - if (!is_admin_theme()) { - $select = $args['select']; - $db = get_db(); - $alias = $db->getTable('MultilanguageContentLanguage')->getTableAlias(); - $modelAlias = $db->getTable($model)->getTableAlias(); - $select->joinLeft( - array($alias => $db->MultilanguageContentLanguage), - "$alias.record_id = $modelAlias.id", - array() - ); - $select->where("$alias.record_type = ?", $model); - $select->where("$alias.lang = ?", $this->locale_code); - } - } - - public function filterLocale($locale) - { - $enabledLocales = is_admin_theme() - ? unserialize(get_option('multilanguage_locales_admin')) - : unserialize(get_option('multilanguage_locales')); - - // Get the locale from url argument if any, else session, else user, else browser. - $newLocale = null; - - if (empty($enabledLocales)) { - $newLocale = $this->getDefaultLocaleCode(); - } elseif (isset($_GET['lang']) - && ($getLocale = html_escape($_GET['lang'])) - && in_array($getLocale, $enabledLocales) - ) { - $newLocale = $getLocale; - } else { - // Make sure the session has been configured properly - Zend_Registry::get('bootstrap')->bootstrap('Session'); - $session = new Zend_Session_Namespace('locale'); - - if ($session->locale && in_array($session->locale, $enabledLocales)) { - $newLocale = $session->locale; - } else { - $user = current_user(); - if ($user) { - $prefLanguages = $this->_db->getTable('MultilanguageUserLanguage') - ->findBy(array('user_id' => $user->id)); - if ($prefLanguages) { - $userPrefLanguage = reset($prefLanguages); - $newLocale = $userPrefLanguage->lang; - } - } - - // Get the locale from the browser. - // TODO Get the locale from the browser: to be simplified. - if (empty($newLocale)) { - $defaultCode = $this->getDefaultLocaleCode(); - $codes = $enabledLocales; - //dump the site's default code to the end as a fallback - $codes[] = $defaultCode; - $browserCodes = array_keys(Zend_Locale::getBrowser()); - $match = false; - foreach ($browserCodes as $browserCode) { - if (in_array($browserCode, $codes)) { - $newLocale = $browserCode; - $match = true; - break; - } - } - if (!$match) { - // Failed to find browserCode in our language codes. - // Try to match a two character code and set it to - // the closest equivalent if available. - $shortcodes = array(); - foreach ($codes as $c) { - $shortcodes[] = substr($c, 0, 2); - } - foreach ($browserCodes as $bcode) { - if (in_array($bcode, $shortcodes)) { - $lenCodes = count($codes); - for ($i = 0; $i < $lenCodes; $i++) { - if (strcmp($bcode, $shortcodes[$i]) == 0) { - $newLocale = $codes[$i]; - break 2; - } - } - } - } - } - - // From plugin Locale Switcher. - if (empty($newLocale)) { - if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - $languages = array_map(function ($l) { - list($lang, $q) = array_pad(explode(';', $l), 2, null); - return str_replace('-', '_', trim($lang)); - }, explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE'])); - - foreach ($languages as $language) { - if (in_array($language, $enabledLocales)) { - $newLocale = $language; - break; - } - } - } - - if (empty($newLocale)) { - $newLocale = $defaultCode; - } - } - } - } - } - - $this->locale_code = $newLocale; - - //weird to be adding filters here, but translations weren't happening consistently when it was in setUp - //@TODO: check if this oddity is due to setting the priority high - $this->addFilterElements(); - - return $this->locale_code; - } - - public function filterAdminNavigationGlobal($nav) - { - $enabledLocales = unserialize(get_option('multilanguage_locales_admin')); - if (empty($enabledLocales)) { - return $nav; - } - - $currentLocale = Zend_Registry::get('bootstrap')->getResource('Locale')->toString(); - $currentUrl = Zend_Controller_Front::getInstance()->getRequest()->getRequestUri(); - $view = get_view(); - - foreach ($enabledLocales as $locale) { - $language = Zend_Locale::getTranslation(substr($locale, 0, 2), 'language'); - $country = $view->localeToCountry($locale); - - $url = url('setlocale', array('locale' => $locale, 'redirect' => $currentUrl)); - $title = locale_human($locale); - $class = 'flag-icon flag-icon-' . strtolower($country); - if ($locale === $currentLocale) { - $class .= ' active'; - } - $link = array( - 'label' => null, - 'uri' => $url, - 'class' => $class, - 'title' => $title, - ); - $nav[] = $link; - } - - return $nav; - } - - public function filterGuestUserLinks($links) - { - $links['Multilanguage'] = array( - 'label' => __('Preferred Language'), - 'uri' => url('multilanguage/user-language/user-language'), - ); - return $links; - } - - protected function addFilterElements() - { - $translatableElements = unserialize(get_option('multilanguage_elements')); - if (is_array($translatableElements)) { - foreach ($translatableElements as $elementSet => $elements) { - foreach ($elements as $element) { - add_filter(array('Display', 'Item', $elementSet, $element), array($this, 'filterTranslate'), 1); - add_filter(array('ElementInput', 'Item', $elementSet, $element), array($this, 'filtertranslateField'), 1); - add_filter(array('Display', 'Collection', $elementSet, $element), array($this, 'filterTranslate'), 1); - add_filter(array('ElementInput', 'Collection', $elementSet, $element), array($this, 'filterTranslateField'), 1); - add_filter(array('Display', 'File', $elementSet, $element), array($this, 'filterTranslate'), 1); - add_filter(array('ElementInput', 'File', $elementSet, $element), array($this, 'filterTranslateField'), 1); - } - } - } - } - - public function filterTranslateField($components, $args) - { - $record = $args['record']; - $element = $args['element']; - $type = get_class($record); - $languages = unserialize(get_option('multilanguage_locales')); - $html = __('Translate to:'); - foreach ($languages as $code) { - $html .= sprintf( - '
  • %s
  • ', - $element->id, - $code, - $record->id, - $type, - $code - ); - } - $components['form_controls'] .= '
      ' . $html . '
    '; - return $components; - } - - public function filterTranslate($translateText, $args) - { - $db = $this->_db; - $record = $args['record']; - //since I'm being cheap and not differentiating Items vs Collections - //or any other ActsAsElementText up above in the filter definitions (themselves weird), - //I risk getting null values here - //after the filter happens for 'element_text' - if (!empty($args['element_text'])) { - $elementText = $args['element_text']; - - $elementId = $elementText->element_id; - - $translation = $db->getTable('MultilanguageTranslation') - ->getTranslation($record->id, get_class($record), $elementId, $this->locale_code, $translateText); - if ($translation) { - $translateText = $translation->translation; - } - } - return $translateText; - } - - protected function getDefaultLocaleCode() - { - if (plugin_is_active('Locale')) { - $plugin = new LocalePlugin(); - return $plugin->filterLocale(null); - } - - $defaultCodes = Zend_Locale::getDefault(); - return current(array_keys($defaultCodes)); - } - - protected function getUserLang($user, $defaultCode = null) - { - $prefLanguages = get_db()->getTable('MultilanguageUserLanguage') - ->findBy(array('user_id' => $user->id)); - $userLang = empty($prefLanguages) ? $defaultCode : $prefLanguages[0]->lang; - return $userLang; - } - - /** - * Get the list of available language code. - * - * @param string $lang Add this language code. - * @return array - */ - protected function prepareLocaleCodes($lang = null) - { - $availableCodes = array(); - $defaultCode = $this->getDefaultLocaleCode(); - - if (!isset($lang)) { - $lang = $defaultCode; - } - - $codes = unserialize(get_option('multilanguage_locales')) ?: array(); - array_unshift($codes, $defaultCode); - foreach ($codes as $code) { - $parts = explode('_', $code); - if (isset($parts[1])) { - $langCode = $parts[0]; - $regionCode = $parts[1]; - try { - $language = Zend_Locale::getTranslation($langCode, 'language', $langCode); - $region = Zend_Locale::getTranslation($regionCode, 'territory', $langCode); - } catch (Exception $e) { - $language = $langCode; - $region = ''; - } - } else { - try { - $language = Zend_Locale::getTranslation($code, 'language', $code); - } catch (Exception $e) { - $language = $code; - } - $region = ''; - } - if ($region != '') { - $region = " - $region"; - } - $availableCodes[$code] = ucfirst($language) . $region . " ($code)"; - } - - return $availableCodes; - } - - protected function saveMultilangueRecord($args) - { - $post = $args['post']; - $record = $args['record']; - - if (array_key_exists('locale_code', $post)) { - $this->processLocaleCodeRecord($record, $post); - } - - if (array_key_exists('related_records', $post)) { - $this->processRelatedRecordsRecord($record, $post); - } - } - - protected function processLocaleCodeRecord($record, $post) - { - $localeCode = $post['locale_code']; - - // Remove the locale code of the record if wanted and if any. - if (empty($localeCode)) { - if ($post['insert']) { - return; - } - $localeCodeRecord = $this->localeCodeRecord($record); - if ($localeCodeRecord) { - $localeCodeRecord->delete(); - return; - } - } - - // Check the locale code. - $availableCodes = $this->prepareLocaleCodes(); - if (!isset($availableCodes[$localeCode])) { - return; - } - - $localeCodeRecord = $this->localeCodeRecord($record); - - // Don't update the locale code if unchanged. - if ($localeCodeRecord && $localeCodeRecord->lang === $localeCode) { - return; - } - - if (empty($localeCodeRecord)) { - $localeCodeRecord = new MultilanguageContentLanguage; - $localeCodeRecord->record_type = get_class($record); - $localeCodeRecord->record_id = (int) $record->id; - } - - $localeCodeRecord->lang = $localeCode; - $localeCodeRecord->save(); - } - - protected function processRelatedRecordsRecord($record, $post) - { - // No relation can be set for a new record. - if ($post['insert']) { - return; - } - - $relatedRecordIds = array_filter(array_map('intval', $post['related_records'])); - sort($relatedRecordIds); - - $recordType = get_class($record); - $recordId = (int) $record->id; - - // To avoid multiple checks, all related records are removed and saved. - // Anyway, they are a few usually. - $relatedRecords = $this->relatedRecords($record, null, true); - foreach ($relatedRecords as $relatedRecord) { - $relatedRecord->delete(); - } - - // All related records or new related records should be removed too. - // TODO Just remove the related record from the list of its related records. - foreach ($relatedRecordIds as $relatedRecordId) { - $relatedRecords = $this->relatedRecords($recordType, $relatedRecordId, true); - foreach ($relatedRecords as $relatedRecord) { - $relatedRecord->delete(); - } - } - - // Create remaining (new) related records. - foreach ($relatedRecordIds as $relatedRecordId) { - if ($relatedRecordId == $recordId) { - continue; - } - $relatedRecord = new MultilanguageRelatedRecord; - $relatedRecord->record_type = $recordType; - // Keep record id lower than related id to simplify search. - if ($recordId < $relatedRecordId) { - $relatedRecord->record_id = $recordId; - $relatedRecord->related_id = $relatedRecordId; - } else { - $relatedRecord->record_id = $relatedRecordId; - $relatedRecord->related_id = $recordId; - } - $relatedRecord->save(); - } - } - - protected function deleteMultilangueRecord($args) - { - $record = $args['record']; - $localeCodeRecord = $this->localeCodeRecord($record); - if ($localeCodeRecord) { - $localeCodeRecord->delete(); - } - $relatedRecords = $this->relatedRecords($record, null, true); - foreach ($relatedRecords as $relatedRecord) { - $relatedRecord->delete(); - } - } - - /** - * Get the locale code of a record, if any. - * - * @param Omeka_Record_AbstractRecord $record - * @return MultilanguageContentLanguage|null - */ - protected function localeCodeRecord(Omeka_Record_AbstractRecord $record) - { - $table = get_db()->getTable('MultilanguageContentLanguage'); - $select = $table->getSelectForFindBy( - array( - 'record_type' => get_class($record), - 'record_id' => $record->id, - ) - ); - $contentLanguage = $table->fetchObject($select); - return $contentLanguage; - } - - /** - * Get the related records of a record, if any. - * - * @param Omeka_Record_AbstractRecord|string $record Record or record type. - * @param int $recordId - * @param bool $included Include the specified record to the list. - * @return MultilanguageRelatedRecord[]|null - */ - protected function relatedRecords($record, $recordId = null, $included = false) - { - if (is_object($record)) { - $recordType = get_class($record); - $recordId = $record->id; - } else { - $recordType = $record; - } - - $records = get_db()->getTable('MultilanguageRelatedRecord') - ->findRelatedRecords($recordType, $recordId, $included); - return $records; - } - - /** - * Force the language of all pages to the exhibit's one. - * - * @param int $exhibitId - * @param string|null $lang - */ - protected function updateOrDeleteExhibitPagesLang($exhibitId, $lang) - { - $db = $this->_db; - if (empty($lang)) { - $sql = " + "; + $db->query($sql); + } + + if (version_compare($oldVersion, '1.4', '<')) { + // Set language of all exhibit pages to the exhibit’s one. + $exhibits = get_records('Exhibit', array(), 0); + foreach ($exhibits as $exhibit) { + $contentLanguage = $this->localeCodeRecord($exhibit); + if ($contentLanguage) { + $this->updateOrDeleteExhibitPagesLang($exhibit->id, $contentLanguage->lang); + } + } + } + + // TODO Remove deleted records from MultilanguageContentLanguage. + } + + public function hookConfigForm() + { + $view = get_view(); + + $locales = get_option('multilanguage_locales'); + $locales = $locales ? unserialize($locales) : array(); + + $localesAdmin = get_option('multilanguage_locales_admin'); + $localesAdmin = $localesAdmin ? unserialize($localesAdmin) : array(); + + $files = scandir(BASE_DIR . '/application/languages'); + foreach ($files as $file) { + if (strpos($file, '.mo') !== false) { + $code = str_replace('.mo', '', $file); + $codes[$code] = locale_human($code) . " ($code)"; + } + } + // Set default "en" and instead of "en_US" to avoid issues. + $codes['en'] = ucfirst(Zend_Locale::getTranslation('en', 'language')) . ' (en)'; + asort($codes); + + $translatableElements = get_option('multilanguage_elements'); + $translatableElements = $translatableElements ? unserialize($translatableElements) : array(); + $elTable = get_db()->getTable('Element'); + $translatableElementIds = array(); + foreach ($translatableElements as $elSet => $elements) { + foreach ($elements as $element) { + $elObject = $elTable->findByElementSetNameAndElementName($elSet, $element); + $translatableElementIds[] = $elObject->id; + } + } + + echo $view->partial('plugins/multilanguage-config-form.php', array( + 'locales' => $locales, + 'localesAdmin' => $localesAdmin, + 'codes' => $codes, + 'translatableElementIds' => $translatableElementIds, + )); + } + + public function hookConfig($args) + { + $post = $args['post']; + + $elements = array(); + $elTable = get_db()->getTable('Element'); + foreach ($post['multilanguage_elements'] as $elId) { + $element = $elTable->find($elId); + $elSet = $element->getElementSet(); + if (!array_key_exists($elSet->name, $elements)) { + $elements[$elSet->name] = array(); + } + $elements[$elSet->name][] = $element->name; + } + $post['multilanguage_elements'] = $elements; + + if (!empty($post['multilanguage_translations_reset'])) { + $cache = Zend_Registry::get('Zend_Translate'); + $cache::clearCache(); + } + + $post = array_intersect_key($post, $this->_options); + foreach ($post as $optionKey => $optionValue) { + if (isset($post[$optionKey])) { + switch ($optionKey) { + case 'multilanguage_locales': + case 'multilanguage_locales_admin': + case 'multilanguage_elements': + $post[$optionKey] = serialize($post[$optionKey]); + break; + } + set_option($optionKey, $post[$optionKey]); + } + } + } + + public function hookDefineRoutes($args) + { + $router = $args['router']; + $router->addRoute( + 'multilanguage-setlocale', + new Zend_Controller_Router_Route( + 'setlocale', + array( + 'module' => 'multilanguage', + 'controller' => 'setlocale', + 'action' => 'index', + ) + ) + ); + } + + public function hookAdminHead() + { + queue_css_file('multilanguage'); + queue_js_file('multilanguage'); + $enabledLocales = unserialize(get_option('multilanguage_locales_admin')); + if ($enabledLocales) { + queue_css_file('flag-icon-css/css/flag-icon.min'); + } + } + + public function hookAdminFooter() + { + echo "
    + +
    "; + + echo " + "; + } + + public function hookPublicHead() + { + queue_css_file('locale-switcher'); + queue_css_file('flag-icon-css/css/flag-icon.min'); + } + + public function hookPublicHeader($args) + { + if (get_option('multilanguage_append_header')) { + echo $args['view']->localeSwitcher(); + } + } + + public function hookUsersForm($args) + { + $form = $args['form']; + $user = $args['user']; + + $defaultCode = $this->getDefaultLocaleCode(); + $userLang = ($user && $user->id) ? $this->getUserLang($user, $defaultCode) : $defaultCode; + $availableCodes = $this->prepareLocaleCodes($userLang); + + $form->addElement('select', 'multilanguage_locale_code', array( + 'label' => __('Preferred language'), + 'description' => __('Default language is %s.', $availableCodes[$defaultCode]), + 'multiOptions' => $availableCodes, + 'value' => $userLang, + 'required' => false, + )); + } + + public function hookAfterSaveUser($args) + { + $post = $args['post']; + $user = $args['record']; + if (isset($post['multilanguage_locale_code'])) { + $prefLanguages = get_db()->getTable('MultilanguageUserLanguage') + ->findBy(array('user_id' => $user->id)); + if (empty($prefLanguages)) { + $prefLanguage = new MultilanguageUserLanguage; + $prefLanguage->user_id = $user->id; + } else { + $prefLanguage = $prefLanguages[0]; + } + + $defaultCode = $this->getDefaultLocaleCode(); + $availableCodes = $this->prepareLocaleCodes(); + $userLang = $post['multilanguage_locale_code']; + $prefLanguage->lang = isset($availableCodes[$userLang]) + ? $userLang + : $defaultCode; + $prefLanguage->save(); + } + } + + public function hookAfterSaveSimplePagesPage($args) + { + $this->saveMultilangueRecord($args); + } + + public function hookAfterSaveExhibit($args) + { + $this->saveMultilangueRecord($args); + + // Set language of all exhibit pages to the exhibit’s one. + $exhibit = $args['record']; + $contentLanguage = $this->localeCodeRecord($exhibit); + $lang = $contentLanguage->lang ? $contentLanguage->lang : null; + $this->updateOrDeleteExhibitPagesLang($exhibit->id, $lang); + } + + public function hookAfterSaveExhibitPage($args) + { + // Force the lang of the exhibit page. + $record = $args['record']; + $exhibit = get_record_by_id('Exhibit', $record->exhibit_id); + $contentLanguage = $this->localeCodeRecord($exhibit); + $lang = $contentLanguage->lang ? $contentLanguage->lang : null; + $post = $args['post']; + $post['locale_code'] = $lang; + $args['post'] = $post; + $this->saveMultilangueRecord($args); + } + + public function hookAfterDeleteSimplePagesPage($args) + { + $this->deleteMultilangueRecord($args); + } + + public function hookAfterDeleteExhibit($args) + { + $this->deleteMultilangueRecord($args); + } + + public function hookAfterDeleteExhibitPage($args) + { + $this->deleteMultilangueRecord($args); + } + + public function hookExhibitsBrowseSql($args) + { + $this->modelBrowseSql($args, 'Exhibit'); + } + + public function hookSimplePagesPagesBrowseSql($args) + { + $this->modelBrowseSql($args, 'SimplePagesPage'); + } + + protected function modelBrowseSql($args, $model) + { + if (!is_admin_theme()) { + $select = $args['select']; + $db = get_db(); + $alias = $db->getTable('MultilanguageContentLanguage')->getTableAlias(); + $modelAlias = $db->getTable($model)->getTableAlias(); + $select->joinLeft( + array($alias => $db->MultilanguageContentLanguage), + "$alias.record_id = $modelAlias.id", + array() + ); + $select->where("$alias.record_type = ?", $model); + $select->where("$alias.lang = ?", $this->locale_code); + } + } + + public function filterLocale($locale) + { + $enabledLocales = is_admin_theme() + ? unserialize(get_option('multilanguage_locales_admin')) + : unserialize(get_option('multilanguage_locales')); + + // Get the locale from url argument if any, else session, else user, else browser. + $newLocale = null; + + if (empty($enabledLocales)) { + $newLocale = $this->getDefaultLocaleCode(); + } elseif (isset($_GET['lang']) + && ($getLocale = html_escape($_GET['lang'])) + && in_array($getLocale, $enabledLocales) + ) { + $newLocale = $getLocale; + } else { + // Make sure the session has been configured properly + Zend_Registry::get('bootstrap')->bootstrap('Session'); + $session = new Zend_Session_Namespace('locale'); + + if ($session->locale && in_array($session->locale, $enabledLocales)) { + $newLocale = $session->locale; + } else { + $user = current_user(); + if ($user) { + $prefLanguages = $this->_db->getTable('MultilanguageUserLanguage') + ->findBy(array('user_id' => $user->id)); + if ($prefLanguages) { + $userPrefLanguage = reset($prefLanguages); + $newLocale = $userPrefLanguage->lang; + } + } + + // Get the locale from the browser. + // TODO Get the locale from the browser: to be simplified. + if (empty($newLocale)) { + $defaultCode = $this->getDefaultLocaleCode(); + $codes = $enabledLocales; + //dump the site's default code to the end as a fallback + $codes[] = $defaultCode; + $browserCodes = array_keys(Zend_Locale::getBrowser()); + $match = false; + foreach ($browserCodes as $browserCode) { + if (in_array($browserCode, $codes)) { + $newLocale = $browserCode; + $match = true; + break; + } + } + if (!$match) { + // Failed to find browserCode in our language codes. + // Try to match a two character code and set it to + // the closest equivalent if available. + $shortcodes = array(); + foreach ($codes as $c) { + $shortcodes[] = substr($c, 0, 2); + } + foreach ($browserCodes as $bcode) { + if (in_array($bcode, $shortcodes)) { + $lenCodes = count($codes); + for ($i = 0; $i < $lenCodes; $i++) { + if (strcmp($bcode, $shortcodes[$i]) == 0) { + $newLocale = $codes[$i]; + break 2; + } + } + } + } + } + + // From plugin Locale Switcher. + if (empty($newLocale)) { + if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { + $languages = array_map(function ($l) { + list($lang, $q) = array_pad(explode(';', $l), 2, null); + return str_replace('-', '_', trim($lang)); + }, explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE'])); + + foreach ($languages as $language) { + if (in_array($language, $enabledLocales)) { + $newLocale = $language; + break; + } + } + } + + if (empty($newLocale)) { + $newLocale = $defaultCode; + } + } + } + } + } + + $this->locale_code = $newLocale; + + //weird to be adding filters here, but translations weren't happening consistently when it was in setUp + //@TODO: check if this oddity is due to setting the priority high + $this->addFilterElements(); + + return $this->locale_code; + } + + public function filterAdminNavigationGlobal($nav) + { + $showCountryCode = (bool) get_option('multilanguage_show_countrycode'); + $enabledLocales = unserialize(get_option('multilanguage_locales_admin')); + if (empty($enabledLocales)) { + return $nav; + } + + $currentLocale = Zend_Registry::get('bootstrap')->getResource('Locale')->toString(); + $currentUrl = Zend_Controller_Front::getInstance()->getRequest()->getRequestUri(); + $view = get_view(); + + foreach ($enabledLocales as $locale) { + $language = Zend_Locale::getTranslation(substr($locale, 0, 2), 'language'); + $country = $view->localeToCountry($locale); + + $url = url('setlocale', array('locale' => $locale, 'redirect' => $currentUrl)); + $title = locale_human($locale); + if (!$showCountryCode) $class = 'flag-icon flag-icon-' . strtolower($country); + if ($locale === $currentLocale) { + $class .= ' active'; + } + $link = array( + 'label' => ($showCountryCode ? '[' . $locale . ']' : null), + 'uri' => $url, + 'class' => $class, + 'title' => $title, + ); + $nav[] = $link; + } + + return $nav; + } + + public function filterGuestUserLinks($links) + { + $links['Multilanguage'] = array( + 'label' => __('Preferred Language'), + 'uri' => url('multilanguage/user-language/user-language'), + ); + return $links; + } + + protected function addFilterElements() + { + $translatableElements = unserialize(get_option('multilanguage_elements')); + if (is_array($translatableElements)) { + foreach ($translatableElements as $elementSet => $elements) { + foreach ($elements as $element) { + add_filter(array('Display', 'Item', $elementSet, $element), array($this, 'filterTranslate'), 1); + add_filter(array('ElementInput', 'Item', $elementSet, $element), array($this, 'filtertranslateField'), 1); + add_filter(array('Display', 'Collection', $elementSet, $element), array($this, 'filterTranslate'), 1); + add_filter(array('ElementInput', 'Collection', $elementSet, $element), array($this, 'filterTranslateField'), 1); + add_filter(array('Display', 'File', $elementSet, $element), array($this, 'filterTranslate'), 1); + add_filter(array('ElementInput', 'File', $elementSet, $element), array($this, 'filterTranslateField'), 1); + } + } + } + } + + public function filterTranslateField($components, $args) + { + $record = $args['record']; + $element = $args['element']; + $type = get_class($record); + $languages = unserialize(get_option('multilanguage_locales')); + $html = __('Translate to:'); + foreach ($languages as $code) { + $html .= sprintf( + '
  • %s
  • ', + $element->id, + $code, + $record->id, + $type, + $code + ); + } + $components['form_controls'] .= '
      ' . $html . '
    '; + return $components; + } + + public function filterTranslate($translateText, $args) + { + $db = $this->_db; + $record = $args['record']; + //since I'm being cheap and not differentiating Items vs Collections + //or any other ActsAsElementText up above in the filter definitions (themselves weird), + //I risk getting null values here + //after the filter happens for 'element_text' + if (!empty($args['element_text'])) { + $elementText = $args['element_text']; + + $elementId = $elementText->element_id; + + $translation = $db->getTable('MultilanguageTranslation') + ->getTranslation($record->id, get_class($record), $elementId, $this->locale_code, $translateText); + if ($translation) { + $translateText = $translation->translation; + } + } + return $translateText; + } + + protected function getDefaultLocaleCode() + { + if (plugin_is_active('Locale')) { + $plugin = new LocalePlugin(); + return $plugin->filterLocale(null); + } + + $defaultCodes = Zend_Locale::getDefault(); + return current(array_keys($defaultCodes)); + } + + protected function getUserLang($user, $defaultCode = null) + { + $prefLanguages = get_db()->getTable('MultilanguageUserLanguage') + ->findBy(array('user_id' => $user->id)); + $userLang = empty($prefLanguages) ? $defaultCode : $prefLanguages[0]->lang; + return $userLang; + } + + /** + * Get the list of available language code. + * + * @param string $lang Add this language code. + * @return array + */ + protected function prepareLocaleCodes($lang = null) + { + $availableCodes = array(); + $defaultCode = $this->getDefaultLocaleCode(); + + if (!isset($lang)) { + $lang = $defaultCode; + } + + $codes = unserialize(get_option('multilanguage_locales')) ?: array(); + array_unshift($codes, $defaultCode); + foreach ($codes as $code) { + $parts = explode('_', $code); + if (isset($parts[1])) { + $langCode = $parts[0]; + $regionCode = $parts[1]; + try { + $language = Zend_Locale::getTranslation($langCode, 'language', $langCode); + $region = Zend_Locale::getTranslation($regionCode, 'territory', $langCode); + } catch (Exception $e) { + $language = $langCode; + $region = ''; + } + } else { + try { + $language = Zend_Locale::getTranslation($code, 'language', $code); + } catch (Exception $e) { + $language = $code; + } + $region = ''; + } + if ($region != '') { + $region = " - $region"; + } + $availableCodes[$code] = ucfirst($language) . $region . " ($code)"; + } + + return $availableCodes; + } + + protected function saveMultilangueRecord($args) + { + $post = $args['post']; + $record = $args['record']; + + if (array_key_exists('locale_code', $post)) { + $this->processLocaleCodeRecord($record, $post); + } + + if (array_key_exists('related_records', $post)) { + $this->processRelatedRecordsRecord($record, $post); + } + } + + protected function processLocaleCodeRecord($record, $post) + { + $localeCode = $post['locale_code']; + + // Remove the locale code of the record if wanted and if any. + if (empty($localeCode)) { + if ($post['insert']) { + return; + } + $localeCodeRecord = $this->localeCodeRecord($record); + if ($localeCodeRecord) { + $localeCodeRecord->delete(); + return; + } + } + + // Check the locale code. + $availableCodes = $this->prepareLocaleCodes(); + if (!isset($availableCodes[$localeCode])) { + return; + } + + $localeCodeRecord = $this->localeCodeRecord($record); + + // Don't update the locale code if unchanged. + if ($localeCodeRecord && $localeCodeRecord->lang === $localeCode) { + return; + } + + if (empty($localeCodeRecord)) { + $localeCodeRecord = new MultilanguageContentLanguage; + $localeCodeRecord->record_type = get_class($record); + $localeCodeRecord->record_id = (int) $record->id; + } + + $localeCodeRecord->lang = $localeCode; + $localeCodeRecord->save(); + } + + protected function processRelatedRecordsRecord($record, $post) + { + // No relation can be set for a new record. + if ($post['insert']) { + return; + } + + $relatedRecordIds = array_filter(array_map('intval', $post['related_records'])); + sort($relatedRecordIds); + + $recordType = get_class($record); + $recordId = (int) $record->id; + + // To avoid multiple checks, all related records are removed and saved. + // Anyway, they are a few usually. + $relatedRecords = $this->relatedRecords($record, null, true); + foreach ($relatedRecords as $relatedRecord) { + $relatedRecord->delete(); + } + + // All related records or new related records should be removed too. + // TODO Just remove the related record from the list of its related records. + foreach ($relatedRecordIds as $relatedRecordId) { + $relatedRecords = $this->relatedRecords($recordType, $relatedRecordId, true); + foreach ($relatedRecords as $relatedRecord) { + $relatedRecord->delete(); + } + } + + // Create remaining (new) related records. + foreach ($relatedRecordIds as $relatedRecordId) { + if ($relatedRecordId == $recordId) { + continue; + } + $relatedRecord = new MultilanguageRelatedRecord; + $relatedRecord->record_type = $recordType; + // Keep record id lower than related id to simplify search. + if ($recordId < $relatedRecordId) { + $relatedRecord->record_id = $recordId; + $relatedRecord->related_id = $relatedRecordId; + } else { + $relatedRecord->record_id = $relatedRecordId; + $relatedRecord->related_id = $recordId; + } + $relatedRecord->save(); + } + } + + protected function deleteMultilangueRecord($args) + { + $record = $args['record']; + $localeCodeRecord = $this->localeCodeRecord($record); + if ($localeCodeRecord) { + $localeCodeRecord->delete(); + } + $relatedRecords = $this->relatedRecords($record, null, true); + foreach ($relatedRecords as $relatedRecord) { + $relatedRecord->delete(); + } + } + + /** + * Get the locale code of a record, if any. + * + * @param Omeka_Record_AbstractRecord $record + * @return MultilanguageContentLanguage|null + */ + protected function localeCodeRecord(Omeka_Record_AbstractRecord $record) + { + $table = get_db()->getTable('MultilanguageContentLanguage'); + $select = $table->getSelectForFindBy( + array( + 'record_type' => get_class($record), + 'record_id' => $record->id, + ) + ); + $contentLanguage = $table->fetchObject($select); + return $contentLanguage; + } + + /** + * Get the related records of a record, if any. + * + * @param Omeka_Record_AbstractRecord|string $record Record or record type. + * @param int $recordId + * @param bool $included Include the specified record to the list. + * @return MultilanguageRelatedRecord[]|null + */ + protected function relatedRecords($record, $recordId = null, $included = false) + { + if (is_object($record)) { + $recordType = get_class($record); + $recordId = $record->id; + } else { + $recordType = $record; + } + + $records = get_db()->getTable('MultilanguageRelatedRecord') + ->findRelatedRecords($recordType, $recordId, $included); + return $records; + } + + /** + * Force the language of all pages to the exhibit's one. + * + * @param int $exhibitId + * @param string|null $lang + */ + protected function updateOrDeleteExhibitPagesLang($exhibitId, $lang) + { + $db = $this->_db; + if (empty($lang)) { + $sql = " DELETE FROM `{$db->MultilanguageContentLanguage}` WHERE `id` in ( - SELECT DISTINCT `id` FROM `{$db->ExhibitPage}` - WHERE `exhibit_id` = $exhibitId + SELECT DISTINCT `id` FROM `{$db->ExhibitPage}` + WHERE `exhibit_id` = $exhibitId; ); - "; - } else { - $sql = " + "; + } else { + $sql = " INSERT INTO `{$db->MultilanguageContentLanguage}` (`record_type`, `record_id`, `lang`) SELECT 'ExhibitPage', `id`, '$lang' FROM `{$db->ExhibitPage}` -WHERE `exhibit_id` = $exhibitId -; - "; - } - $db->query($sql); - } +WHERE `exhibit_id` = $exhibitId; + "; + } + $db->query($sql); + } } From 3615970d5ab875524ade03c5b386b9f6dd9ac624 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Sat, 27 Mar 2021 22:16:42 +0100 Subject: [PATCH 12/19] Added parameter to locale_human function The parameter allows to choose whether to return just the language name, or the language name followed by the country name (when required) --- helpers/functions.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/helpers/functions.php b/helpers/functions.php index d079b1c..5cf9391 100644 --- a/helpers/functions.php +++ b/helpers/functions.php @@ -2,12 +2,13 @@ // From plugin LocaleSwitcher. /** - * Convert a standard locale string (en_US) into the language and region. + * Convert a standard locale string (en_US) into the language and region. * * @param string $locale + * @param boolean $justLanguage * @return string */ -function locale_human($locale) +function locale_human($locale, $justLanguage=false) { $parts = explode('_', $locale); if (isset($parts[1])) { @@ -23,7 +24,11 @@ function locale_human($locale) $region = " - $region"; } - return ucfirst($language) . $region; + if (!$justLanguage) { + return ucfirst($language) . $region; + } else { + return ucfirst($language); + } } /** From 1c69d9a08e594bd0b7b7d5ff4a04e1a8cdfb7f04 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Sat, 27 Mar 2021 22:18:13 +0100 Subject: [PATCH 13/19] Added language display modes Now language can be shown as a flag, as a 2-letters code or in full --- views/shared/common/locale-switcher.php | 102 ++++++++++++++---------- 1 file changed, 58 insertions(+), 44 deletions(-) diff --git a/views/shared/common/locale-switcher.php b/views/shared/common/locale-switcher.php index 5928f13..7213e39 100644 --- a/views/shared/common/locale-switcher.php +++ b/views/shared/common/locale-switcher.php @@ -1,47 +1,61 @@ getResource('Locale')->toString(); - $request = Zend_Controller_Front::getInstance()->getRequest(); - $currentUrl = $request->getRequestUri(); - $query = array(); - // Append the record for managed plugins in public front-end. - if (!is_admin_theme()): - $module = $request->getModuleName(); - switch ($module): - case 'exhibit-builder': - $action = $request->getActionName(); - switch ($action): - case 'summary': - $query['record_type'] = 'Exhibit'; - $exhibit = get_current_record('exhibit'); - $query['id'] = $exhibit->id; - break; - case 'show': - $query['record_type'] = 'ExhibitPage'; - $exhibitPage = get_current_record('exhibit_page'); - $query['id'] = $exhibitPage->id; - break; - endswitch; - break; - case 'simple-pages': - $query['record_type'] = 'SimplePagesPage'; - $query['id'] = $request->getParam('id'); - break; - endswitch; - endif; - ?> -
      - - localeToCountry($locale); ?> -
    • - - - - - $locale, 'redirect' => $currentUrl) + $query); ?> - - -
    • - -
    + $currentLocale = Zend_Registry::get('bootstrap')->getResource('Locale')->toString(); + $request = Zend_Controller_Front::getInstance()->getRequest(); + $currentUrl = $request->getRequestUri(); + $query = array(); + // Append the record for managed plugins in public front-end. + if (!is_admin_theme()): + $module = $request->getModuleName(); + switch ($module): + case 'exhibit-builder': + $action = $request->getActionName(); + switch ($action): + case 'summary': + $query['record_type'] = 'Exhibit'; + $exhibit = get_current_record('exhibit'); + $query['id'] = $exhibit->id; + break; + case 'show': + $query['record_type'] = 'ExhibitPage'; + $exhibitPage = get_current_record('exhibit_page'); + $query['id'] = $exhibitPage->id; + break; + endswitch; + break; + case 'simple-pages': + $query['record_type'] = 'SimplePagesPage'; + $query['id'] = $request->getParam('id'); + break; + endswitch; + endif; + ?> +
      + localeToCountry($locale); + switch (get_option('multilanguage_display_mode')) { + case "code": + $content = "[" . strtolower($country) . "]"; + break; + case "name": + $content = "" . locale_human($locale, true) . ""; + break; + default: + $content = ""; + } + ?> +
    • + + + + + $locale, 'redirect' => $currentUrl) + $query); ?> + + + + +
    • + +
    From 0f208522a194b529b1c5a5dc69902d455fa8c8e3 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Sat, 27 Mar 2021 22:43:19 +0100 Subject: [PATCH 14/19] Files updated --- languages/it.mo | Bin 1708 -> 2725 bytes languages/it.po | 118 ++++++++++++++++++++++++++++------------- languages/template.pot | 97 ++++++++++++++++++++++++--------- 3 files changed, 152 insertions(+), 63 deletions(-) diff --git a/languages/it.mo b/languages/it.mo index d9294ead8b144af7371e23fef7619553dcc68828..2306650eb905fd8622b6c04ab7ecbb89ce415590 100644 GIT binary patch literal 2725 zcmbtVO^6&t6mB(9GyW2P5eY8~k{z-=KTE{TtV>9Cv#^lWC7A>SL29~dW-41<)#<9< z$ws|+%f(wj5RZyCZ-Ss+a`qy4QShWUPlA^m)bI7r{GjpTFf(6QS9R6*zW3hOKOaAG zC&1?={9eZIHy+^g^#e0}0hixkd=&Tt@C5KD;0Ev>@Cb12!64vu8^9-lSAoZYG4Orh z1o$ZM58!jaKY_=9&ps3cPXJEKOW zU|#P5IhK!so4_xD%;z5PM{qrcAb9>49K!MZ1#AM3J`w~yU>nHiUk9=tH-OIrKLoxA z{1o^J@LM3SdmBOVxe<`Z9{?W%-UdDmyaU8H_zZu~0KWj<2Hpj-4!aP6q8Q0 zDosq@(pZXEX2IrIM*HN)k`n1fEWDthk~(&{Cp;b6oF>9}ej*Y3l6)qN(^xjpvK4Id zIa_ila_wiQD@U)mRM z^09KM7KbvX10{+F#@6oBQkoC6iry(BT3R8goh+CeiM3#!=AIP3hVN$lWCHS+Dz&B; zR2@JGhgDCzU>DJ;TH9bRlS7$h*tuR2>=gup%QCWAOcyn_H{N0Fq$lV;RZUsrXfl=t zB5UcG(Ne1Okut8`uaxCA?fNvgL^h+Pg0X8ShhcFwKRuC|q&!9Dz$g(W=RCKnv+Hc} zp1~DyAZc@qs3itc%Lr*j;_I^(!lxn5E!1+#OIjXSKc=FhNT7hqh{>r~He3I;8OH|Y zCu0?j=k|$&;k?$oWITPiI4hlMTayaC}LEn;=A~VPrG!O%eG}k*TGb(~Z zMkG^_*-%8%t)Mb9R6gdE<07q92PfMjB-dVtF5ylbUPDJgw;tIM%ukUf%R=G_x}6umF*vQ8upjx5KsBI&KFvT6odG z&5+I>tqqi)GVh_I8+$s>gbufDmbe}n<;Jq1lN;1+t~c1LRD^2BR=Gf} z(<-WmeRJxRqmjzZNX@wp_c1C<>r-4p&Wl@6UKaJvSArBpB1si*SNSLIpkfblt0;rj za(6<>IFHmoX;ra+xzt2Z@+fa*6rA_&=Y?@zK!+)r30j^_+Gg+u)Gtffq9e4fw*Vb- zNN&N%+ZBXGHsw*l%SBRS?*n+2Fvk8Py2LsVM40$bxYzZmf45bkQN*kWwzUVDP$1)E zrZSD-3*#x}G7^Tz@q3vF*lZzquxn$`R@*yfJve;I)t=rz}CCda1&VoE1f~*mc4Bf19qeEF|j1W(Hk5AAW1f zWPtH4SEhvPpEJQuUiA{&afB$+Oqocf YLQA%0EukshfG2uexifbTQU-7S8&I)Tv1=4T6vpRtVpilEq~Qt%JZLa?y2&`wa%Z}!f^lrGHvX6DVC?|W|^&pesveVp>{F?>fc zY8ZFi0^iR*N-kmk3u6*vvBFptTnER%2%G@B;0$;RoC5EHP4E#o3w{E}!QbFXaQpyc z4;kyRIwns1E%*V!_uwMd&ppPb!LQ&caAbtBBjA|<=Rha803HK3Kqq(=JPkeoo#1QG z<-Y-6fuBKl&+Z}oR*D~$<;m2_)bcfv#<_^4Vdsloue!Xt)1fW0hOOs`rDPD@zv3&Z zOlEB@x24uH8eUU;J2+ij@|q{GH%#87Zk9;ib~43%Z+5ODhe5-|4FR1k9I%R8EmD&R zD|y)0@OkmVn{PD*??7y+-mx}o1cBa#UM!IDRk1`@fYA{(upWveDrhHjEd<)B`7RIq-vIox%N+heuj-QnXG z!<=}Q?>*(x7^z`hi%3}-C%z3?CXO=KJszn)8Dm20uj@B~pF5+oYz5AALD4*&oF diff --git a/languages/it.po b/languages/it.po index 634f682..184eb98 100644 --- a/languages/it.po +++ b/languages/it.po @@ -24,56 +24,100 @@ msgstr "" msgid "Multilanguage" msgstr "Multilingua" -#: MultilanguagePlugin.php:56 MultilanguagePlugin.php:62 -#: views/shared/user-language/user-language.php:2 +#: MultilanguagePlugin.php:56 MultilanguagePlugin.php:335 +#: MultilanguagePlugin.php:56 MultilanguagePlugin.php:579 +#: views/shared/user-language/user-language.php:3 msgid "Preferred Language" msgstr "Lingua preferita" -#: MultilanguagePlugin.php:64 -msgid "Multilanguage Content" -msgstr "Contenuto multilingua" +#: MultilanguagePlugin.php:335 +msgid "Default language is %s." +msgstr "La lingua predefinita è %s." -#: MultilanguagePlugin.php:228 +#: MultilanguagePlugin.php:608 msgid "Translate to: " -msgstr "Traduci in:" +msgstr "Traduci in: " -#: config_form.php:4 +#: views/admin/plugins/multilanguage-config-form.php:2 +msgid "To learn more about translating the core interfaces, %sread this%s." +msgstr "Per saperne di più sulla traduzione dell'interfaccia principale, %sleggi questo%s." + +#: views/admin/plugins/multilanguage-config-form.php:7 +msgid "Automatically append to header" +msgstr "Aggiungi automaticamente all'intestazione" + +#: views/admin/plugins/multilanguage-config-form.php:10 +msgid "If checked, the switcher will be automatically displayed via the hook \"public_header\", else you need to put it in your theme." +msgstr "Se selezionato, le opzioni di scelta verranno automaticamente mostrate tramite l'hook \"public_header\", altrimenti dovrai inserirli manualmente nel tuoi tema." + +#: views/admin/plugins/multilanguage-config-form.php:18 +msgid "Reset translations" +msgstr "Annulla le traduzioni" + +#: views/admin/plugins/multilanguage-config-form.php:22 +msgid "Reset all translations when files in \"plugins/Translations/languages\" or \"themes/my-theme/languages\" were updated manually." +msgstr "Annulla tutte le traduzioni quandi i file in \"plugins/Translations/languages\" or \"themes/my-theme/languages\" sono aggiornati manualmente." + +#: views/admin/plugins/multilanguage-config-form.php:30 +msgid "Language display mode" +msgstr "Modo di visualizzazione lingua" + +#: views/admin/plugins/multilanguage-config-form.php:33 +msgid "Select the language display mode for your site (both Admin and Public side)." +msgstr "Seleziona il modo di visualizzazione lingua per il tuo sito (sia lato Admin che Pubblico)" + +#: views/admin/plugins/multilanguage-config-form.php:36 +msgid "Flag (default)" +msgstr "Bandiera (predefinito)" + +#: views/admin/plugins/multilanguage-config-form.php:37 +msgid "2-letters language code" +msgstr "Codice lingua di 2 lettere" + +#: views/admin/plugins/multilanguage-config-form.php:38 +msgid "Full language name" +msgstr "Nome intero della lingua" + +#: views/admin/plugins/multilanguage-config-form.php:45 +msgid "Languages" +msgstr "Lingue" + +#: views/admin/plugins/multilanguage-config-form.php:48 msgid "Select the languages into which your site can be translated." -msgstr "Seleziona le lingue in cui può essere tradotto il tuo sito." +msgstr "Seleziona le lingue in vuoi rendere traducibile il tuo sito" -#: config_form.php:41 -msgid "" -"The languages available to translate content. To learn more about " -"translating the core interfaces, read this." -msgstr "Lingue disponibili per tradurre i contenuti. Per scoprire di più riguardo alla traduzione delle interfacce principali, leggi questo." +#: views/admin/plugins/multilanguage-config-form.php:52 +msgid "Language" +msgstr "Lingua" -#: config_form.php:49 -msgid "Check the metadata fields that you want to make translatable." -msgstr "Seleziona i campi di metadati che vuoi rendere traducibili." +#: views/admin/plugins/multilanguage-config-form.php:53 +msgid "Code" +msgstr "Codice" -#: views/admin/translations/content-language.php:2 -msgid "Content Languages" -msgstr "Lingue dei contenuti" +#: views/admin/plugins/multilanguage-config-form.php:54 +msgid "Public" +msgstr "Pubblico" -#: views/admin/translations/content-language.php:25 -#, php-format -msgid "Default language is %s" -msgstr "La lingua predefinita è %s" +#: views/admin/plugins/multilanguage-config-form.php:55 +msgid "Admin" +msgstr "Admin" -#: views/admin/translations/content-language.php:26 -msgid "Exhibits" -msgstr "Esposizione" +#: views/admin/plugins/multilanguage-config-form.php:80 +msgid "Record Elements" +msgstr "Elementi dei record" -#: views/admin/translations/content-language.php:43 -msgid "Simple Pages" -msgstr "Simple Pages" +#: views/admin/plugins/multilanguage-config-form.php:83 +msgid "Check the metadata fields that you want to make translatable." +msgstr "Seleziona i campi di metadati che vuoi rendere traducibili" -#: views/shared/user-language/user-language.php:40 -msgid "Select your prefered language" -msgstr "Scegli la tua lingua preferita" +#: views/shared/user-language/user-language.php:8 +msgid "Select your preferred language" +msgstr "Seleziona la tua lingua preferita" -#: views/shared/user-language/user-language.php:43 -#, php-format +#: views/shared/user-language/user-language.php:11 msgid "The default language is %s" -msgstr "La lingua predefinita è %s" +msgstr "La lingua predefinita è" + +#: views/shared/user-language/user-language.php:20 +msgid "Save Changes" +msgstr "Salva modifiche" \ No newline at end of file diff --git a/languages/template.pot b/languages/template.pot index 5554fb7..0950432 100644 --- a/languages/template.pot +++ b/languages/template.pot @@ -9,6 +9,7 @@ msgstr "" "Project-Id-Version: Locale\n" "Report-Msgid-Bugs-To: http://github.com/patrickmj/Multilanguage/issues\n" "POT-Creation-Date: 2014-09-21 17:49-0500\n" +"PO-Revision-Date: 2021-03-27 22:33+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,56 +21,100 @@ msgstr "" msgid "Multilanguage" msgstr "" -#: MultilanguagePlugin.php:56 MultilanguagePlugin.php:62 -#: views/shared/user-language/user-language.php:2 +#: MultilanguagePlugin.php:56 MultilanguagePlugin.php:335 +#: MultilanguagePlugin.php:56 MultilanguagePlugin.php:579 +#: views/shared/user-language/user-language.php:3 msgid "Preferred Language" msgstr "" -#: MultilanguagePlugin.php:64 -msgid "Multilanguage Content" +#: MultilanguagePlugin.php:335 +msgid "Default language is %s." msgstr "" -#: MultilanguagePlugin.php:228 +#: MultilanguagePlugin.php:608 msgid "Translate to: " msgstr "" -#: config_form.php:4 +#: views/admin/plugins/multilanguage-config-form.php:2 +msgid "To learn more about translating the core interfaces, %sread this%s." +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:7 +msgid "Automatically append to header" +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:10 +msgid "If checked, the switcher will be automatically displayed via the hook "public_header", else you need to put it in your theme." +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:18 +msgid "Reset translations" +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:22 +msgid "Reset all translations when files in "plugins/Translations/languages" or "themes/my-theme/languages" were updated manually." +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:30 +msgid "Language display mode" +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:33 +msgid "Select the language display mode for your site (both Admin and Public side)." +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:36 +msgid "Flag (default)" +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:37 +msgid "2-letters language code" +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:38 +msgid "Full language name" +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:45 +msgid "Languages" +msgstr "" + +#: views/admin/plugins/multilanguage-config-form.php:48 msgid "Select the languages into which your site can be translated." msgstr "" -#: config_form.php:41 -msgid "" -"The languages available to translate content. To learn more about " -"translating the core interfaces, read this." +#: views/admin/plugins/multilanguage-config-form.php:52 +msgid "Language" msgstr "" -#: config_form.php:49 -msgid "Check the metadata fields that you want to make translatable." +#: views/admin/plugins/multilanguage-config-form.php:53 +msgid "Code" msgstr "" -#: views/admin/translations/content-language.php:2 -msgid "Content Languages" +#: views/admin/plugins/multilanguage-config-form.php:54 +msgid "Public" msgstr "" -#: views/admin/translations/content-language.php:25 -#, php-format -msgid "Default language is %s" +#: views/admin/plugins/multilanguage-config-form.php:55 +msgid "Admin" msgstr "" -#: views/admin/translations/content-language.php:26 -msgid "Exhibits" +#: views/admin/plugins/multilanguage-config-form.php:80 +msgid "Record Elements" msgstr "" -#: views/admin/translations/content-language.php:43 -msgid "Simple Pages" +#: views/admin/plugins/multilanguage-config-form.php:83 +msgid "Check the metadata fields that you want to make translatable." msgstr "" -#: views/shared/user-language/user-language.php:40 -msgid "Select your prefered language" +#: views/shared/user-language/user-language.php:8 +msgid "Select your preferred language" msgstr "" -#: views/shared/user-language/user-language.php:43 -#, php-format +#: views/shared/user-language/user-language.php:11 msgid "The default language is %s" msgstr "" + +#: views/shared/user-language/user-language.php:20 +msgid "Save Changes" +msgstr "" \ No newline at end of file From 478369ac1626e214ea8178de52ce654a6457c126 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Sat, 27 Mar 2021 22:47:39 +0100 Subject: [PATCH 15/19] Update README.md --- README.md | 43 ++++++------------------------------------- 1 file changed, 6 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 212b904..cd6435c 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,7 @@ Multilanguage (plugin for Omeka) [Multilanguage] is an [Omeka] plugin that is a limited attempt to make parts of Omeka multilanguage. It integrates the [locale switcher] from [BibLibre] for -public front-end and admin back-end, and [Translations], for management of -translations of specific or hard coded theme strings. +public front-end and admin back-end. Installation @@ -14,6 +13,9 @@ Uncompress files and rename plugin folder `Multilanguage`. Then install it like any other Omeka plugin and follow the config instructions. +The plugin [Translations] may be useful too to translate hard-coded strings of +the theme. + Configuration ------------- @@ -69,36 +71,6 @@ The language of the exhibit pages is forced to their exhibit’s one. The pages and exhibits with a language that doesn’t match the current language are still accessible, as long as the link is known or is hard coded somewhere. -### Translations of specific strings - -Often, the theme contains hard-coded strings. To get them translated, you first -need to translate them, then to make them available in Omeka. - -#### Translations of strings - -In Omeka, the translations are managed with `.po` files in the directory `application/languages/` -for the core and in the directory `languages/` of each enabled plugin. This -plugin works the same. - -Simply update the translations files either in the directory `languages/` of the -current theme, either in the directory `languages/` of the plugin: the main one -`template.pot` and each translation like `fr.po` and `fr.mo`. You can add any -language, but respect the names of the files (see `application/languages/`) and -copy the two files `.po` and `.mo` for each language. - -The translations themselves can be created with a tool like [poedit], or [lokalize], -or any other compliant software or online service. - -#### Reset cache of translations - -Omeka uses a cache to store translations. To reset it, go the the config page of -the plugin and check the box. It must be done each time a language is updated. - -When the cache is not cleared, you shoud reset the cache manually. You can -restart the web server or to remove all files starting with `omeka_i18n_cache` -in the temp directory of the web server, usually `/tmp`, or `/tmp/systemd-private-xxx/tmp`. -Or wait some hours for the automatic refresh of the translations. - ### Theme adaptation #### Standard functions @@ -121,8 +93,6 @@ metadata($item, array('Dublin Core', 'Description'), array('snippet' => 150)); html_escape(snippet(metadata($item, array('Dublin Core', 'Description'), array('no_escape' => true)), 0, 150)); ``` -For the function metadata(), the key `display_title` may not be translated, so -use `array('Dublin Core', 'Title')`. #### Specific functions @@ -225,14 +195,13 @@ Copyright * Copyright 2015-2016 Patrick Murray-John (see [patrickmj] on Github) * Copyright 2017 BibLibre (see [BibLibre] on Github) * Copyright Daniel Berthereau, 2018 (see [Daniel-KM] on GitHub) +* Copyright Daniele Binaghi, 2021 (see [DBinaghi] on GitHub) [Multilanguage]: https://github.com/patrickmj/multilanguage [Omeka]: https://omeka.org [locale switcher]: https://github.com/Daniel-KM/Omeka-plugin-LocaleSwitcher [Translations]: https://github.com/Daniel-KM/Omeka-plugin-Translations -[poedit]: https://poedit.net -[lokalize]: https://www.kde.org/applications/development/lokalize [`helpers/functions.php`]: https://github.com/patrickmj/Multilanguage/blob/master/helpers/functions.php [flag-icon-css]: http://flag-icon-css.lip.is/ [plugin issues]: https://github.com/patrickmj/Multilanguage/issues @@ -240,4 +209,4 @@ Copyright [patrickmj]: https://github.com/patrickmj [BibLibre]: https://github.com/BibLibre [Daniel-KM]: https://github.com/Daniel-KM "Daniel Berthereau" - +[DBinaghi]: https://github.com/DBinaghi "Daniele Binaghi" From f2bf923487def89555f641422eacf543f1b808d1 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Sat, 27 Mar 2021 22:48:14 +0100 Subject: [PATCH 16/19] Update plugin.ini --- plugin.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.ini b/plugin.ini index ef828a0..c3194ca 100644 --- a/plugin.ini +++ b/plugin.ini @@ -5,6 +5,6 @@ description = "Creates multilanguage support for Omeka, with a locale switcher. license = "GPL-3.0" link = "https://github.com/patrickmj/Multilanguage" support_link = "https://github.com/patrickmj/Multilanguage/issues" -version = "1.5.0" +version = "1.6.0" omeka_minimum_version = "2.1" omeka_target_version = "2.7" From 49aad9fce77bd5c4661a32844add5952c3f8055d Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Sat, 27 Mar 2021 22:58:47 +0100 Subject: [PATCH 17/19] Added display mode switch for Admin sinde --- MultilanguagePlugin.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/MultilanguagePlugin.php b/MultilanguagePlugin.php index e130efb..b1caf64 100644 --- a/MultilanguagePlugin.php +++ b/MultilanguagePlugin.php @@ -541,7 +541,7 @@ public function filterLocale($locale) public function filterAdminNavigationGlobal($nav) { - $showCountryCode = (bool) get_option('multilanguage_show_countrycode'); + $displayMode = get_option('multilanguage_display_mode'); $enabledLocales = unserialize(get_option('multilanguage_locales_admin')); if (empty($enabledLocales)) { return $nav; @@ -557,12 +557,25 @@ public function filterAdminNavigationGlobal($nav) $url = url('setlocale', array('locale' => $locale, 'redirect' => $currentUrl)); $title = locale_human($locale); - if (!$showCountryCode) $class = 'flag-icon flag-icon-' . strtolower($country); + $class = ''; + $label = null; + + switch ($displayMode) { + case 'code': + $label = '[' . strtolower($country) . ']'; + break; + case 'name': + $label = locale_human($locale, true); + break; + default: + $class = 'flag-icon flag-icon-' . strtolower($country); + } + if ($locale === $currentLocale) { $class .= ' active'; } $link = array( - 'label' => ($showCountryCode ? '[' . $locale . ']' : null), + 'label' => $label, 'uri' => $url, 'class' => $class, 'title' => $title, From 060f9e3bf512b821ac41f6cf11e6deeddb7dce76 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Sat, 27 Mar 2021 23:00:47 +0100 Subject: [PATCH 18/19] Moved $displayMode outside loop --- views/shared/common/locale-switcher.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/views/shared/common/locale-switcher.php b/views/shared/common/locale-switcher.php index 7213e39..b97314b 100644 --- a/views/shared/common/locale-switcher.php +++ b/views/shared/common/locale-switcher.php @@ -32,9 +32,10 @@ ?>
      localeToCountry($locale); - switch (get_option('multilanguage_display_mode')) { + switch ($displayMode) { case "code": $content = "[" . strtolower($country) . "]"; break; From 765edee2f9e8cd10daa6bb6e6dd3edbb3ce7e928 Mon Sep 17 00:00:00 2001 From: DBinaghi <39097246+DBinaghi@users.noreply.github.com> Date: Thu, 2 Sep 2021 17:43:28 +0200 Subject: [PATCH 19/19] Added new line break for flex styling --- MultilanguagePlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MultilanguagePlugin.php b/MultilanguagePlugin.php index b1caf64..e095f17 100644 --- a/MultilanguagePlugin.php +++ b/MultilanguagePlugin.php @@ -629,7 +629,7 @@ public function filterTranslateField($components, $args) $code ); } - $components['form_controls'] .= '
        ' . $html . '
      '; + $components['form_controls'] .= '
        ' . $html . '
      '; return $components; }