静态网站的Gettext

Gettext为静态网站

以下是使用GNU gettext为静态网站实施翻译管理系统的方法。 对于不耐烦的人,我已经把它解释为最后的11条说明。

目标

该系统允许逐块翻译(逐字符串),这比逐页更好,因为:

  • 对非翻译部分的更改将自动应用于所有翻译(格式,标签,图像,也许日期,名称,链接等)。
  • 通过将所有页面的文本块存储在一起,重复的块只需要翻译一次(菜单文本,版权声明,标题等)。
  • 当翻译仍在进行中时,原始版本将不会丢失。
  • 当您更改原始段落时,您可以更容易地看到哪些部分翻译需要更新。

对于这样一个系统,抽象的步骤是:

  1. 以某种方式标记您的网页中的每个可翻译的文本块。 不可翻译的部分将成为一个共享的框架。
  2. 将块提取到数据库中。 翻译。
  3. 查找或编写一些软件将这些块合并到框架中以重构原始网页 - 但可以选择从英文数据库或数据库的翻译版本中获取文本块。

Gettext似乎是一个明显的可能性,现在所有的工作都很完美,但是花了我八个小时。 困难在于现有的文档全部用于为计算机程序使用gettext,而不是用于网站或文档。 那是当我意识到我必须记录我所做的:

我做了什么

我开始把我的网页最小化为电脑程式。 这涉及到五个步骤:

  1. 编写一个将一些文本(字符串)打印成文件的小程序。
  2. 将网页复制到程序中以代替字符串。
  3. 插入gettext所需的一些标准位代码。
  4. 将字符串分割成较小的字符串,将可翻译与不可翻译分离
  5. 使用gettexts标记标记可翻译的字符串(标签的格式取决于您使用的编程语言,但通常是涉及下划线的内容)。

Gettext可以使用很多编程语言,因此可以从包中随附的示例中选择。 在我的电脑上,这些是在这个文件夹中:
/ usr / share / doc / gettext-doc / examples /
语言的选择并不重要。 代码会很简单。

这是我原来的index.html

<html>
<head>
<title>Cow</title>
</head>
<body>
<p>See also: <a href="http://fsfe.org/">FSFE</a></p>
</body>
</html>

在支持的编程语言中,我选择Scheme (Lisp的方言)。 乍看之下,下面的代码看起来很复杂,但您只需要修改第一个和第三个块。 第一个块定义了三个变量,这些变量应该是不言自明的。 所有网页文字都在第三块。 它被分解成块,我已经将Scheme (_)的 gettext标签放在可翻译的块周围。 这里是generate-index.scm

#!/usr/bin/guile -s
!#
(define output-filename "index.html")
(define project-name "ciarans-website")
(define build-directory "/home/ciaran/website-build/")
(use-modules (ice-9 format))
(catch #t (lambda () (setlocale LC_ALL "")) (lambda args #f))
(textdomain project-name)
(bindtextdomain project-name build-directory)
(define _ gettext)
(define page-text (string-append
   "<html><head>\n<title>"
(_ "Cow")
   "</title>\n</head>\n<body>\n<p>"
(_ "See also: ")
   "<a href=\"http://fsfe.org/\">"
(_ "FSFE")
   "</a></p>\n"
   "</body></html>\n\n"))
(define the-file (open-file output-filename "w"))
(display page-text the-file)

八个字符串中的三个被标记为可翻译。 另外五个是共享帧的一部分,无论生成什么语言版本的页面都是一样的。

请记住用反斜杠引号( \“ )替换HTML中的任何引号,并添加一些换行符( \ n )以使输出可读,这些是Scheme的引用和换行序列,它们是在其他几种语言中是相同的,但在其他语言中却是不同的。

在继续之前,您必须将“build-directory”变量设置为generate-index.scm所在的目录 。 如果你不这样做,一切似乎都会起作用,但你的程序永远不会访问已翻译的字符串。

这样做,您可以用这两个命令提取可翻译的字符串:

  • $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  • $ mv ciarans-website.po ciarans-website.pot

然后,您可以使用此命令为法语翻译创建一个文件(“po”文件):

  • $ msginit --locale=fr

gettext手册的一部分说“ msginit ”是可选的 - 你可以手动执行,但这根本不适用于我。 我花了两个小时来诊断这个问题。 使用msginit

这可以创建fr.po ,您可以使用任何文本编辑器进行编辑。 顶部会有这样一条线:

"Content-Type: text/plain; charset=UTF-8\n"

如果您的字符集为“ASCII”,则应该将其更改为UTF-8。 如果您的字符集是别的东西,并且从其他gettext工具(如msgmerge)获取关于无效字符的错误消息,那么将charset更改为UTF-8也可能是答案。 还将有一个内容传输编码的字段。 手册应该总是“8bit”。

Emacs特别适用于编辑po文件,因为它们具有特殊的编辑模式。

然后您必须将您的po文件转换为特殊的mo格式,并将其放在子目录中,其中gettext希望使用这两个命令:

  • $ mkdir -p fr/LC_MESSAGES
  • $ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po

使Scheme文件可执行,就是这样!

ciaran@hide:~/tests/simple-page$ LANGUAGE=fr ./generate-index.scm; cat index.html
<html><head>
<title>Vache</title>
</head>
<body>
<p>Voir aussi : <a href="http://fsfe.org/">La FSFE</a></p>
</body></html>
ciaran@hide:~/tests/simple-page$ LANGUAGE=en ./generate-index.scm; cat index.html
<html><head>
<title>Cow</title>
</head>
<body>
<p>See also: <a href="http://fsfe.org/">FSFE</a></p>
</body></html>
ciaran@hide:~/tests/simple-page$ 

好的,所以有你的概念证明。 接下来,我必须将我的站点转换到这个系统并维护它(使用msgmerge )。 我会尽量保留笔记在这里发布。

说明

  1. 制作一个空文件generate-index.scm
  2. 将我的generate-index.scm (上面)复制到你的文件中
  3. 调整generate-index.scm中的构建目录(第3个定义的变量),指向generate-index.scm的目录
  4. $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  5. $ mv ciarans-website.po ciarans-website.pot
  6. $ msginit --locale=fr
  7. 编辑fr.po以添加三个文本字符串的翻译
  8. $ mkdir -p fr/LC_MESSAGES
  9. $ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po
  10. $ chmod +x generate-index.scm
  11. $ LANGUAGE=fr ./generate-index.scm; cat index.html

-
Ciaran O'Riordan ,( RSS
支持免费软件:加入FSFE的奖学金

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏