2014-05-12 46 views
8

我正在用django 1.4运行python2.7。python/django - html选择列表中的双向括号问题

我有我的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усский 

问题是,当页面在像阿拉伯语选择列表呈现一个RTL语言被认为有错位置的LTR文本的括号如下:

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

怎么办我在view.py文件中编写代码以正确显示双向括号?

我已经阅读了很多主题,并尝试了很多不同的方法来解决这个问题,但我已经没有想法。

一次没有奏效的尝试是用Unicode控制(定向)字符挡住语言名称‪ ‬ & rlm;在view.py文件中 - ‪ ‬ & rlm;被渲染到页面中的选择列表。例如:

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

还增加了以下的CSS没有效果:

direction: rtl; unicode-bidi: embed 
+0

您是否试过https://pypi.python.org/pypi/django-right-to-left/0.1.1? –

+0

我还没有尝试django从右到左,因为问题仍然会发生由于rtl,ltr和中性文本的混合。括号被认为是一个中性文本字段。 – user1261774

+0

您是否尝试将Unicode控制字符直接嵌入到源代码中(在'LANGUAGES'中)?我认为将这些控制字符添加到views.py是没有意义的,因为您不知道它是否会提前使用RTL或LTR语言。 – user193130

回答

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 ‎ 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的方向,然后只更新本地语言(如果合适的话)(rtl中的ltr,反之亦然)...

+1

cchristelis谢谢你。 我确实知道,在括号前/后添加文本确实解决了问题,但是文本将显示在选择列表中。 我不知道的是,添加** \ u200E **解决了BiDi括号问题,并且**不会显示给选择列表中的用户。 ** \ u200E **从左到右的标记(LRM)是一个控制字符或不可见的格式化字符。 另外,对于试图解决此问题的任何其他用户,只需将\ u200E添加到所有括号中,就好像仅将\ u200E添加到rtl语言一样。 再次,谢谢。 – user1261774

+0

很高兴帮助:) – cchristelis

1

,如果我不知道你的阿拉伯语转换的坏数据。 你试过重新编译你的消息吗?

django-admin.py compilemessages 
+0

是的,我已经多次编译我的消息,但问题仍然存在。 – user1261774

0

解决BiDi括号问题:您只需要在最后一个括号之后添加LRM字符。 HTML实体:‎

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