Skip to content

Commit e28c286

Browse files
committed
Merge branch 'release/3.0.0'
2 parents a9c5d1a + 50b3d1c commit e28c286

File tree

8 files changed

+103
-58
lines changed

8 files changed

+103
-58
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
# v3.0.0
2+
## 08/19/2022
3+
4+
1. [](#new)
5+
* Completely rewrote the logic for translated URLs to be more robust.
6+
* Added configuration option to use **Translated URLs** or use previous **Raw-Route** approach
7+
1. [](#improved)
8+
* Updated `hreflang` Twig template to use new translated URLs logic
9+
* Added an `x-default` entry for `hreflang` template when default language has `include_default_lang` set to false
10+
* Support `params` and `query` string parameters in URLs
11+
* Full domain URLs for `hreflang` entries
12+
113
# v2.0.1
214
## 08/04/2022
315

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ Simply copy the `user/plugins/langswitcher/langswitcher.yaml` into `user/config/
7979
```yaml
8080
enabled: true
8181
built_in_css: true
82+
translated_urls: true
83+
untranslated_pages_behavior: none
84+
language_display: long
8285
```
8386
8487
Options are pretty self explanatory.

blueprints.yaml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: LangSwitcher
2-
version: 2.0.1
2+
version: 3.0.0
33
description: LangSwitcher is a [Grav](https://github.com/getgrav/grav) plugin that provides native language text links to switch between [multiple languages](http://learn.getgrav.org/content/multi-language) in Grav **v0.9.30** or greater.
44
icon: globe
55
author:
@@ -39,6 +39,18 @@ form:
3939
validate:
4040
type: bool
4141

42+
translated_urls:
43+
type: toggle
44+
label: PLUGIN_LANGSWITCHER.TRANSLATED_URLS
45+
help: PLUGIN_LANGSWITCHER.TRANSLATED_URLS_HELP
46+
highlight: 1
47+
default: 1
48+
options:
49+
1: PLUGIN_ADMIN.ENABLED
50+
0: PLUGIN_ADMIN.DISABLED
51+
validate:
52+
type: bool
53+
4254
language_display:
4355
type: select
4456
size: small

langswitcher.php

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
namespace Grav\Plugin;
33

44
use Composer\Autoload\ClassLoader;
5+
use Grav\Common\Language\Language;
56
use Grav\Common\Language\LanguageCodes;
67
use Grav\Common\Page\Page;
8+
use Grav\Common\Page\Pages;
79
use \Grav\Common\Plugin;
810

911
class LangSwitcherPlugin extends Plugin
@@ -72,36 +74,21 @@ public function onTwigTemplatePaths()
7274
*/
7375
protected function getTranslatedUrl($lang, $path)
7476
{
75-
$translated_url_parts = array();
77+
/** @var Language $language */
78+
$url = null;
79+
/** @var Pages $pages */
7680
$pages = $this->grav['pages'];
81+
/** @var Language $language */
82+
$language = $this->grav['language'];
83+
84+
$language->init();
85+
$language->setActive($lang);
86+
$pages->reset();
7787
$page = $pages->get($path);
78-
$current_node = $page;
79-
$max_recursions = 10;
80-
while ($max_recursions > 0 && $current_node !== null && $current_node->slug() != 'pages' && $path != 'pages') {
81-
$translated_md_filepath = "{$path}/{$current_node->template()}.{$lang}.md";
82-
if (file_exists($translated_md_filepath)) {
83-
$translated_page = new Page();
84-
$translated_page->init(new \SplFileInfo($translated_md_filepath));
85-
$translated_slug = $translated_page->slug();
86-
if (!empty($translated_slug)) {
87-
array_unshift($translated_url_parts, $translated_slug);
88-
} else {
89-
$untranslated_slug = $current_node->slug();
90-
if (!empty($untranslated_slug)) {
91-
array_unshift($translated_url_parts, $untranslated_slug);
92-
}
93-
}
94-
$current_node = $current_node->parent();
95-
$path = dirname($path);
96-
}
97-
$max_recursions--;
98-
}
99-
if (!empty($translated_url_parts)) {
100-
array_unshift($translated_url_parts, '');
101-
return implode('/', $translated_url_parts);
102-
} else {
103-
return '';
88+
if ($page) {
89+
$url = $page->url();
10490
}
91+
return $url;
10592
}
10693

10794
/**
@@ -126,6 +113,9 @@ public function onTwigSiteVariables()
126113
$translated_pages[$language] = null;
127114
$page_name_without_ext = substr($page->name(), 0, -(strlen($page->extension())));
128115
$translated_page_path = $page->path() . DS . $page_name_without_ext . '.' . $language . '.md';
116+
if (!file_exists($translated_page_path) and $language == $this->grav['language']->getDefault()) {
117+
$translated_page_path = $page->path() . DS . $page_name_without_ext . '.md';
118+
}
129119
if (file_exists($translated_page_path)) {
130120
$translated_page = new Page();
131121
$translated_page->init(new \SplFileInfo($translated_page_path), $language . '.md');
@@ -135,15 +125,31 @@ public function onTwigSiteVariables()
135125
$data->translated_pages = $translated_pages;
136126
}
137127

138-
$data->translated_routes = array();
139-
foreach ($data->languages as $language) {
140-
$data->translated_routes[$language] = $this->getTranslatedUrl($language, $page->path());
141-
if (empty($data->translated_routes[$language])) {
142-
$data->translated_routes[$language] = $data->page_route;
128+
$language = $this->grav['language'];
129+
$active = $language->getActive() ?? $language->getDefault();
130+
131+
if ($this->config->get('plugins.langswitcher.translated_urls', true)) {
132+
$data->translated_routes = array();
133+
$translate_langs = $data->languages;
134+
135+
if (($key = array_search($active, $translate_langs)) !== false) {
136+
$data->translated_routes[$active] = $page->url();
137+
unset($translate_langs[$key]);
138+
}
139+
140+
foreach ($translate_langs as $lang) {
141+
$data->translated_routes[$lang] = $this->getTranslatedUrl($lang, $page->path());
142+
if (is_null($data->translated_routes[$lang])) {
143+
$data->translated_routes[$lang] = $data->page_route;
144+
}
143145
}
146+
// Reset pages to current active language
147+
$language->init();
148+
$language->setActive($active);
149+
$this->grav['pages']->reset();
144150
}
145151

146-
$data->current = $this->grav['language']->getLanguage();
152+
$data->current = $language->getLanguage();
147153

148154
$this->grav['twig']->twig_vars['langswitcher'] = $this->grav['langswitcher'] = $data;
149155

langswitcher.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
enabled: true
22
built_in_css: true
3+
translated_urls: true
34
untranslated_pages_behavior: none
45
language_display: long

languages.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ en:
1111
LANGUAGE_DISPLAY_HELP: 'The format of the language display, either "long" (e.g. English), or "short" (e.g. EN)'
1212
LANGUAGE_DISPLAY_LONG: 'Long'
1313
LANGUAGE_DISPLAY_SHORT: 'Short'
14+
TRANSLATED_URLS: 'Translated URLs'
15+
TRANSLATED_URLS_HELP: 'Use the actual translated page URL rather then the raw-route'
1416

1517
ru:
1618
PLUGIN_LANGSWITCHER:
Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
{% set langobj = grav['language'] %}
2-
{% for key in langswitcher.languages %}
3-
{% if key == langswitcher.current %}
4-
{% set lang_url = page.url is same as('/') ? '' : page.url %}
5-
{% else %}
6-
{% set lang_url = (langobj.getLanguageURLPrefix(key) ~ langswitcher.page_route ~ page.urlExtension ?: '')|rtrim('/') %}
7-
{% endif %}
8-
<link rel="alternate" hreflang="{{ key }}" href="{{ uri.base ~ lang_url ~ uri.params }}" />
1+
{% set language_obj = grav.language %}
2+
{% for language in langswitcher.languages %}
3+
{% if langswitcher.translated_routes[language] %}
4+
{% set lang_url = langswitcher.translated_routes[language] ~ page.urlExtension %}
5+
{% else %}
6+
{% set base_lang_url = base_url_simple ~ grav.language.getLanguageURLPrefix(language) %}
7+
{% set lang_url = base_lang_url ~ langswitcher.page_route ~ page.urlExtension %}
8+
{% endif %}
9+
10+
{% set href_url = (url('/', true)|trim('/','right') ~ lang_url ~ uri.params ~ (uri.query|length > 1 ? '?' ~ uri.query)) %}
11+
12+
{% if (language_obj.default == language and config.languages.include_default_lang == false) %}
13+
<link rel="alternate" hreflang="x-default" href="{{ href_url }}" />
14+
{% endif %}
15+
<link rel="alternate" hreflang="{{ language }}" href="{{ href_url }}" />
916
{% endfor %}
Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
11
<ul class="langswitcher">
2-
{% set display_format = display_format ?? config.get('plugins.langswitcher.language_display', 'long') %}
3-
{% for language in langswitcher.languages %}
2+
{% set display_format = display_format ?? config.get('plugins.langswitcher.language_display', 'long') %}
43

5-
{% set show_language = true %}
6-
{% if language == langswitcher.current %}
7-
{% set lang_url = page.url %}
8-
{% set active_class = ' active' %}
9-
{% else %}
10-
{% set base_lang_url = base_url_simple ~ grav.language.getLanguageURLPrefix(language) %}
11-
{% set lang_url = base_lang_url ~ langswitcher.translated_routes[language] ~ page.urlExtension %}
4+
{% for language in langswitcher.languages %}
5+
{% set active_class = '' %}
6+
{% set show_language = true %}
7+
{% if language == langswitcher.current %}
8+
{% set active_class = 'active' %}
9+
{% endif %}
10+
{% if langswitcher.translated_routes[language] %}
11+
{% set lang_url = langswitcher.translated_routes[language] ~ page.urlExtension %}
12+
{% else %}
13+
{% set base_lang_url = base_url_simple ~ grav.language.getLanguageURLPrefix(language) %}
14+
{% set lang_url = base_lang_url ~ langswitcher.page_route ~ page.urlExtension %}
15+
{% endif %}
1216
{% set untranslated_pages_behavior = grav.config.plugins.langswitcher.untranslated_pages_behavior %}
1317
{% if untranslated_pages_behavior != 'none' %}
1418
{% set translated_page = langswitcher.translated_pages[language] %}
1519
{% if (not translated_page) or (not translated_page.published) %}
1620
{% if untranslated_pages_behavior == 'redirect' %}
17-
{% set lang_url = base_lang_url ~ '/' %}
21+
{% set lang_url = url('/') %}
1822
{% elseif untranslated_pages_behavior == 'hide' %}
1923
{% set show_language = false %}
2024
{% endif %}
2125
{% endif %}
2226
{% endif %}
23-
{% set active_class = '' %}
24-
{% endif %}
2527

26-
{% if show_language %}
27-
<li><a href="{{ lang_url ~ uri.params }}" class="external{{ active_class }}">{% include 'partials/langswitcher-' ~ display_format ~ '.html.twig' %}</a></li>
28-
{% endif %}
28+
{% if show_language %}
29+
<li><a href="{{ lang_url ~ uri.params ~ (uri.query|length > 1 ? '?' ~ uri.query) }}" class="external {{ active_class }}">{% include 'partials/langswitcher-' ~ display_format ~ '.html.twig' %}</a></li>
30+
{% endif %}
2931

30-
{% endfor %}
32+
{% endfor %}
3133
</ul>

0 commit comments

Comments
 (0)