v6.7.0 Release: Many Tongues, One Site
2026-07-01SuCoS v6.7.0 is the biggest release yet, introducing full multi-language and internationalization support. Whether your site needs two languages or twenty, SuCoS now has you covered. For a complete reference, see the Localization documentation.
Multi-Language Support
SuCoS now supports building sites in multiple languages. Configure your languages in the site settings:
languages:
en:
LanguageName: English
Weight: 1
Title: "My Site"
IsDefault: true
pt-br:
LanguageName: "Português (Brasil)"
Weight: 2
Title: "Meu Site"
Content is mapped to languages through filename suffixes. Simply name your files with the language code (e.g., hello.pt-br.md) and SuCoS automatically associates them with the correct language. Non-default languages get language-prefixed URLs (/pt-br/hello/), while the default language keeps clean URLs by default. Set DefaultContentLanguageInSubdir: true to prefix all languages uniformly.
Auto-generated section and taxonomy pages are now created for every configured language, not just the default. If a directory has an _index.md only in English, SuCoS automatically synthesizes stubs for the other languages — no manual duplication required.
Internationalization (i18n)
Bring your templates to life in any language with the new i18n system. Create translation files in i18n/ directory:
# i18n/en.yaml
read_more:
one: "Read more"
other: "Read more"
posts:
one: "{{ count }} post"
other: "{{ count }} posts"
# i18n/pt-br.yaml
read_more:
one: "Leia mais"
other: "Leia mais"
posts:
one: "{{ count }} post"
other: "{{ count }} posts"
Use the i18n filter in your Liquid templates:
<a href="{{ page.RelPermalink }}">
{{ "read_more" | i18n }}
</a>
Pluralization is fully supported via Hugo-compatible one/other keys. The value inside the translation uses {{ count }} as the placeholder:
{% assign count = site.RegularPages.size %}
<p>{{ "posts" | i18n: count }}</p>
If there is a single page, this renders 1 post; with ten pages, it renders 10 posts.
When a translation key is missing in the current language, SuCoS falls back to the default language automatically — so you can roll out translations incrementally.
Translation-Aware Templates
Building language switchers and cross-language navigation is now straightforward with new page properties:
page.Translations— same-page content in other languages, perfect for language switcherspage.AllTranslations— all translations including self, sorted by language weightpage.TranslationsByLanguage— translations keyed by language codepage.Variants— every representation across all languages and output formatspage.AlternativeOutputFormats— output formats (HTML, RSS, JSON) for the same languagepage.IsDefaultLanguage— check if page is in the site's default languagesite.Languages— list of all configured language settingssite.Language— the current language context for this output
Here's a complete language switcher:
{% if page.Translations.size > 0 %}
<nav class="language-switcher">
{% for t in page.Translations %}
<a href="{{ t.RelPermalink }}" lang="{{ t.Language }}">
{{ t.LanguageName }}
</a>
{% endfor %}
</nav>
{% endif %}
Bug Fixes
This release also fixes several important issues:
- Section page parent references: Auto-generated section pages (directories without
_index.md) now correctly inherit the section as parent instead of home, preventing URL collisions between identically-named files across directories. - Resource URL generation: Fixed when
RelPermalinkDirlacks a trailing slash (e.g., root/). - Resource Name/Title rendering: Liquid template rendering now uses
SiteInternalinstead of theSiteOutputfacade. - Debian publishing: The
.debpackage is now correctly published to the generic package registry and attached as a release link.