【问题标题】:Django French Translation - how to handle single quotes in translation strings?Django 法语翻译 - 如何处理翻译字符串中的单引号?
【发布时间】:2017-05-04 07:01:58
【问题描述】:

我正在使用 Python 3.5.2 和 Django 1.10。

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

但是,当我运行该网站时,许多页面拒绝加载。

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

例如,

#: .\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 文件的标题:

# 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"

【问题讨论】:

  • 我不确定是不是这个问题,我参与过许多 django 项目,其中包括法语,但我不记得有这个问题。
  • 这可能是字符编码(又名“编解码器”)问题。不是 ' 字符。你确定这些文件是有效的 utf8(用一个好的文本编辑器检查)。
  • @Jonas Giuro - 你使用标准单引号吗?例如:'?
  • 是的,我是这样使用它的"Île de l'Ascension",根据我的经验,混乱的翻译呈现为混乱的翻译,它们不会阻止整个页面的呈现。
  • @Jonas Giuro - 我用过,它工作正常 - compilemessage 命令工作和页面加载。不确定' 的问题是什么。您认为使用 - "Île de l′Ascension" 进行法语翻译可以吗?法语语法正确吗?

标签: python django translation language-translation


【解决方案1】:

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

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

我还没有和法语翻译核实这个,但它看起来和工作正常。

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

【讨论】:

    【解决方案2】:

    正确的方法是“转义”单引号,但是,您需要知道使用文本的端点。就像您在反斜杠中发现的那样,例如: 升天

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

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

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

    【讨论】:

      【解决方案3】:

      解决办法是

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        我会说法语,我的大多数用户也是如此。 很烦人的bug。 正常的 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>')
        

        【讨论】:

          猜你喜欢
          • 2014-05-21
          • 2011-05-15
          • 1970-01-01
          • 2011-11-28
          • 2011-12-25
          • 2016-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多