Redo the translation system (steal from tabi)
This commit is contained in:
145
config.toml
145
config.toml
@ -2,7 +2,6 @@ title = "Duckquill"
|
||||
base_url = "https://daudix.codeberg.page/duckquill"
|
||||
description = "Modern, pretty, and clean theme."
|
||||
|
||||
default_language = "en"
|
||||
compile_sass = true
|
||||
minify_html = true
|
||||
generate_feed = true
|
||||
@ -10,45 +9,13 @@ feed_filename = "atom.xml"
|
||||
build_search_index = false
|
||||
author = "Duck Quack"
|
||||
|
||||
taxonomies = [{ name = "tags", feed = true }]
|
||||
# To translate the entire theme, there must be a file with the same ISO 639-1
|
||||
# (or IETF BCP 47) Code in the `i18n` folder of your site or the Duckquill theme
|
||||
# For example, "i18n/fr.toml" for French or "i18n/zh-Hans.toml" for Simplified Chinese.
|
||||
# Otherwise the theme will be in English.
|
||||
default_language = "en"
|
||||
|
||||
[translations]
|
||||
anchor_link = "Anchor link for"
|
||||
archived = "Archived"
|
||||
author = "Author"
|
||||
blog_post_author = "Blog post author"
|
||||
boosts_from = "Boosts from"
|
||||
comments = "Comments"
|
||||
comments_description = "You can comment on this blog post by publicly replying to this post using a Mastodon or other ActivityPub/Fediverse account. Known non-private replies are displayed below."
|
||||
comments_loading = "Loading"
|
||||
comments_noscript = "Loading comments relies on JavaScript. Try enabling JavaScript and reloading, or visit the original post on Mastodon."
|
||||
copy_code = "Copy code"
|
||||
disclaimer = "Disclaimer"
|
||||
drafted = "Drafted"
|
||||
faves_from = "Favorites from"
|
||||
feed = "Feed"
|
||||
file_an_issue = "File an Issue"
|
||||
filter_by_tag = "Filter by tag"
|
||||
footer_powered_by = "Powered by"
|
||||
footer_powered_by_and = "and"
|
||||
footer_source = "Website source"
|
||||
go_to_top = "Go to Top"
|
||||
language = "Language"
|
||||
load_comments = "Load Comments"
|
||||
newest_to_oldest = "From newest to oldest"
|
||||
open_post = "Open Post"
|
||||
page_next = "Next"
|
||||
page_previous = "Previous"
|
||||
posts_in_total = "posts in total"
|
||||
posts_with_tag = "Posts with tag"
|
||||
see_all_tags = "See all tags"
|
||||
skip_to_content = "Skip to main content"
|
||||
table_of_contents = "Table of Contents"
|
||||
tags = "Tags"
|
||||
tags_in_total = "tags in total"
|
||||
trigger_warning = "Trigger Warning"
|
||||
view_comment = "View comment at"
|
||||
view_profile = "View profile at"
|
||||
taxonomies = [{ name = "tags", feed = true }]
|
||||
|
||||
[languages.ru]
|
||||
title = "Duckquill"
|
||||
@ -57,44 +24,6 @@ generate_feed = true
|
||||
|
||||
taxonomies = [{ name = "tags", feed = true }]
|
||||
|
||||
[languages.ru.translations]
|
||||
anchor_link = "Якорная ссылка для"
|
||||
archived = "Архивировано"
|
||||
author = "Автор"
|
||||
blog_post_author = "Автор блог-поста"
|
||||
boosts_from = "Продвижения с"
|
||||
comments = "Комментарии"
|
||||
comments_description = "Вы можете оставить комментарий к этому блог-посту, публично ответив на него с помощью аккаунта Mastodon или другого аккаунта ActivityPub/Fediverse. Известные неприватные ответы отображены ниже."
|
||||
comments_loading = "Загрузка…"
|
||||
comments_noscript = "Загрузка комментариев зависит от JavaScript. Попробуйте включить JavaScript и перезагрузить, или посетите оригинальный пост на Mastodon."
|
||||
copy_code = "Скопировать код"
|
||||
disclaimer = "Дисклеймер"
|
||||
drafted = "Черновик"
|
||||
faves_from = "Избранное с"
|
||||
feed = "Лента"
|
||||
file_an_issue = "Отправить Отчет об Ошибке"
|
||||
filter_by_tag = "Фильтр по тегам"
|
||||
footer_powered_by = "Работает на базе"
|
||||
footer_powered_by_and = "и"
|
||||
footer_source = "Исходный код веб-сайта"
|
||||
go_to_top = "Перейти в Начало"
|
||||
language = "Язык"
|
||||
load_comments = "Загрузить Комментарии"
|
||||
newest_to_oldest = "От новейшего к старейшему"
|
||||
open_post = "Открыть Пост"
|
||||
page_next = "Следующий"
|
||||
page_previous = "Предыдущий"
|
||||
posts_in_total = "всего постов"
|
||||
posts_with_tag = "Посты с тегом"
|
||||
see_all_tags = "Показать все теги"
|
||||
skip_to_content = "Перейти к основному содержанию"
|
||||
table_of_contents = "Оглавление"
|
||||
tags = "Теги"
|
||||
tags_in_total = "тегов в общем"
|
||||
trigger_warning = "Предупреждение о Тревоге"
|
||||
view_comment = "Показать комментарий на"
|
||||
view_profile = "Показать профиль на"
|
||||
|
||||
[languages.ar]
|
||||
title = "Duckquill"
|
||||
description = "ثيم عصري وجميل ونظيف."
|
||||
@ -102,44 +31,6 @@ generate_feed = true
|
||||
|
||||
taxonomies = [{ name = "tags", feed = true }]
|
||||
|
||||
[languages.ar.translations]
|
||||
anchor_link = "رابط الارتباط لـ"
|
||||
archived = "الأرشيف"
|
||||
author = "الكاتب"
|
||||
blog_post_author = "كاتب منشور المدونة"
|
||||
boosts_from = "التعزيزات من"
|
||||
comments = "التعليقات"
|
||||
comments_description = "يمكنك التعليق على منشور المدونة هذا عن طريق الرد علنًا على هذا المنشور باستخدام حساب Mastodon أو حساب آخر على ActivityPub/Fediverse. يتم عرض الردود المعروفة غير الخاصة أدناه."
|
||||
comments_loading = "التحميل"
|
||||
comments_noscript = "تحميل التعليقات يعتمد على JavaScript. حاول تمكين JavaScript وإعادة التحميل، أو قم بزيارة المنشور الأصلي على Mastodon."
|
||||
copy_code = "نسخ الرمز"
|
||||
disclaimer = "إخلاء المسؤولية"
|
||||
drafted = "مسودة"
|
||||
faves_from = "المفضلة من"
|
||||
feed = "موجز"
|
||||
file_an_issue = "ملف مشكلة"
|
||||
filter_by_tag = "تصفية حسب العلامة"
|
||||
footer_powered_by = "مدعوم من"
|
||||
footer_powered_by_and = "و"
|
||||
footer_source = "مصدر الموقع الإلكتروني"
|
||||
go_to_top = "الانتقال إلى الأعلى"
|
||||
language = "اللغة"
|
||||
load_comments = "تحميل التعليقات"
|
||||
newest_to_oldest = "من الأحدث إلى الأقدم"
|
||||
open_post = "افتح المنشور"
|
||||
page_next = "التالي"
|
||||
page_previous = "السابق"
|
||||
posts_in_total = "الوظائف في المجموع"
|
||||
posts_with_tag = "المنشورات ذات العلامة"
|
||||
see_all_tags = "انظر جميع العلامات"
|
||||
skip_to_content = "تخطي إلى المحتوى الرئيسي"
|
||||
table_of_contents = "جدول المحتويات"
|
||||
tags = "العلامات"
|
||||
tags_in_total = "العلامات في المجموع"
|
||||
trigger_warning = "تحذير الزناد"
|
||||
view_comment = "عرض التعليق على"
|
||||
view_profile = "عرض الملف الشخصي على"
|
||||
|
||||
[markdown]
|
||||
highlight_code = true
|
||||
highlight_theme = "css"
|
||||
@ -193,27 +84,21 @@ show_feed = true
|
||||
# i.e "@/blog/_index.md".
|
||||
# See https://www.getzola.org/documentation/content/linking/#internal-links
|
||||
links = [
|
||||
{ url = "@/blog/_index.md", name = "Blog", name_ru = "Блог", name_ar = "المدونة" },
|
||||
{ url = "@/demo/index.md", name = "Demo", name_ru = "Демо", name_ar = "العرض" },
|
||||
{ url = "https://codeberg.org/daudix/duckquill", name = "Repo", name_ru = "Репо", name_ar = "المستودع" },
|
||||
]
|
||||
# List of languages that the website is translated to (comment if there's no additional languages)
|
||||
langs = [
|
||||
{ code = "en", name = "🇬🇧 English" },
|
||||
{ code = "ru", name = "🇷🇺 Русский" },
|
||||
{ code = "ar", name = "🇵🇸 العربية" },
|
||||
{ url = "@/blog/_index.md", name = "Blog" },
|
||||
{ url = "@/demo/index.md", name = "Demo" },
|
||||
{ url = "https://codeberg.org/daudix/duckquill", name = "Repo" },
|
||||
]
|
||||
|
||||
[extra.footer]
|
||||
# Links used in the footer.
|
||||
# Same as the nav ones.
|
||||
links = [
|
||||
{ url = "@/blog/_index.md", name = "Blog", name_ru = "Блог", name_ar = "المدونة" },
|
||||
{ url = "@/demo/index.md", name = "Demo", name_ru = "Демо", name_ar = "العرض" },
|
||||
{ url = "https://codeberg.org/daudix/duckquill", name = "Repo", name_ru = "Репо", name_ar = "المستودع" },
|
||||
{ url = "@/blog/_index.md", name = "Blog", name_ru = "Блог", name_ar = "المدونة" },
|
||||
{ url = "@/demo/index.md", name = "Demo", name_ru = "Демо", name_ar = "العرض" },
|
||||
{ url = "https://codeberg.org/daudix/duckquill", name = "Repo", name_ru = "Репо", name_ar = "المستودع" },
|
||||
{ url = "@/blog/_index.md", name = "Blog" },
|
||||
{ url = "@/demo/index.md", name = "Demo" },
|
||||
{ url = "https://codeberg.org/daudix/duckquill", name = "Repo" },
|
||||
{ url = "@/blog/_index.md", name = "Blog" },
|
||||
{ url = "@/demo/index.md", name = "Demo" },
|
||||
{ url = "https://codeberg.org/daudix/duckquill", name = "Repo" },
|
||||
]
|
||||
# Social links in the footer.
|
||||
# Any URL-encoded SVG can be used as an icon.
|
||||
|
51
i18n/ar.toml
Normal file
51
i18n/ar.toml
Normal file
@ -0,0 +1,51 @@
|
||||
# Hello, the Arabic language has many pronouns and words, and each word indicates a different meaning,
|
||||
# unlike the English language, in which, on the other hand, the word can refer to a person and a group.
|
||||
# This translation is for individual use, if you are a company or organization, I have put a comment in
|
||||
# front of each translation that refers to the person and the other word that refers to the organization
|
||||
|
||||
language_name = "العربية" # Shown in language picker for multi-language sites.
|
||||
date_locale = "ar_SA" # The locale code for time and date formatting.
|
||||
full_stop = "." # Used at the end of a sentence.
|
||||
|
||||
# Menu items.
|
||||
# Should match the names in config.extra.nav.links and config.extra.footer.links.
|
||||
Blog = "المدونة"
|
||||
Demo = "العرض"
|
||||
Repo = "المستودع"
|
||||
|
||||
anchor_link = "رابط الارتباط لـ"
|
||||
archived = "الأرشيف"
|
||||
author = "الكاتب"
|
||||
blog_post_author = "كاتب منشور المدونة"
|
||||
boosts_from = "التعزيزات من"
|
||||
comments = "التعليقات"
|
||||
comments_description = "يمكنك التعليق على منشور المدونة هذا عن طريق الرد علنًا على هذا المنشور باستخدام حساب Mastodon أو حساب آخر على ActivityPub/Fediverse. يتم عرض الردود المعروفة غير الخاصة أدناه."
|
||||
comments_loading = "التحميل"
|
||||
comments_noscript = "تحميل التعليقات يعتمد على JavaScript. حاول تمكين JavaScript وإعادة التحميل، أو قم بزيارة المنشور الأصلي على Mastodon."
|
||||
copy_code = "نسخ الرمز"
|
||||
disclaimer = "إخلاء المسؤولية"
|
||||
drafted = "مسودة"
|
||||
faves_from = "المفضلة من"
|
||||
feed = "موجز"
|
||||
file_an_issue = "ملف مشكلة"
|
||||
filter_by_tag = "تصفية حسب العلامة"
|
||||
footer_powered_by = "مدعوم من"
|
||||
footer_powered_by_and = "و"
|
||||
footer_source = "مصدر الموقع الإلكتروني"
|
||||
go_to_top = "الانتقال إلى الأعلى"
|
||||
language = "اللغة"
|
||||
load_comments = "تحميل التعليقات"
|
||||
newest_to_oldest = "من الأحدث إلى الأقدم"
|
||||
open_post = "افتح المنشور"
|
||||
page_next = "التالي"
|
||||
page_previous = "السابق"
|
||||
posts_in_total = "الوظائف في المجموع"
|
||||
posts_with_tag = "المنشورات ذات العلامة"
|
||||
see_all_tags = "انظر جميع العلامات"
|
||||
skip_to_content = "تخطي إلى المحتوى الرئيسي"
|
||||
table_of_contents = "جدول المحتويات"
|
||||
tags = "العلامات"
|
||||
tags_in_total = "العلامات في المجموع"
|
||||
trigger_warning = "تحذير الزناد"
|
||||
view_comment = "عرض التعليق على"
|
||||
view_profile = "عرض الملف الشخصي على"
|
46
i18n/en.toml
Normal file
46
i18n/en.toml
Normal file
@ -0,0 +1,46 @@
|
||||
language_name = "English" # Shown in language picker for multi-language sites.
|
||||
date_locale = "en_GB"
|
||||
full_stop = "." # Used at the end of a sentence.
|
||||
|
||||
# Menu items.
|
||||
# Should match the names in config.extra.nav.links and config.extra.footer.links.
|
||||
Blog = "Blog"
|
||||
Demo = "Demo"
|
||||
Repo = "Repo"
|
||||
|
||||
anchor_link = "Anchor link for"
|
||||
archived = "Archived"
|
||||
author = "Author"
|
||||
blog_post_author = "Blog post author"
|
||||
boosts_from = "Boosts from"
|
||||
comments = "Comments"
|
||||
comments_description = "You can comment on this blog post by publicly replying to this post using a Mastodon or other ActivityPub/Fediverse account. Known non-private replies are displayed below."
|
||||
comments_loading = "Loading"
|
||||
comments_noscript = "Loading comments relies on JavaScript. Try enabling JavaScript and reloading, or visit the original post on Mastodon."
|
||||
copy_code = "Copy code"
|
||||
disclaimer = "Disclaimer"
|
||||
drafted = "Drafted"
|
||||
faves_from = "Favorites from"
|
||||
feed = "Feed"
|
||||
file_an_issue = "File an Issue"
|
||||
filter_by_tag = "Filter by tag"
|
||||
footer_powered_by = "Powered by"
|
||||
footer_powered_by_and = "and"
|
||||
footer_source = "Website source"
|
||||
go_to_top = "Go to Top"
|
||||
language = "Language"
|
||||
load_comments = "Load Comments"
|
||||
newest_to_oldest = "From newest to oldest"
|
||||
open_post = "Open Post"
|
||||
page_next = "Next"
|
||||
page_previous = "Previous"
|
||||
posts_in_total = "posts in total"
|
||||
posts_with_tag = "Posts with tag"
|
||||
see_all_tags = "See all tags"
|
||||
skip_to_content = "Skip to main content"
|
||||
table_of_contents = "Table of Contents"
|
||||
tags = "Tags"
|
||||
tags_in_total = "tags in total"
|
||||
trigger_warning = "Trigger Warning"
|
||||
view_comment = "View comment at"
|
||||
view_profile = "View profile at"
|
50
i18n/ru.toml
Normal file
50
i18n/ru.toml
Normal file
@ -0,0 +1,50 @@
|
||||
language_name = "Русский" # Shown in language picker for multi-language sites.
|
||||
date_locale = "ru_RU"
|
||||
full-stop = "." # Used at the end of a sentence.
|
||||
|
||||
# Note on pluralization prefixes:
|
||||
# - few_: for numbers ending in 2-4, except 12-14, in genitive singular.
|
||||
# - many_: for all others, including 5-9, 0, and teens (11-14), in genitive plural.
|
||||
|
||||
# Menu items.
|
||||
# Should match the names in config.extra.nav.links and config.extra.footer.links.
|
||||
Blog = "Блог"
|
||||
Demo = "Блог"
|
||||
Repo = "Репо"
|
||||
|
||||
anchor_link = "Якорная ссылка для"
|
||||
archived = "Архивировано"
|
||||
author = "Автор"
|
||||
blog_post_author = "Автор блог-поста"
|
||||
boosts_from = "Продвижения с"
|
||||
comments = "Комментарии"
|
||||
comments_description = "Вы можете оставить комментарий к этому блог-посту, публично ответив на него с помощью аккаунта Mastodon или другого аккаунта ActivityPub/Fediverse. Известные неприватные ответы отображены ниже."
|
||||
comments_loading = "Загрузка…"
|
||||
comments_noscript = "Загрузка комментариев зависит от JavaScript. Попробуйте включить JavaScript и перезагрузить, или посетите оригинальный пост на Mastodon."
|
||||
copy_code = "Скопировать код"
|
||||
disclaimer = "Дисклеймер"
|
||||
drafted = "Черновик"
|
||||
faves_from = "Избранное с"
|
||||
feed = "Лента"
|
||||
file_an_issue = "Отправить Отчет об Ошибке"
|
||||
filter_by_tag = "Фильтр по тегам"
|
||||
footer_powered_by = "Работает на базе"
|
||||
footer_powered_by_and = "и"
|
||||
footer_source = "Исходный код веб-сайта"
|
||||
go_to_top = "Перейти в Начало"
|
||||
language = "Язык"
|
||||
load_comments = "Загрузить Комментарии"
|
||||
newest_to_oldest = "От новейшего к старейшему"
|
||||
open_post = "Открыть Пост"
|
||||
page_next = "Следующий"
|
||||
page_previous = "Предыдущий"
|
||||
posts_in_total = "всего постов"
|
||||
posts_with_tag = "Посты с тегом"
|
||||
see_all_tags = "Показать все теги"
|
||||
skip_to_content = "Перейти к основному содержанию"
|
||||
table_of_contents = "Оглавление"
|
||||
tags = "Теги"
|
||||
tags_in_total = "тегов в общем"
|
||||
trigger_warning = "Предупреждение о Тревоге"
|
||||
view_comment = "Показать комментарий на"
|
||||
view_profile = "Показать профиль на"
|
@ -1 +1,8 @@
|
||||
<a class="zola-anchor" href="#{{ id }}" aria-label="{{ trans(key="anchor_link", lang=lang) }}: {{ id }}"><i class="icon"></i></a>
|
||||
{% import "macros/translate.html" as macros_translate %}
|
||||
|
||||
{% set language_strings = load_data(path="i18n/" ~ lang ~ '.toml', required=false) %}
|
||||
{% if not language_strings %}
|
||||
{% set language_strings = load_data(path="themes/tabi/i18n/" ~ lang ~ ".toml", required=false) %}
|
||||
{% endif %}
|
||||
|
||||
<a class="zola-anchor" href="#{{ id }}" aria-label="Anchor link for: {{ id }}"><i class="icon"></i></a>
|
||||
|
@ -11,7 +11,7 @@
|
||||
</time>
|
||||
{%- if page.authors %}
|
||||
<span>•</span>
|
||||
<span>{{ trans(key="author", lang=lang) }}: {{ page.authors[0] }}</span>
|
||||
<span>{{ macros_translate::translate(key="author", default="Author", language_strings=language_strings) }}: {{ page.authors[0] }}</span>
|
||||
{%- endif %}
|
||||
{%- if page.taxonomies %}
|
||||
{%- for name, taxon in page.taxonomies %}
|
||||
@ -32,7 +32,7 @@
|
||||
<div class="statement-container archive">
|
||||
<strong class="big">
|
||||
<i class="icon"></i>
|
||||
{{ trans(key="archived", lang=lang) }}
|
||||
{{ macros_translate::translate(key="archived", default="Archived", language_strings=language_strings) }}
|
||||
</strong>
|
||||
{{ page.extra.archive | markdown | safe }}
|
||||
</div>
|
||||
@ -42,7 +42,7 @@
|
||||
<div class="statement-container trigger">
|
||||
<strong class="big">
|
||||
<i class="icon"></i>
|
||||
{{ trans(key="trigger_warning", lang=lang) }}
|
||||
{{ macros_translate::translate(key="trigger_warning", default="Trigger Warning", language_strings=language_strings) }}
|
||||
</strong>
|
||||
{{ page.extra.trigger | markdown | safe }}
|
||||
</div>
|
||||
@ -52,14 +52,14 @@
|
||||
<div class="statement-container disclaimer">
|
||||
<strong class="big">
|
||||
<i class="icon"></i>
|
||||
{{ trans(key="disclaimer", lang=lang) }}
|
||||
{{ macros_translate::translate(key="disclaimer", default="Disclaimer", language_strings=language_strings) }}
|
||||
</strong>
|
||||
{{ page.extra.disclaimer | markdown | safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if page.extra.toc %}
|
||||
<h2>{{ trans(key="table_of_contents", lang=lang) }}</h2>
|
||||
<h2>{{ macros_translate::translate(key="table_of_contents", default="Table of Contents", language_strings=language_strings) }}</h2>
|
||||
<ul>
|
||||
{% for h1 in page.toc %}
|
||||
<li>
|
||||
@ -90,13 +90,13 @@
|
||||
<nav id="post-nav">
|
||||
{% if page.higher %}
|
||||
<a class="post-nav-item post-nav-prev" href="{{ page.higher.permalink }}">
|
||||
<div class="nav-arrow">{{ trans(key="page_previous", lang=lang) }}</div>
|
||||
<div class="nav-arrow">{{ macros_translate::translate(key="page_previous", default="Previous", language_strings=language_strings) }}</div>
|
||||
<span class="post-title">{{ page.higher.title }}</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if page.lower %}
|
||||
<a class="post-nav-item post-nav-next" href="{{ page.lower.permalink }}">
|
||||
<div class="nav-arrow">{{ trans(key="page_next", lang=lang) }}</div>
|
||||
<div class="nav-arrow">{{ macros_translate::translate(key="page_next", default="Next", language_strings=language_strings) }}</div>
|
||||
<span class="post-title">{{ page.lower.title }}</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
@ -104,9 +104,11 @@
|
||||
{% endif %}
|
||||
|
||||
<div class="dialog-buttons">
|
||||
<a class="inline-button" href="#top">{{ trans(key="go_to_top", lang=lang) }}</a>
|
||||
<a class="inline-button" href="#top">{{ macros_translate::translate(key="go_to_top", default="Go to Top", language_strings=language_strings) }}</a>
|
||||
{% if config.extra.issues_url %}
|
||||
<a class="inline-button colored external" href="{{ config.extra.issues_url }}">{{ trans(key="file_an_issue", lang=lang) }}</a>
|
||||
<a class="inline-button colored external" href="{{ config.extra.issues_url }}">
|
||||
{{ macros_translate::translate(key="file_an_issue", default="File an Issue", language_strings=language_strings) }}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
@ -6,9 +6,11 @@
|
||||
{{ section.description | markdown | safe }}
|
||||
|
||||
<small>
|
||||
<a href="{{ get_url(path='tags', lang=lang) }}">{{ trans(key="filter_by_tag", lang=lang) }}</a>
|
||||
<a href="{{ get_url(path='tags', lang=lang) }}">
|
||||
{{ macros_translate::translate(key="filter_by_tag", default="Filter by tag", language_strings=language_strings) }}
|
||||
</a>
|
||||
<br />
|
||||
{{ trans(key="newest_to_oldest", lang=lang) }} ↓
|
||||
{{ macros_translate::translate(key="newest_to_oldest", default="", language_strings=language_strings) }} ↓
|
||||
</small>
|
||||
|
||||
<div id="article-list">
|
||||
@ -18,13 +20,13 @@
|
||||
{%- if page.draft %}
|
||||
<span class="draft-badge">
|
||||
<i class="icon"></i>
|
||||
{{ trans(key="drafted", lang=lang) }}
|
||||
{{ macros_translate::translate(key="drafted", default="Drafted", language_strings=language_strings) }}
|
||||
</span>
|
||||
{%- endif %}
|
||||
{%- if page.extra.archive %}
|
||||
<span class="archive-badge">
|
||||
<i class="icon"></i>
|
||||
{{ trans(key="archived", lang=lang) }}
|
||||
{{ macros_translate::translate(key="archived", default="Archived", language_strings=language_strings) }}
|
||||
</span>
|
||||
{%- endif %}
|
||||
{%- if page.description %}
|
||||
@ -37,7 +39,7 @@
|
||||
</time>
|
||||
{%- if page.authors %}
|
||||
<span>•</span>
|
||||
<span>{{ trans(key="author", lang=lang) }}: {{ page.authors[0] }}</span>
|
||||
<span>{{ macros_translate::translate(key="author", default="Author", language_strings=language_strings) }}: {{ page.authors[0] }}</span>
|
||||
{%- endif %}
|
||||
{%- if page.taxonomies %}
|
||||
{%- for name, taxon in page.taxonomies %}
|
||||
|
@ -1,8 +1,16 @@
|
||||
{% set rtl_langs = ["ar", "arc", "az", "dv", "ff", "he", "ku", "nqo", "fa", "rhg", "syc", "ur"] %}
|
||||
{% import "macros/translate.html" as macros_translate %}
|
||||
|
||||
{% set language_strings = load_data(path="i18n/" ~ lang ~ '.toml', required=false) %}
|
||||
{% if not language_strings %}
|
||||
{% set language_strings = load_data(path="themes/tabi/i18n/" ~ lang ~ ".toml", required=false) %}
|
||||
{% endif %}
|
||||
{% set rtl_languages = ["ar", "arc", "az", "dv", "ff", "he", "ku", "nqo", "fa", "rhg", "syc", "ur"] %}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html {% if lang in rtl_langs %}dir="rtl"{% endif %} lang="{{ lang }}">
|
||||
<html {% if lang in rtl_languages %}dir="rtl"{% endif %} lang="{{ lang }}">
|
||||
|
||||
{% include "partials/head.html" %}
|
||||
|
||||
<body>
|
||||
{% include "partials/nav.html" %}
|
||||
<div id="main" class="container">
|
||||
|
72
templates/macros/translate.html
Normal file
72
templates/macros/translate.html
Normal file
@ -0,0 +1,72 @@
|
||||
{#- Dynamically selects the appropriate translation key based on the provided `number` and `lang` context.
|
||||
If a `number` is provided, the macro will attempt to pluralize the translation key based on the language's rules.
|
||||
|
||||
Parameters:
|
||||
- `key`: The base key for the translation string, matching the i18n files. Example: `results` to get `zero_results`, `one_results`, `many_results`, etc.
|
||||
- `number`: Optional. The numerical value associated with the key.
|
||||
- `language_strings`: A dictionary containing the translation strings.
|
||||
- `default`: A default string to use if no translation is found for the key.
|
||||
- `replace`: Optional. If `true`, the macro will replace the `$NUMBER` placeholder in the translation string with the provided `number`.
|
||||
|
||||
The macro supports special pluralization rules for:
|
||||
- Arabic (`ar`): Has unique forms for zero, one, two, few, and many.
|
||||
- Slavic languages: Pluralization depends on the last digit of the number, with exceptions for numbers ending in 11-14.
|
||||
|
||||
NOTE: If the logic for pluralization is modified, it needs to be replicated on the JavaScript search.
|
||||
Files: static/js/searchElasticlunr.js and its minified version at static/js/searchElasticlunr.min.js
|
||||
Function name: getPluralizationKey -#}
|
||||
{% macro translate(key, number=-1, language_strings="", default="", replace=true) %}
|
||||
{%- set slavic_plural_languages = ["uk", "be", "bs", "hr", "ru", "sr"] -%}
|
||||
|
||||
{%- set key_prefix = "" -%}
|
||||
{#- `zero_` and `one_` are common cases. We handle "many" (plural) later, after language-specific pluralization -#}
|
||||
{%- if number == 0 -%}
|
||||
{%- set key_prefix = "zero_" -%}
|
||||
{%- elif number == 1 -%}
|
||||
{%- set key_prefix = "one_" -%}
|
||||
{%- endif -%}
|
||||
|
||||
{#- Pluralization -#}
|
||||
{%- if number != -1 and key_prefix == "" -%}
|
||||
{#- Arabic -#}
|
||||
{%- if lang == "ar" -%}
|
||||
{%- set modulo = number % 100 -%}
|
||||
{%- if number == 2 -%}
|
||||
{%- set key_prefix = "two_" -%}
|
||||
{%- elif modulo >= 3 and modulo <= 10 -%}
|
||||
{%- set key_prefix = "few_" -%}
|
||||
{%- else -%}
|
||||
{%- set key_prefix = "many_" -%}
|
||||
{%- endif -%}
|
||||
{#- Slavic languages like Russian or Ukrainian -#}
|
||||
{%- elif lang in slavic_plural_languages -%}
|
||||
{%- set modulo10 = number % 10 -%}
|
||||
{%- set modulo100 = number % 100 -%}
|
||||
{%- if modulo10 == 1 and modulo100 != 11 -%}
|
||||
{%- set key_prefix = "one_" -%}
|
||||
{%- elif modulo10 >= 2 and modulo10 <= 4 -%}
|
||||
{%- if modulo100 >= 12 and modulo100 <= 14 -%}
|
||||
{%- set key_prefix = "many_" -%}
|
||||
{%- else -%}
|
||||
{%- set key_prefix = "few_" -%}
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{%- set key_prefix = "many_" -%}
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{#- Default pluralization -#}
|
||||
{#- Zero and one are already handled -#}
|
||||
{%- set key_prefix = "many_" -%}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
{#- Translated string -#}
|
||||
{%- set final_key = key_prefix ~ key -%}
|
||||
{%- set translated_text = language_strings[final_key] | default(value=default) | safe -%}
|
||||
|
||||
{#- Replace $NUMBER with the number -#}
|
||||
{%- if replace -%}
|
||||
{%- set translated_text = translated_text | replace(from="$NUMBER", to=number | as_str) -%}
|
||||
{%- endif -%}
|
||||
{{- translated_text -}}
|
||||
{% endmacro %}
|
@ -5,7 +5,7 @@
|
||||
<div class="statement-container archive">
|
||||
<strong class="big">
|
||||
<i class="icon"></i>
|
||||
{{ trans(key="archived", lang=lang) }}
|
||||
{{ macros_translate::translate(key="archived", default="Archived", language_strings=language_strings) }}
|
||||
</strong>
|
||||
{{ page.extra.archive | markdown | safe }}
|
||||
</div>
|
||||
|
@ -19,21 +19,27 @@
|
||||
<img id="qrcode" class="no-hover pixels" alt="QR code to a Mastodon post" src="https://api.qrserver.com/v1/create-qr-code/?data=https://{{ host }}/@{{ username }}/{{ id }}&format=gif" />
|
||||
{% endif %}
|
||||
|
||||
<h2>{{ trans(key="comments", lang=lang) }}</h2>
|
||||
<p>{{ trans(key="comments_description", lang=lang) }}</p>
|
||||
<h2>
|
||||
{{ macros_translate::translate(key="comments", default="Comments", language_strings=language_strings) }}
|
||||
</h2>
|
||||
<p>
|
||||
{{ macros_translate::translate(key="comments_description", default="You can comment on this blog post by publicly replying to this post using a Mastodon or other ActivityPub/Fediverse account. Known non-private replies are displayed below.", language_strings=language_strings) }}
|
||||
</p>
|
||||
|
||||
<div class="dialog-buttons">
|
||||
<a id="load-comments" class="inline-button" onclick="loadComments()" onkeypress="loadComments()" tabindex="0">
|
||||
{{ trans(key="load_comments", lang=lang) }}
|
||||
{{ macros_translate::translate(key="load_comments", default="Load Comments", language_strings=language_strings) }}
|
||||
</a>
|
||||
<a class="inline-button colored external" href="https://{{ host }}/@{{ username }}/{{ id }}">
|
||||
{{ trans(key="open_post", lang=lang) }}
|
||||
{{ macros_translate::translate(key="open_post", default="Open Post", language_strings=language_strings) }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div id="comments-wrapper">
|
||||
<noscript>
|
||||
<p>{{ trans(key="comments_noscript", lang=lang) }}</p>
|
||||
<p>
|
||||
{{ macros_translate::translate(key="comments_noscript", default="Loading comments relies on JavaScript. Try enabling JavaScript and reloading, or visit the original post on Mastodon.", language_strings=language_strings) }}
|
||||
</p>
|
||||
</noscript>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
@ -72,7 +78,7 @@
|
||||
|
||||
function loadComments() {
|
||||
let commentsWrapper = document.getElementById("comments-wrapper");
|
||||
document.getElementById("load-comments").innerHTML = "{{ trans(key='comments_loading', lang=lang) }}…";
|
||||
document.getElementById("load-comments").innerHTML = "{{ macros_translate::translate(key='comments_loading', default='Loading', language_strings=language_strings) }}…";
|
||||
fetch("https://{{ host }}/api/v1/statuses/{{ id }}/context")
|
||||
.then(function (response) {
|
||||
return response.json();
|
||||
@ -147,7 +153,7 @@
|
||||
avatar.setAttribute("rel", "external nofollow");
|
||||
avatar.setAttribute(
|
||||
"title",
|
||||
`{{ trans(key="view_profile", lang=lang) }} @${status.account.username}@${instance}`
|
||||
`{{ macros_translate::translate(key="view_profile", default="View profile at", language_strings=language_strings) }} @${status.account.username}@${instance}`
|
||||
);
|
||||
avatar.appendChild(avatarPicture);
|
||||
|
||||
@ -175,7 +181,7 @@
|
||||
let permalink = document.createElement("a");
|
||||
permalink.setAttribute("href", status.url);
|
||||
permalink.setAttribute("itemprop", "url");
|
||||
permalink.setAttribute("title", `{{ trans(key="view_comment", lang=lang) }} ${instance}`);
|
||||
permalink.setAttribute("title", `{{ macros_translate::translate(key="view_comment", default="View comment at", language_strings=language_strings) }} ${instance}`);
|
||||
permalink.setAttribute("rel", "external nofollow");
|
||||
permalink.textContent = new Date(
|
||||
status.created_at
|
||||
@ -197,7 +203,7 @@
|
||||
let boosts = document.createElement("a");
|
||||
boosts.className = "boosts";
|
||||
boosts.setAttribute("href", `${status.url}/reblogs`);
|
||||
boosts.setAttribute("title", `{{ trans(key="boosts_from", lang=lang) }} ${instance}`);
|
||||
boosts.setAttribute("title", `{{ macros_translate::translate(key="boosts_from", default="Boosts from", language_strings=language_strings) }} ${instance}`);
|
||||
|
||||
let boostsIcon = document.createElement("i");
|
||||
boostsIcon.className = "icon";
|
||||
@ -208,7 +214,7 @@
|
||||
let faves = document.createElement("a");
|
||||
faves.className = "faves";
|
||||
faves.setAttribute("href", `${status.url}/favourites`);
|
||||
faves.setAttribute("title", `{{ trans(key="faves_from", lang=lang) }} ${instance}`);
|
||||
faves.setAttribute("title", `{{ macros_translate::translate(key="faves_from", default="Favorites from", language_strings=language_strings) }} ${instance}`);
|
||||
|
||||
let favesIcon = document.createElement("i");
|
||||
favesIcon.className = "icon";
|
||||
@ -233,13 +239,13 @@
|
||||
avatar.classList.add("op");
|
||||
avatar.setAttribute(
|
||||
"title",
|
||||
"{{ trans(key="blog_post_author", lang=lang) }}: " + avatar.getAttribute("title")
|
||||
"{{ macros_translate::translate(key='blog_post_author', default='Blog post author', language_strings=language_strings) }}: " + avatar.getAttribute("title")
|
||||
);
|
||||
|
||||
instanceBadge.classList.add("op");
|
||||
instanceBadge.setAttribute(
|
||||
"title",
|
||||
"{{ trans(key="blog_post_author", lang=lang) }}: " + instanceBadge.getAttribute("title")
|
||||
"{{ macros_translate::translate(key="blog_post_author", default="Blog post author", language_strings=language_strings) }}: " + instanceBadge.getAttribute("title")
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
let span = document.createElement("span");
|
||||
icon.classList.add("icon");
|
||||
span.classList.add("hidden");
|
||||
span.innerHTML = "{{ trans(key='copy_code', lang=lang) }}";
|
||||
span.innerHTML = "{{ macros_translate::translate(key='copy_code', default='Copy code', language_strings=language_strings) }}";
|
||||
button.appendChild(icon);
|
||||
button.appendChild(span);
|
||||
container.appendChild(button);
|
||||
|
@ -9,26 +9,26 @@
|
||||
<nav>
|
||||
<ul>
|
||||
{% for link in config.extra.footer.links %}
|
||||
{% if current_lang == config.default_language %}
|
||||
{% set title = link.name %}
|
||||
{% else %}
|
||||
{% set language_key = 'name_' ~ current_lang %}
|
||||
{% set title = link[language_key] %}
|
||||
{% endif %}
|
||||
{%- if link.url is matching('https?://') %}
|
||||
<li>
|
||||
<a href="{{ link.url }}">
|
||||
{{ title }}
|
||||
</a>
|
||||
</li>
|
||||
{%- else %}
|
||||
<li>
|
||||
<a href="{{ get_url(path=link.url, lang=lang)}}">
|
||||
{{ title }}
|
||||
</a>
|
||||
</li>
|
||||
{%- endif %}
|
||||
{% endfor %}
|
||||
{%- if link.url is matching('https?://') %}
|
||||
<li>
|
||||
<a href="{{ link.url }}"
|
||||
{% if current_url | default(value='/') | trim_end_matches(pat='/') | safe == link.url | trim_end_matches(pat='/') | safe %}
|
||||
class="active"
|
||||
{% endif %}>
|
||||
{{ macros_translate::translate(key=link.name, default=link.name, language_strings=language_strings) }}
|
||||
</a>
|
||||
</li>
|
||||
{%- else %}
|
||||
<li>
|
||||
<a href="{{ get_url(path=link.url, lang=lang)}}"
|
||||
{% if current_url | default(value='/') | trim_end_matches(pat='/') | safe == get_url(path=link.url, lang=lang) | trim_end_matches(pat='/') | safe %}
|
||||
class="active"
|
||||
{% endif %}>
|
||||
{{ macros_translate::translate(key=link.name, default=link.name, language_strings=language_strings) }}
|
||||
</a>
|
||||
</li>
|
||||
{%- endif %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</nav>
|
||||
{% endif %}
|
||||
@ -42,7 +42,7 @@
|
||||
{% if config.extra.source_url and config.extra.footer.show_source %}
|
||||
<p>
|
||||
<a href="{{ config.extra.source_url }}">
|
||||
{{ trans(key='footer_source', lang=lang) }}
|
||||
{{ macros_translate::translate(key="footer_source", default="Table of Contents", language_strings=language_strings) }}
|
||||
</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
@ -50,7 +50,7 @@
|
||||
{% if config.extra.footer.show_powered_by %}
|
||||
<p>
|
||||
<small>
|
||||
{{ trans(key="footer_powered_by", lang=lang) }} <a class="link" href="https://www.getzola.org">Zola</a> {{ trans(key="footer_powered_by_and", lang=lang) }} <a class="link" href="https://daudix.codeberg.page/duckquill">Duckquill</a>
|
||||
{{ macros_translate::translate(key="footer_powered_by", default="Powered by", language_strings=language_strings) }} <a class="link" href="https://www.getzola.org">Zola</a> {{ macros_translate::translate(key="footer_powered_by_and", default="and", language_strings=language_strings) }} <a class="link" href="https://daudix.codeberg.page/duckquill">Duckquill</a>
|
||||
</small>
|
||||
</p>
|
||||
{% endif %}
|
||||
|
@ -6,16 +6,29 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="{{ config.extra.primary_color }}" />
|
||||
<link rel="canonical" href="{{ current_url | default(value='/') | safe }}" />
|
||||
<title>{% block title %}{% include "partials/title.html" %}{% endblock %}</title>
|
||||
<link rel="stylesheet" type="text/css" href="{{ get_url(path='style.css') }}" />
|
||||
<link rel="stylesheet" type="text/css" href="{{ get_url(path='syntax-theme-dark.css') }}" media="(prefers-color-scheme: dark)" />
|
||||
<link rel="stylesheet" type="text/css" href="{{ get_url(path='syntax-theme-light.css') }}" media="(prefers-color-scheme: light)" />
|
||||
<title>{% include "partials/title.html" %}</title>
|
||||
<link rel="stylesheet" href="{{ get_url(path='syntax-theme-dark.css') }}" media="(prefers-color-scheme: dark)" />
|
||||
<link rel="stylesheet" href="{{ get_url(path='syntax-theme-light.css') }}" media="(prefers-color-scheme: light)" />
|
||||
|
||||
{% if config.extra.stylesheets %}
|
||||
{% for stylesheet in config.extra.stylesheets %}
|
||||
<link rel="stylesheet" type="text/css" href="{{ get_url(path=stylesheet) }}" />
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{# Define array of CSS files to load. main.css is always loaded. #}
|
||||
{% set stylesheets = [ "style.css" ] %}
|
||||
|
||||
{# Load extra CSS files from config.toml #}
|
||||
{% if config.extra.stylesheets -%}
|
||||
{% set stylesheets = stylesheets | concat(with=config.extra.stylesheets) %}
|
||||
{% endif %}
|
||||
|
||||
{# Load extra CSS files from page metadata #}
|
||||
{% if page.extra.stylesheets %}
|
||||
{% set stylesheets = stylesheets | concat(with=page.extra.stylesheets) %}
|
||||
{% elif section.extra.stylesheets %}
|
||||
{% set stylesheets = stylesheets | concat(with=section.extra.stylesheets) %}
|
||||
{% endif %}
|
||||
|
||||
{# Load all stylesheets #}
|
||||
{%- for stylesheet in stylesheets %}
|
||||
<link rel="stylesheet" href="{{ get_url(path=stylesheet) | safe }}" />
|
||||
{%- endfor %}
|
||||
|
||||
<style type="text/css">
|
||||
:root {
|
||||
|
44
templates/partials/language_switcher.html
Normal file
44
templates/partials/language_switcher.html
Normal file
@ -0,0 +1,44 @@
|
||||
<li id="dropdown">
|
||||
<details>
|
||||
<summary>
|
||||
<i class="icon"></i>
|
||||
<span class="hidden">
|
||||
{{ macros_translate::translate(key="language", default="Language", language_strings=language_strings) }}
|
||||
</span>
|
||||
</summary>
|
||||
<ul>
|
||||
{%- for lcode, ldetails in config.languages -%}
|
||||
{#- Skip the current language to avoid linking to the current page -#}
|
||||
{%- if lang == lcode -%}
|
||||
{%- continue -%}
|
||||
{%- endif -%}
|
||||
{#- Dynamically load the language strings for each language -#}
|
||||
{%- set other_language_strings = load_data(path="i18n/" ~ lcode ~ ".toml", required=false) -%}
|
||||
{%- if not other_language_strings -%}
|
||||
{%- set other_language_strings = load_data(path="themes/tabi/i18n/" ~ lcode ~ ".toml", required=false) -%}
|
||||
{%- endif -%}
|
||||
{#- Use the loaded language strings to get the language name -#}
|
||||
{% set language_name = macros_translate::translate(key="language_name", default=lcode,
|
||||
language_strings=other_language_strings) %}
|
||||
{#- Check if the language code matches the default language -#}
|
||||
{%- if lcode == config.default_language -%}
|
||||
{#- If it does, link to the root path (no language code in URL) -#}
|
||||
<li>
|
||||
<a lang="{{ lcode }}" href="{{ current_url | replace(from='/' ~ lang ~ '/', to = '/') }}">{{ language_name }}</a>
|
||||
</li>
|
||||
{#- Check if the current language is the default language -#}
|
||||
{#- If it is, append the language code to the base URL -#}
|
||||
{%- elif lang == config.default_language -%}
|
||||
<li>
|
||||
<a lang="{{ lcode }}" href="{{ config.base_url }}/{{ lcode }}{{ current_path | default(value="/") | safe }}">{{ language_name }}</a>
|
||||
</li>
|
||||
{%- else -%}
|
||||
{#- If it's not, replace the current language code in the URL with the new one -#}
|
||||
<li>
|
||||
<a lang="{{ lcode }}" href="{{ current_url | replace(from='/' ~ lang ~ '/', to='/' ~ lcode ~ '/') }}">{{ language_name }}</a>
|
||||
</li>
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
</ul>
|
||||
</details>
|
||||
</li>
|
@ -1,13 +1,9 @@
|
||||
{% set current_lang = config.default_language %}
|
||||
{% if page %}
|
||||
{% set current_lang = page.lang %}
|
||||
{% elif section %}
|
||||
{%- set current_lang = section.lang %}
|
||||
{% endif %}
|
||||
{% if config.extra.nav.links %}
|
||||
<header id="site-nav">
|
||||
<nav>
|
||||
<a href="#main" id="main-content" tabindex="0">{{ trans(key="skip_to_content", lang=lang) }}</a>
|
||||
<a href="#main" id="main-content" tabindex="0">
|
||||
{{ macros_translate::translate(key="skip_to_content", default="Skip to main content", language_strings=language_strings) }}
|
||||
</a>
|
||||
<ul>
|
||||
<li id="home">
|
||||
<a href="{{ get_url(path="/", lang=lang) }}"
|
||||
@ -18,19 +14,13 @@
|
||||
</a>
|
||||
</li>
|
||||
{% for link in config.extra.nav.links %}
|
||||
{% if current_lang == config.default_language %}
|
||||
{% set title = link.name %}
|
||||
{% else %}
|
||||
{% set language_key = 'name_' ~ current_lang %}
|
||||
{% set title = link[language_key] %}
|
||||
{% endif %}
|
||||
{%- if link.url is matching('https?://') %}
|
||||
<li>
|
||||
<a href="{{ link.url }}"
|
||||
{% if current_url | default(value='/') | trim_end_matches(pat='/') | safe == link.url | trim_end_matches(pat='/') | safe %}
|
||||
class="active"
|
||||
{% endif %}>
|
||||
{{ title }}
|
||||
{{ macros_translate::translate(key=link.name, default=link.name, language_strings=language_strings) }}
|
||||
</a>
|
||||
</li>
|
||||
{%- else %}
|
||||
@ -39,33 +29,21 @@
|
||||
{% if current_url | default(value='/') | trim_end_matches(pat='/') | safe == get_url(path=link.url, lang=lang) | trim_end_matches(pat='/') | safe %}
|
||||
class="active"
|
||||
{% endif %}>
|
||||
{{ title }}
|
||||
{{ macros_translate::translate(key=link.name, default=link.name, language_strings=language_strings) }}
|
||||
</a>
|
||||
</li>
|
||||
{%- endif %}
|
||||
{% endfor %}
|
||||
{% if config.extra.nav.langs %}
|
||||
<li id="dropdown">
|
||||
<details>
|
||||
<summary>
|
||||
<i class="icon"></i>
|
||||
<span class="hidden">{{ trans(key="language", lang=lang) }}</span>
|
||||
</summary>
|
||||
<ul>
|
||||
{% for language in config.extra.nav.langs %}
|
||||
<li>
|
||||
<a href="{{ get_url(path="/", lang=language.code) }}">{{ language.name }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</details>
|
||||
</li>
|
||||
{% if config.languages | length > 0 %}
|
||||
{% include "partials/language_switcher.html" %}
|
||||
{% endif %}
|
||||
{% if config.generate_feed and config.extra.nav.show_feed %}
|
||||
<li id="feed">
|
||||
<a href="{{ get_url(path=config.feed_filename) }}">
|
||||
<i class="icon"></i>
|
||||
<span class="hidden">{{ trans(key="feed", lang=lang) }}</span>
|
||||
<span class="hidden">
|
||||
{{ macros_translate::translate(key="feed", default="Feed", language_strings=language_strings) }}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
@ -1,8 +1,10 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{{ trans(key="tags", lang=lang) }}</h1>
|
||||
<small>{{ terms | length }} {{ trans(key="tags_in_total", lang=lang) }}</small>
|
||||
{% set number_of_tags = terms | length %}
|
||||
<h1>{{ macros_translate::translate(key="tags", default="Tags", language_strings=language_strings) }}</h1>
|
||||
<small>{{ terms | length }} {{ macros_translate::translate(key="tags_in_total", number=number_of_tags, default="$NUMBER tags in total", language_strings=language_strings) }}
|
||||
</small>
|
||||
<br />
|
||||
<ul class="tags">
|
||||
{% for tag in terms %}
|
||||
|
@ -1,12 +1,15 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{{ trans(key="posts_with_tag", lang=lang) }} “{{ term.name }}”</h1>
|
||||
{% set number_of_posts = term.pages | length %}
|
||||
<h1>{{ macros_translate::translate(key="posts_with_tag", default="Posts with tag", language_strings=language_strings) }} “{{ term.name }}”</h1>
|
||||
|
||||
<small>
|
||||
<a href="{{ get_url(path='tags', lang=lang) }}">{{ trans(key="see_all_tags", lang=lang) }}</a>
|
||||
<a href="{{ get_url(path='tags', lang=lang) }}">
|
||||
{{ macros_translate::translate(key="see_all_tags", default="See all tags", language_strings=language_strings) }}
|
||||
</a>
|
||||
<br />
|
||||
{{ term.pages | length }} {{ trans(key="posts_in_total", lang=lang) }}
|
||||
{{ term.pages | length }} {{ macros_translate::translate(key="posts_in_total", number=number_of_posts, default="$NUMBER posts in total", language_strings=language_strings) }}
|
||||
</small>
|
||||
|
||||
<div id="article-list">
|
||||
@ -16,13 +19,13 @@
|
||||
{%- if page.draft %}
|
||||
<span class="draft-badge">
|
||||
<i class="icon"></i>
|
||||
{{ trans(key="drafted", lang=lang) }}
|
||||
{{ macros_translate::translate(key="drafted", default="Drafted", language_strings=language_strings) }}
|
||||
</span>
|
||||
{%- endif %}
|
||||
{%- if page.extra.archive %}
|
||||
<span class="archive-badge">
|
||||
<i class="icon"></i>
|
||||
{{ trans(key="archived", lang=lang) }}
|
||||
{{ macros_translate::translate(key="archived", default="Archived", language_strings=language_strings) }}
|
||||
</span>
|
||||
{%- endif %}
|
||||
{%- if page.description %}
|
||||
@ -35,7 +38,9 @@
|
||||
</time>
|
||||
{%- if page.authors %}
|
||||
<span>•</span>
|
||||
<span>{{ trans(key="author", lang=lang) }}: {{ page.authors[0] }}</span>
|
||||
<span>
|
||||
{{ macros_translate::translate(key="author", default="Author", language_strings=language_strings) }}: {{ page.authors[0] }}
|
||||
</span>
|
||||
{%- endif %}
|
||||
{%- if page.taxonomies %}
|
||||
{%- for name, taxon in page.taxonomies %}
|
||||
|
Reference in New Issue
Block a user