Multilingual
Contents
Language variants via filename suffix
Place translated notes alongside the original, appending _XX (ISO 639-1 code) before .md:
blog/My Post.md → /blog/my-post (default)
blog/My Post_RU.md → /blog/my-post/ru (Russian variant)
blog/My Post_DE.md → /blog/my-post/de (German variant)
Alternatively, use lang: in frontmatter:
---
website: true
title: "Мой пост"
lang: ru
slug: my-post
---
Language toggle
When language variants exist for a post, InkStone shows a language toggle in the post header. Clicking a language code switches to that variant.
hreflang meta tags are automatically added for SEO — search engines understand which pages are translations of each other.
Auto-redirect
If a visitor navigates to a post URL that has no variant for their browser language, they get a placeholder page (not a 404) with links to available languages.
Site default language
Set the <html lang=""> attribute globally in the root homepage:
---
website: true
type: homepage
language: en
---
UI string translations
Override any UI string by creating a type: translations note. No website: true needed.
---
type: translations
lang: ru
---
Put string overrides in a fenced yaml block in the note body:
```yaml
Search: Поиск
Tags: Теги
"All tags": Все теги
"min read": мин чтения
Featured: Избранное
"Posted on": Опубликовано
"Updated": Обновлено
"Related": Похожие записи
```
Keys are the English UI strings. Values are the replacements shown when the visitor views a page with lang: ru content or when the site default language is Russian.
See Page Types › translations for the full type reference.
InkStone