v6.7.0 Release: Many Tongues, One Site

2026-07-01

SuCoS 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 switchers
  • page.AllTranslations — all translations including self, sorted by language weight
  • page.TranslationsByLanguage — translations keyed by language code
  • page.Variants — every representation across all languages and output formats
  • page.AlternativeOutputFormats — output formats (HTML, RSS, JSON) for the same language
  • page.IsDefaultLanguage — check if page is in the site's default language
  • site.Languages — list of all configured language settings
  • site.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 RelPermalinkDir lacks a trailing slash (e.g., root /).
  • Resource Name/Title rendering: Liquid template rendering now uses SiteInternal instead of the SiteOutput facade.
  • Debian publishing: The .deb package is now correctly published to the generic package registry and attached as a release link.

Download It Now

View Changelog