From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id SH5BG2bMIV+VFQAA0tVLHw (envelope-from ) for ; Wed, 29 Jul 2020 19:22:14 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0 with LMTPS id 4HoQF2bMIV8BBwAA1q6Kng (envelope-from ) for ; Wed, 29 Jul 2020 19:22:14 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id A7A009403AB for ; Wed, 29 Jul 2020 19:22:13 +0000 (UTC) Received: from localhost ([::1]:37182 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k0reV-0008WU-1R for larch@yhetil.org; Wed, 29 Jul 2020 15:22:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49780) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k0reM-0008WF-O5 for bug-guix@gnu.org; Wed, 29 Jul 2020 15:22:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:50442) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1k0reM-0003sr-Ep for bug-guix@gnu.org; Wed, 29 Jul 2020 15:22:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1k0reM-0005Hz-Bs for bug-guix@gnu.org; Wed, 29 Jul 2020 15:22:02 -0400 X-Loop: help-debbugs@gnu.org Subject: bug#26302: Multilingual web site is on-line! Resent-From: "pelzflorian (Florian Pelz)" Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Wed, 29 Jul 2020 19:22:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 26302 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Ludovic =?UTF-8?Q?Court=C3=A8s?= Received: via spool by 26302-submit@debbugs.gnu.org id=B26302.159605049220274 (code B ref 26302); Wed, 29 Jul 2020 19:22:02 +0000 Received: (at 26302) by debbugs.gnu.org; 29 Jul 2020 19:21:32 +0000 Received: from localhost ([127.0.0.1]:33752 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1k0rdl-0005Gp-7N for submit@debbugs.gnu.org; Wed, 29 Jul 2020 15:21:32 -0400 Received: from pelzflorian.de ([5.45.111.108]:35202 helo=mail.pelzflorian.de) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1k0rde-0005GW-5W for 26302@debbugs.gnu.org; Wed, 29 Jul 2020 15:21:24 -0400 Received: from pelzflorian.localdomain (unknown [5.45.111.108]) by mail.pelzflorian.de (Postfix) with ESMTPSA id 492463602A4; Wed, 29 Jul 2020 21:21:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=pelzflorian.de; s=mail; t=1596050473; bh=b4w1VuTYRYklpHTP+Env5Mx/VZYqGNXAt3NGJR5Q9wY=; h=Date:From:To:Cc:Subject:References:In-Reply-To; b=v5DH3xl7UxYFAVf3JaRF4YDzC1/YvXPb+o62TGHenzPiZW637rGtNJ/YEKeYMZI4l pRYiFsZ5RXb5/bVxxLYqc7ExKUAR1nqEnlbP1xUa+Pwf8/fK12JVt5N7pqMoQrj4uH OU7CIe7ROv/XT2wOC/9nNcvbi2R7pRVHRFu0hgzQ= Date: Wed, 29 Jul 2020 21:21:03 +0200 From: "pelzflorian (Florian Pelz)" Message-ID: <20200729192103.2fug7t6to2tuiwew@pelzflorian.localdomain> References: <20200409173102.gaheruhtp7fg6cgg@pelzflorian.localdomain> <20200705090808.7c7ihjnymo6hv7ch@pelzflorian.localdomain> <87d054bzru.fsf@gnu.org> <20200709144524.fjri2znqer2dzn7a@pelzflorian.localdomain> <20200710172732.7a2tm7hcqt4mmhlo@pelzflorian.localdomain> <20200712061927.uoubuabreji4dw54@pelzflorian.localdomain> <87d04i2mpc.fsf_-_@gnu.org> <20200726185740.p2cobbqpyevywpkl@pelzflorian.localdomain> <20200727160101.nsznenkv75wcsuoe@pelzflorian.localdomain> <87k0yns416.fsf@gnu.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="wki2oaaslwyprwuv" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <87k0yns416.fsf@gnu.org> X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-Spam-Score: -1.0 (-) X-BeenThere: bug-guix@gnu.org List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniela Lura , sirgazil , 26302 <26302@debbugs.gnu.org> Errors-To: bug-guix-bounces+larch=yhetil.org@gnu.org Sender: "bug-Guix" X-Scanner: scn0 Authentication-Results: aspmx1.migadu.com; dkim=fail (rsa verify failed) header.d=pelzflorian.de header.s=mail header.b=v5DH3xl7; dmarc=none; spf=pass (aspmx1.migadu.com: domain of bug-guix-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=bug-guix-bounces@gnu.org X-Spam-Score: -0.01 X-TUID: Iec8S7RMLFsX --wki2oaaslwyprwuv Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit On Tue, Jul 28, 2020 at 11:50:13PM +0200, Ludovic Courtès wrote: > "pelzflorian (Florian Pelz)" skribis: > > Guix’ website is written in > > [SHTML](https://www.nongnu.org/guile-lib/doc/ref/htmlprag/), which is > > a variant of HTML (in which web pages are usually written) that > > I think it’s technically SXHTML, no? > https://www.gnu.org/software/guile/manual/html_node/SXML.html The result is not valid XHTML. I will just call it SXML now, which is what the Haunt info manual calls it. > I wonder if we should link to more practical step-by-step instructions > on how to get started translating, to lower the barrier for those who > want to get started without engaging in possibly open-ended discussions > with the fabulous Guix team. :-) I don’t know how best to integrate step-by-step instructions. While the TP has instructions , they seem more intimidating to me than, as a first step, talking to the helpful people at the TP. A few steps also describe how to disclaim copyright, which Guix does not ask for anyway. I propose the attached blog post draft if noone objects, taking into account Ludo’s helpful suggestions. Is it missing anything interesting about the i18n system? Should I add it to the website as a draft? I suppose no, I suppose I should just publish it as-is once guix-website.pot is at the TP. Regards, Florian --wki2oaaslwyprwuv Content-Type: text/markdown; charset=utf-8 Content-Disposition: attachment; filename="2nd-draft-blog-post-translatable-website.md" Content-Transfer-Encoding: 8bit title: Adding translations to Guix’ website date: 2020-07-29 15:00 author: Florian Pelz tags: Community --- As part of [GNU](https://www.gnu.org), 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](https://guix.gnu.org/help) can expect an answer even if they do so in languages other than English. We also offer software translations 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. Guix uses [GNU Gettext](https://www.gnu.org/software/gettext) for its translations, with which translatable strings are extracted from the source code to so-called PO files. Translators can use any of various free-software tools, such as [GNU Emacs](https://www.gnu.org/software/emacs) or [Poedit](https://poedit.net), for filling in translations. With [Po4a](https://po4a.org), we can also use Gettext’s tooling to translate Guix’ [manual](https://guix.gnu.org/manual/) and [cookbook](https://guix.gnu.org/cookbook/). But this was not true of its web presence. That’s why after a [lengthy process,](https://issues.guix.info/issue/26302) 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](https://schemers.org). Instead of XML tags, we use [SXML](https://www.gnu.org/software/guile/manual/html_node/SXML.html). This allows web authors to mix code and text. It looks like this: ```scheme `(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](https://www.gnu.org), which uses a software package called [GNUnited Nations](https://www.gnu.org/software/gnun) 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 as native <2>Guile 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:](https://www.gnu.org/software/guile/manual/html_node/Gettext-Support.html#Gettext-Support) ```scheme `(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.2>Defining-Packages.html as native <2>Guile modules." msgstr "Pakete werden als reine <2>Guile-Module <1>definiert<1.1>de<1.2>Pakete-definieren.html." ``` Details are [documented here](https://git.savannah.gnu.org/cgit/guix/guix-artwork.git/tree/website/i18n-howto.txt). 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](https://translationproject.org/team) at the [Translation Project](https://translationproject.org) or [us Guix developers](https://guix.gnu.org/contact) if you want to help make Guix’ website available in your language as well! #### About GNU Guix [GNU Guix](https://guix.gnu.org) is a transactional package manager and an advanced distribution of the GNU system that [respects user freedom](https://www.gnu.org/distros/free-system-distribution-guidelines.html). Guix can be used on top of any system running the kernel Linux, 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](https://www.gnu.org/software/guile) programming interfaces and extensions to the [Scheme](https://schemers.org) language. --wki2oaaslwyprwuv--