python / django - HTML选择列表中的双向括号问题
我正在使用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 个回答
要解决双向括号的问题,你只需要在最后一个括号后面加上一个LRM字符。这个字符在HTML中用这个方式表示:‎
<html dir="rtl">
<body>
<p>hello (world)‎</p>
</body></html>
我在想,可能是你的阿拉伯语转换数据有问题。你试过重新编译你的消息吗?
django-admin.py compilemessages
在你的阿拉伯文本示例中,文本的主要方向设置为从右到左。括号的方向会根据它周围的文字方向来决定,如果它夹在从右到左和从左到右的文本之间。所以在你的例子中,如果你在括号后面加一个单词,这个问题就会解决。我建议你试着加一些单词来理解这个解决办法。
不过,这样做比较麻烦,对于你的生产代码,我建议用另一种方法。假设你知道括号只出现在从左到右的语言中,你需要用一个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 ‎ 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)……