Adding translations to Guix’ website

As part of GNU, Guix aims to bring freedom to computer users all over the world, no matter the languages they (prefer to) speak. For example, Guix users asking for help can expect an answer even if they do so in languages other than English.

We also offer translated software for people more comfortable with a language other than English. Thanks to many people who contribute translations, GNU Guix and the packages it distributes can be used in various languages, which we value greatly. We are happy to announce that Guix’ website can now be translated in the same manner. If you want to get a glimpse on how the translation process works, first from a translator’s, then from a programmer’s perspective, read on.

The process for translators is kept simple. Like lots of other free software packages, Guix uses GNU Gettext for its translations, with which translatable strings are extracted from the source code to so-called PO files. If this is new to you, the magic behind the translation process is best understood by taking a look at one of them. Download a PO file for your language at the Fedora Weblate instance.

Even though PO files are text files, changes should not be made with a text editor but with PO editing software. Weblate integrates PO editing functionality. Alternatively, translators can use any of various free-software tools for filling in translations, of which Poedit is one example, and (after logging in) upload the changed file. There also is a special PO editing mode for users of GNU Emacs. Over time translators find out what software they are happy with and what features they need.

Help with translations is much appreciated. Since Guix integrates with the wider free software ecosystem, if you intend to become a translator, it is worth taking a look at the styleguides and the work of other translators. You will find some at your language’s team at the Translation Project (TP).

So much for the translation of ordinary source code. With Po4a, we can also use Gettext’s tooling to translate Guix’ manual and cookbook. But all this was not true of its web presence. That’s why after a lengthy process, the website of GNU Guix has undergone an update. It now supports translation into other languages. Such support is known as internationalization (“i18n”).

Guix’ website is written in a variant of HTML (in which web pages are usually written) that integrates better with the Scheme programming language. Instead of XML tags, we use SXML. This allows web authors to mix code and text. It looks like this:

`(section
  (h2 "On packaging")
  (p
   "Packages are "
   (a (@ (href ,(manual-url "Defining-Packages.html"))) "defined")
   " as native "
   (a (@ (href ,(gnu-url "software/guile"))) "Guile")
   " modules."))

However, this mixing makes it more difficult to extract the strings to be translated. We therefore cannot take the same approach as gnu.org, which uses a software package called GNUnited Nations to extract from pure HTML mark-up. Translators are not always coders and we would prefer to show them only the textual part, like this:

msgid "Packages are <1>defined</1> as native <2>Guile</2> modules."

Our new, custom i18n system does this. The website authors need to mark translatable expressions in the same way ordinary strings are usually marked in Guile Scheme programs:

`(section
  ,(G_ `(h2 "On packaging"))
  ;; TRANSLATORS: Defining Packages is a section name
  ;; in the English (en) manual.
  ,(G_ `(p
         "Packages are "
         ,(G_ (manual-href "defined" (G_ "en") (G_ "Defining-Packages.html")))
         " as native "
         ,(G_ `(a (@ (href ,(gnu-url "software/guile"))) "Guile"))
         " modules.")))

Translators can arbitrarily change the ordering:

#. TRANSLATORS: Defining Packages is a section name
#. in the English (en) manual.
#: apps/base/templates/about.scm:64
msgid "Packages are <1>defined<1.1>en</1.1><1.2>Defining-Packages.html</1.2></1> as native <2>Guile</2> modules."
msgstr "Pakete werden als reine <2>Guile</2>-Module <1>definiert<1.1>de</1.1><1.2>Pakete-definieren.html</1.2></1>."

Details are documented here. We hope it strikes the right balance between simplicity for the website’s developers and translator comfort. Still missing is a way to translate blog posts like the one you are reading here.

With ideas for and by a more diverse community, we can look forward to a bright multi-lingual future. Please get in touch with your language’s team or us Guix developers if you want to help make Guix’ website available in your language as well!

About GNU Guix

GNU Guix is a transactional package manager and an advanced distribution of the GNU system that respects user freedom. Guix can be used on top of any system running the Hurd or the Linux kernel, or it can be used as a standalone operating system distribution for i686, x86_64, ARMv7, and AArch64 machines.

In addition to standard package management features, Guix supports transactional upgrades and roll-backs, unprivileged package management, per-user profiles, and garbage collection. When used as a standalone GNU/Linux distribution, Guix offers a declarative, stateless approach to operating system configuration management. Guix is highly customizable and hackable through Guile programming interfaces and extensions to the Scheme language.

Related topics:

Community

Unless otherwise stated, blog posts on this site are copyrighted by their respective authors and published under the terms of the CC-BY-SA 4.0 license and those of the GNU Free Documentation License (version 1.3 or later, with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts).