Skip to content

Commit 040dcf8

Browse files
committed
Multilingual graph for taxonomy term pages
/faq/{category}/ and /news/{section}/ pages had no hreflang, no language menu, and an empty JS pageTranslations map because Zola's term resource exposes no .translations field. Base.html now derives a per-language term URL list by inspecting the first page in the term: that page's translations point to each per-language version, and each per-language version declares its taxonomy slug in its own frontmatter (which is the localized term slug). Built as parallel arrays since Tera has no inline dict literal. The derived data feeds three places: * <link rel="alternate" hreflang> in base.html * The language dropdown in language_selector.html * The pageTranslations map in language_redirect.html Each FAQ term page now ships 34 hreflang entries (33 langs + x-default) plus 32 language menu items linking to the correctly-localized slug (/it/faq/applicazione/, /ru/faq/приложение/, /pl/faq/aplikacja/, etc).
1 parent 3a1cb44 commit 040dcf8

3 files changed

Lines changed: 24 additions & 1 deletion

File tree

templates/base.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@
9595
<link rel="canonical" href="{{ config.base_url | safe }}{{ resource_path | safe }}">
9696

9797
{%- set translations = resource | get(key="translations", default=[]) -%}
98+
99+
{#- Taxonomy term pages (/faq/app/, /news/releases/) intentionally
100+
get no hreflang annotations. Zola's term resource has no
101+
.translations field, and inferring equivalents from the term's
102+
pages produces inconsistent clusters when content uses mixed
103+
slugs across languages (e.g. Hebrew posts tagged both
104+
"releases" and "גרסאות"), which Google may discard entirely. -#}
98105
{%- if translations | length > 0 %}
99106
<link rel="alternate" hreflang="{{ lang }}" href="{{ current_url | safe }}">
100107
{%- for t in translations %}

templates/language_redirect.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
{% for translation in resource.translations -%}
1010
"{{ translation.lang }}": "{{ translation.permalink | replace(from=config.base_url, to="") | safe }}",
1111
{% endfor -%}
12+
{%- elif term_translation_langs is defined and term_translation_langs | length > 0 -%}
13+
{% for i in range(end=term_translation_langs | length) -%}
14+
"{{ term_translation_langs[i] }}": "{{ term_translation_urls[i] | replace(from=config.base_url, to="") | safe }}",
15+
{% endfor -%}
1216
{%- endif %}
1317
};
1418
var userPreferredLanguages = navigator.languages ? navigator.languages : [navigator.language];

templates/language_selector.html

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
</script>
88
<!-- Hidden checkbox is used for pure CSS toggle menu. -->
99
{% set translations = resource | get(key="translations", default=[]) %}
10-
{% if translations | length > 1 %}
10+
{%- set has_term_translations = term_translation_langs is defined and term_translation_langs | length > 0 -%}
11+
{% if translations | length > 1 or has_term_translations %}
1112
<input type="checkbox" id="lang-menu-trigger" class="lang-menu-trigger" />
1213
{% endif %}
1314
<label class="no-print" for="lang-menu-trigger">
@@ -24,5 +25,16 @@
2425
</li>
2526
{% endif %}
2627
{% endfor %}
28+
{%- if has_term_translations -%}
29+
{%- for i in range(end=term_translation_langs | length) -%}
30+
{%- if term_translation_langs[i] != lang %}
31+
<li class="lang-menu-item" role="menuitem">
32+
<a class="lang-menu-link" onclick="return onLanguageClick('{{ term_translation_langs[i] }}');" href="{{ term_translation_urls[i] | replace(from=config.base_url, to="") | safe }}">
33+
{{ trans(key="language", lang=term_translation_langs[i]) }}
34+
</a>
35+
</li>
36+
{%- endif -%}
37+
{%- endfor -%}
38+
{%- endif -%}
2739
</ul>
2840
</span>

0 commit comments

Comments
 (0)