Django French Translation - 如何处理翻译字符串中的单引号?

Django French Translation - how to handle single quotes in translation strings?

我正在使用 Python 3.5.2 和 Django 1.10。

我收到了法语 t运行slation .po 文件,可以 运行 compilemessages 命令而不会收到任何错误。

但是,当我运行这个网站时,很多页面都拒绝加载。

我怀疑这是因为法语 t运行slation .po 文件在 t运行slation 字符串中包含许多单引号 (')。

例如,

#: .\core\constants\address_country_style_types.py:274
msgid "Ascension Island"
msgstr "Île de l'Ascension"

我记得在某处读过(但在任何地方都找不到该参考资料)单引号前面必须有正斜杠或反斜杠。所以我试过了,但是当我 运行 compilemessage 命令时,我收到一条错误消息:

C:\Users\me\desktop\myapp\myapp\locale\fr\LC_MESSAGES\django.po:423:18: invalid control sequence

那么如何转义字符串中的法语单引号问题呢?

这是我的法语 .po 文件的 header:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-05-04 12:55+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

我不确定这个问题的原因是什么(也许是翻译器以某种方式损坏了文件?)。

但是,解决方法是不使用标准单引号 ',我使用了这个单引号(取自 MS Word 中的符号):

我还没有与法语翻译人员核对过,但它看起来和工作正常。

我希望这对某人有所帮助。

正确的方法是"Escape"单引号,但是,您需要知道使用文本的端点。就像您发现反斜杠一样,例如: L\'阿森松岛

相信我,法国人不会喜欢看到反引号。回到 90 年代的 DOS 时代,视觉上几乎没有区别。现在有了字体,它变得丑陋了。

由于您是为网络制作的,因此请使用 HTML 替换,例如 '

查看这篇文章: Why shouldn't `&apos;` be used to escape single quotes?

我讲法语,我的大多数用户也是。 非常烦人的错误。 正常的 django 转义技术(通过 \'format_html(my_translated_string))对我也不起作用。 我使用 而不是 ' 并且它工作正常 - compilemessage 命令工作并且 html 节点工作正常。

然而,它不是很优雅或稳健,因为任何未来的消息都需要考虑到这一点,并且使用字符 ´

并不是很常见

我发现了另一个更好更强大的解决方案: 通过模板过滤器转义。

在 html 模板中:

<h5 class="modal-title">{{help_message_body|escape}}</h5>

并在 javascript 中:

modal.find('.modal-message').html('<h5 class="modal-title">{{help_message_body|escapejs}}</h5>')

解决方法是

#: .\core\constants\address_country_style_types.py:274
msgid "Ascension Island"
msgstr "Ile de l&lsquo;Ascension"

它有效,即使它会在某些 JavaScript 中使用。不要使用数字代码 &#39;,它在表单字段中不起作用,它不会被渲染,你会看到丑陋的数字。我已经测试了所有这些。

正如我在评论中所说,不建议以大写重音字母开头单词。如果您输入 Île 然后对国家/地区列表进行排序,则 Ç 字符将出现在 Z 之后,并且不会像您期望的那样按照自然顺序进行排序。

这是 Python 排序功能的另一个问题。它只会根据每个字母的编码数字跟随扩展的ASCII码。而 Ç 的 ANSI 代码为 206,它位于 Z 之后,即 90。

也许Python对此提供了解决方案,但我还没有找到。如果有人找到它,我会很高兴知道。