python / django - HTML选择列表中的双向括号问题

8 投票
3 回答
802 浏览
提问于 2025-04-18 06:16

我正在使用python2.7和django 1.4。

在我的views.py文件中,有一段代码可以返回语言名称,并显示在一个下拉列表中:

python代码: (views.py)

available_languages = []
for lv in language_versions:
    language = LANGUAGES[lv.language_code]
    if lv.language_code == user_language_code:
        language_label = (lv.language_code, u"%s" % (language.name_native))
    else:
        language_label = (lv.language_code, u"%s / %s" % (language.name, language.name_native))
    available_languages.append(language_label)
....
available_languages = sorted(available_languages, key=lambda x: x[1], cmp=compare)

return available_languages

HTML代码:

{{ field }}

下拉列表:

German / Deutsch
Polish / polski
Portuguese (Brasil) / português (Brasil)
Spanish (Latin America) / español (Latinoamérica)
Russian / pусский

问题是,当页面在像阿拉伯语这样的从右到左的语言中查看时,下拉列表的显示会出现问题,括号的位置不对:

لألمانية / Deutsch
البولندية / polski
البرتغالية) لبرتغال) / português) Portugal)
لإسبانية أمريكا) اللاتينية) / español) Latinoamérica)
الروسية / pусский

我该如何在view.py文件中编写代码,以正确显示双向文本的括号呢?

我已经阅读了很多相关的讨论,并尝试了多种方法来解决这个问题,但我已经没有其他想法了。

我尝试过的一种方法是,在语言名称的前后加上Unicode控制字符(方向性字符)& #8234; & #8236; & rlm;,但在view.py文件中这样做并没有效果,结果是这些字符直接显示在页面的下拉列表中。例如:

& #8234;إسبانية أمريكا) اللاتينية) / português (Brasil)& #8236; & rlm;

另外,添加以下内容到CSS中也没有任何效果:

direction: rtl; unicode-bidi: embed

3 个回答

0

要解决双向括号的问题,你只需要在最后一个括号后面加上一个LRM字符。这个字符在HTML中用这个方式表示:‎

<html dir="rtl">
<body>
<p>hello (world)&#x200E;</p>
</body></html>
1

我在想,可能是你的阿拉伯语转换数据有问题。你试过重新编译你的消息吗?

django-admin.py compilemessages
3

在你的阿拉伯文本示例中,文本的主要方向设置为从右到左。括号的方向会根据它周围的文字方向来决定,如果它夹在从右到左和从左到右的文本之间。所以在你的例子中,如果你在括号后面加一个单词,这个问题就会解决。我建议你试着加一些单词来理解这个解决办法。

不过,这样做比较麻烦,对于你的生产代码,我建议用另一种方法。假设你知道括号只出现在从左到右的语言中,你需要用一个unicode控制字符来结束括号(可以试着手动加到你的测试中)。所以在这种情况下,我的解决办法就是用括号和控制字符来替换原来的括号:

for lv in language_versions:
    language = LANGUAGES[lv.language_code]
    if lv.language_code == user_language_code:
        language_label = (lv.language_code, u"%s" % (language.name_native))
    else:
        native = language.name_native.replace(u')', u')\u200E') # I haven't tested this and you might have to add the html character code &#x200E; here. please edit this if you find that to be the case.
        language_label = (lv.language_code, u"%s / %s" % (language.name, native))
    available_languages.append(language_label)

显然,如果你在从右到左的语言中有括号,你首先得测试一下use_language_code的方向,然后再根据需要更新本地语言(从右到左用ltr,从左到右用rtl)……

撰写回答