Gettext为静态网站
以下是使用GNU gettext为静态网站实施翻译管理系统的方法。 对于不耐烦的人,我已经把它解释为最后的11条说明。
目标
该系统允许逐块翻译(逐字符串),这比逐页更好,因为:
- 对非翻译部分的更改将自动应用于所有翻译(格式,标签,图像,也许日期,名称,链接等)。
- 通过将所有页面的文本块存储在一起,重复的块只需要翻译一次(菜单文本,版权声明,标题等)。
- 当翻译仍在进行中时,原始版本将不会丢失。
- 当您更改原始段落时,您可以更容易地看到哪些部分翻译需要更新。
对于这样一个系统,抽象的步骤是:
- 以某种方式标记您的网页中的每个可翻译的文本块。 不可翻译的部分将成为一个共享的框架。
- 将块提取到数据库中。 翻译。
- 查找或编写一些软件将这些块合并到框架中以重构原始网页 - 但可以选择从英文数据库或数据库的翻译版本中获取文本块。
Gettext似乎是一个明显的可能性,现在所有的工作都很完美,但是花了我八个小时。 困难在于现有的文档全部用于为计算机程序使用gettext,而不是用于网站或文档。 那是当我意识到我必须记录我所做的:
我做了什么
我开始把我的网页最小化为电脑程式。 这涉及到五个步骤:
- 编写一个将一些文本(字符串)打印成文件的小程序。
- 将网页复制到程序中以代替字符串。
- 插入gettext所需的一些标准位代码。
- 将字符串分割成较小的字符串,将可翻译与不可翻译分离
- 使用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
)。 我会尽量保留笔记在这里发布。
说明
- 制作一个空文件
generate-index.scm
- 将我的
generate-index.scm
(上面)复制到你的文件中 - 调整
generate-index.scm
中的构建目录(第3个定义的变量),指向generate-index.scm的目录
$ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
$ mv ciarans-website.po ciarans-website.pot
$ msginit --locale=fr
- 编辑
fr.po
以添加三个文本字符串的翻译 $ mkdir -p fr/LC_MESSAGES
$ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po
$ chmod +x generate-index.scm
$ LANGUAGE=fr ./generate-index.scm; cat index.html
-
Ciaran O'Riordan ,( RSS )
支持免费软件:加入FSFE的奖学金