diff --git a/actions/change.php b/actions/language_selector/change.php similarity index 55% rename from actions/change.php rename to actions/language_selector/change.php index b94f943..10daa54 100644 --- a/actions/change.php +++ b/actions/language_selector/change.php @@ -1,18 +1,20 @@ language = $new_lang_id; $user->save(); // let other plugins know we updated the language - elgg_trigger_event("update", "language", $user); - } + elgg_trigger_event('update', 'language', $user); + } else { + $cookie = new \ElggCookie('language'); + $cookie->value = $new_lang_id; + elgg_set_cookie($cookie); + } } -forward(REFERER); - \ No newline at end of file +return elgg_ok_response(''); \ No newline at end of file diff --git a/classes/ColdTrick/LanguageSelector/Bootstrap.php b/classes/ColdTrick/LanguageSelector/Bootstrap.php new file mode 100644 index 0000000..4af6f2d --- /dev/null +++ b/classes/ColdTrick/LanguageSelector/Bootstrap.php @@ -0,0 +1,100 @@ +plugin->getPath(); + } + + /** + * {@inheritdoc} + */ + public function load() { + Includer::requireFileOnce($this->getRoot() . '/lib/functions.php'); + } + + /** + * {@inheritdoc} + */ + public function boot() { + $this->setLoggedOutUserLanguages(); + } + + /** + * {@inheritdoc} + */ + public function init() { + $this->registerViews(); + $this->registerEvents(); + $this->registerHooks(); + } + + /** + * {@inheritdoc} + */ + public function upgrade() { + elgg_unset_plugin_setting('allowed_languages', 'language_selector'); + } + + /** + * {@inheritdoc} + */ + protected function registerViews() { + elgg_extend_view('elgg.css', 'language_selector/site.css'); + + if ((bool)elgg_get_plugin_setting('show_in_header', 'language_selector')) { + elgg_extend_view('page/elements/topbar', 'language_selector/dropdown'); + } + } + + /** + * {@inheritdoc} + */ + protected function registerEvents() { + $event = $this->elgg()->events; + + $event->registerHandler('language:merge', 'translation_editor', [Settings::class, 'invalidateSetting']); + $event->registerHandler('all', 'plugin', [Settings::class, 'invalidateSetting']); + } + + protected function registerHooks() { + $hooks = $this->elgg()->hooks; + + $hooks->registerHandler('all', 'plugin', [Settings::class, 'invalidateSetting']); + } + + /** + * {@inheritdoc} + */ + protected function setLoggedOutUserLanguages() { + if (elgg_is_logged_in()) { + return; + } + + $new_lang = elgg()->translator->detectLanguage(); + + $current_language = elgg()->translator->getCurrentLanguage(); + if (!empty($new_lang) && ($new_lang !== $current_language)) { + $allowed = language_selector_get_allowed_translations(); + if (in_array($new_lang, $allowed)) { + // set new language + elgg()->translator->setCurrentLanguage($new_lang); + + // language has been change; reload language keys + if (elgg_is_active_plugin('translation_editor')) { + translation_editor_load_translations(); + } else { + elgg()->translator->reloadAllTranslations(); + } + } + } + } +} diff --git a/classes/ColdTrick/LanguageSelector/Settings.php b/classes/ColdTrick/LanguageSelector/Settings.php new file mode 100644 index 0000000..c6a811d --- /dev/null +++ b/classes/ColdTrick/LanguageSelector/Settings.php @@ -0,0 +1,16 @@ + Bootstrap::class, + + 'actions' => [ + 'language_selector/change' => [ + 'access' => 'public', + ], + ], + + 'settings' => [ + 'show_in_header' => true, + 'show_images' => true, + 'min_completeness' => 30, + ], +]; diff --git a/languages/en.php b/languages/en.php index 7b73fdb..744c714 100644 --- a/languages/en.php +++ b/languages/en.php @@ -1,12 +1,8 @@ 'Minimum language completeness (e.g. 30)', - 'language_selector:admin:settings:show_in_header' => 'Show language selector in header?', - 'language_selector:admin:settings:autodetect' => 'Enable autodetect of language (for non-logged in users)', + 'language_selector:admin:settings:show_in_header' => 'Show language selector on the topbar?', 'language_selector:admin:settings:show_images' => 'Show images of language/country (if available)', 'language_selector:change' => 'Change language', -); - -add_translation("en",$english); \ No newline at end of file +]; diff --git a/languages/fr.php b/languages/fr.php index ad2084c..7e62606 100644 --- a/languages/fr.php +++ b/languages/fr.php @@ -1,12 +1,7 @@ "Quel est le pourcentage minimum d'exhaustivité d'une langue pour qu'elle puisse apparaître dans le sélecteur de langue (ex 30)", 'language_selector:admin:settings:show_in_header' => "Afficher les langues disponibles dans l'entête", - 'language_selector:admin:settings:autodetect' => "Activer la détection automatique de la langue (pour les utilisateurs non connectés)", 'language_selector:admin:settings:show_images' => "Afficher le drapeau du pays (si disponible)", - -); - -add_translation("fr",$french); +]; diff --git a/languages/nl.php b/languages/nl.php index 675c924..a647a2b 100644 --- a/languages/nl.php +++ b/languages/nl.php @@ -1,12 +1,7 @@ 'Minimum taalcompleetheidspercentage (bijv. 30)', 'language_selector:admin:settings:show_in_header' => 'Toon de language selector in de header?', - 'language_selector:admin:settings:autodetect' => 'Activeer automatische detectie van browser taal (voor niet aangemelde gebruikers)', 'language_selector:admin:settings:show_images' => 'Toon afbeelding van vlag van land (indien beschikbaar)', - -); - -add_translation("nl",$dutch); +]; diff --git a/lib/functions.php b/lib/functions.php index 5dd1bf1..3924187 100644 --- a/lib/functions.php +++ b/lib/functions.php @@ -1,9 +1,5 @@ 0) { - if (elgg_is_active_plugin("translation_editor")) { - $completeness_function = "translation_editor_get_language_completeness"; + if (elgg_is_active_plugin('translation_editor')) { + $completeness_function = 'translation_editor_get_language_completeness'; } else { - $completeness_function = "get_language_completeness"; + $completeness_function = 'get_language_completeness'; } foreach ($installed_languages as $lang_id => $lang_description) { - if ($lang_id != "en") { + if ($lang_id != 'en') { if (($completeness = $completeness_function($lang_id)) >= $min_completeness) { $allowed[] = $lang_id; } @@ -37,7 +33,7 @@ function language_selector_get_allowed_translations() { } } - elgg_set_plugin_setting("allowed_languages", implode(",", $allowed), "language_selector"); + elgg_set_plugin_setting('allowed_languages', implode(',', $allowed), 'language_selector'); } else { $allowed = string_to_tag_array($configured_allowed); @@ -45,56 +41,3 @@ function language_selector_get_allowed_translations() { return $allowed; } - -/** - * Sets the language for the logged out user - * - * @return void - */ -function language_selector_set_logged_out_user_language() { - global $CONFIG; - - if (elgg_is_logged_in()) { - return; - } - - if (!empty($_COOKIE['client_language'])) { - // switched with language selector - $new_lang = $_COOKIE['client_language']; - } else { - - $browserlang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); - - if (!empty($browserlang)) { - // autodetect language - - if (elgg_get_plugin_setting("autodetect", "language_selector") == "yes") { - $new_lang = $browserlang; - } - } - } - - if (!empty($new_lang) && ($new_lang !== $CONFIG->language)) { - $allowed = language_selector_get_allowed_translations(); - if (in_array($new_lang, $allowed)) { - // set new language - $CONFIG->language = $new_lang; - - // language has been change; reload language keys - if (elgg_is_active_plugin("translation_editor")) { - translation_editor_load_translations(); - } else { - reload_all_translations(); - } - } - } -} - -/** - * Unset the plugin setting so it will be reset when used the next time - * - * @return void - */ -function language_selector_invalidate_setting() { - elgg_unset_plugin_setting("allowed_languages", "language_selector"); -} diff --git a/manifest.xml b/manifest.xml index b3cd32e..8bad964 100644 --- a/manifest.xml +++ b/manifest.xml @@ -4,14 +4,14 @@ Language Selector ColdTrick IT Solutions 3.0 - Provides a selector for users to easily change the language + Provides a selector for users to easily change the language. http://www.coldtrick.com/ (C) ColdTrick IT Solutions 2009 - 2012 GNU Public License version 2 elgg_release - 2.0 + 3.3 diff --git a/start.php b/start.php deleted file mode 100644 index d7cfdbf..0000000 --- a/start.php +++ /dev/null @@ -1,39 +0,0 @@ - -.language_selector { - position: absolute; - right: 0px; - top: 42px; - color: white; -} - -.language_selector > a { - color: white; -} - -.language-selector-language-option { - line-height: 20px; - vertical-align: middle; -} -.language-selector-language-option.elgg-state-selected { - font-weight: bold; -} -.language-selector-language-option .language-selector-flag-icon { - margin-right: 5px; - max-height: 20px; -} -#language-selector-popup { - padding: 0; - width: 100px; -} -#language-selector-popup a { - display: block; - padding: 5px; - border-bottom: 1px solid #eee; -} -#language-selector-popup a:last-child { - border-bottom: 0; -} diff --git a/views/default/language_selector/default.js b/views/default/language_selector/default.js index 6c7a2d2..9d6b97b 100644 --- a/views/default/language_selector/default.js +++ b/views/default/language_selector/default.js @@ -18,7 +18,7 @@ define(function (require) { if (!elgg.is_logged_in()) { e.preventDefault(); - elgg.session.cookie('client_language', $elem.data('language'), {expires: 30}); + elgg.session.cookie('language', $elem.data('language'), {expires: 30}); elgg.forward(document.location.href); } }); diff --git a/views/default/language_selector/default.php b/views/default/language_selector/default.php index 07b9d48..a9fad02 100644 --- a/views/default/language_selector/default.php +++ b/views/default/language_selector/default.php @@ -11,7 +11,7 @@ // show text or flags $show_flags = false; -if (elgg_get_plugin_setting("show_images", "language_selector") != "no") { +if ((bool)elgg_get_plugin_setting('show_images', 'language_selector')) { $show_flags = true; } @@ -46,14 +46,15 @@ $options[] = elgg_view('output/url', [ 'text' => $text, - 'href' => "action/language_selector/change?lang_id=$lang_id", + 'href' => elgg_generate_action_url('language_selector/change', [ + 'lang_id' => $lang_id, + ]), 'class' => $class, 'title' => $lang_name, - 'is_action' => true, 'data-language' => $lang_id, ]); } echo elgg_format_element('div', [ 'class' => 'language_selector', - ], implode(' | ', $options)); +], implode(' | ', $options)); diff --git a/views/default/language_selector/dropdown.php b/views/default/language_selector/dropdown.php index 6b025ec..cb0bc37 100644 --- a/views/default/language_selector/dropdown.php +++ b/views/default/language_selector/dropdown.php @@ -11,7 +11,7 @@ // show text or flags $show_flags = false; -if (elgg_get_plugin_setting("show_images", "language_selector") != "no") { +if ((bool)elgg_get_plugin_setting('show_images', 'language_selector')) { $show_flags = true; } @@ -22,9 +22,7 @@ foreach ($allowed as $lang_id) { $lang_name = elgg_echo($lang_id); - $text = elgg_format_element('span', [ - 'language-selector-label' - ], $lang_name); + $text = elgg_format_element('span', ['class' => 'language-selector-label'], $lang_name); if ($show_flags) { $flag_view = false; @@ -53,27 +51,31 @@ $options[] = elgg_view('output/url', [ 'text' => $text, - 'href' => "action/language_selector/change?lang_id=$lang_id", + 'href' => elgg_generate_action_url('language_selector/change', [ + 'lang_id' => $lang_id, + ]), 'class' => $class, 'title' => $lang_name, - 'is_action' => true, 'data-language' => $lang_id, ]); } - $selector = elgg_view('output/url', [ 'text' => $toggle_text, 'href' => '#language-selector-popup', 'title' => elgg_echo('language_selector:change'), 'rel' => 'popup', 'class' => 'language-selector-language-option language-selector-popup-trigger', + 'data-position' => json_encode([ + 'my' => 'right top', + 'at' => 'right bottom', + ]), ]); $selector .= elgg_format_element('div', [ 'id' => 'language-selector-popup', 'class' => 'language-selector-dropdown elgg-module-dropdown hidden', - ], implode('', $options)); +], implode('', $options)); echo elgg_format_element('div', [ 'class' => 'language_selector', diff --git a/views/default/language_selector/site.css b/views/default/language_selector/site.css new file mode 100644 index 0000000..403ae08 --- /dev/null +++ b/views/default/language_selector/site.css @@ -0,0 +1,58 @@ +.language_selector { + order: 4; +} + +.elgg-page-topbar .language_selector { + padding: .5rem 1rem; + line-height: 3rem; + vertical-align: middle; + + > .language-selector-language-option > .elgg-anchor-label > .language-selector-label { + display: none; + } +} + +.elgg-page-topbar .language_selector:hover { + background-color: rgba(255,255,255,.1); +} + +@media $(media-desktop-down) { + .elgg-page-topbar .language_selector { + line-height: 1.5rem; + + > .language-selector-language-option > .elgg-anchor-label > .language-selector-label { + display: inline-block;; + } + } +} + +.language-selector-language-option, +.language-selector-label { + vertical-align: middle; +} + +.language-selector-language-option.elgg-state-selected { + font-weight: 600; +} + +.language-selector-language-option .language-selector-flag-icon { + margin-right: 5px; + max-height: 20px; +} + +#language-selector-popup { + padding: 0.5rem; + max-width: 10rem; + + a { + display: flex; + padding: 0.5rem; + border-bottom: 1px solid #eee; + justify-content: flex-start; + } + + a:last-child { + border-bottom: 0; + } +} + diff --git a/views/default/plugins/language_selector/settings.php b/views/default/plugins/language_selector/settings.php index d052f2f..f96a94e 100644 --- a/views/default/plugins/language_selector/settings.php +++ b/views/default/plugins/language_selector/settings.php @@ -1,43 +1,32 @@ elgg_echo("option:yes"), - "no" => elgg_echo("option:no") -); -$noyes_options = array_reverse($yesno_options); - -?> - - - - - - - - - - - - - - - - - -
-
-
- "params[min_completeness]", "value" => $vars['entity']->min_completeness, "size" => 2, "maxlength" => 2)); ?> -
- - - "params[show_in_header]", "options_values" => $noyes_options, "value" => $vars['entity']->show_in_header)); ?> -
- - - "params[autodetect]", "options_values" => $noyes_options, "value" => $vars['entity']->autodetect)); ?> -
- - - "params[show_images]", "options_values" => $yesno_options, "value" => $vars['entity']->show_images)); ?> -
\ No newline at end of file +$entity = elgg_extract('entity', $vars); + +echo elgg_view_field([ + '#type' => 'fieldset', + 'fields' => [ + [ + '#type' => 'number', + '#label' => elgg_echo('language_selector:admin:settings:min_completeness'), + 'name' => 'params[min_completeness]', + 'value' => $entity->min_completeness ?: 30, + 'max' => 100, + ], + [ + '#type' => 'checkbox', + '#label' => elgg_echo('language_selector:admin:settings:show_in_header'), + 'name' => 'params[show_in_header]', + 'checked' => (bool) $entity->show_in_header, + 'switch' => true, + 'value' => 1, + ], + [ + '#type' => 'checkbox', + '#label' => elgg_echo('language_selector:admin:settings:show_images'), + 'name' => 'params[show_images]', + 'checked' => (bool) $entity->show_images, + 'switch' => true, + 'value' => 1, + ], + ], +]);