use*_*774 8 python django bidi html-rendering
我用django 1.4运行python2.7.
我在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
Run Code Online (Sandbox Code Playgroud)
HTML代码:
{{ field }}
Run Code Online (Sandbox Code Playgroud)
选择清单:
German / Deutsch
Polish / polski
Portuguese (Brasil) / português (Brasil)
Spanish (Latin America) / español (Latinoamérica)
Russian / p??????
Run Code Online (Sandbox Code Playgroud)
问题是当用阿拉伯语等rtl语言查看页面时,选择列表呈现如下,并且ltr文本的括号位于错误的位置:
???????? / Deutsch
????????? / polski
??????????) ???????) / português) Portugal)
???????? ??????) ?????????) / español) Latinoamérica)
??????? / p??????
Run Code Online (Sandbox Code Playgroud)
如何在view.py文件中编写代码以正确显示bidi括号?
我已经阅读了很多线程并尝试了许多不同的方法来解决这个问题,但我的想法已经用完了.
一个不起作用的尝试是使用Unicode控件(方向)字符来掩盖语言名称 在view.py文件中 - 被渲染到页面中的选择列表.例如:
إسبانيةأمريكا)اللاتينية)/português(Brasil)
另外在css中添加以下内容无效:
direction: rtl; unicode-bidi: embed
Run Code Online (Sandbox Code Playgroud)
在您的阿拉伯语文本示例中,文本的主要方向已设置为从右到左。如果括号位于从右到左和从左到右文本之间,则采用流行语言的方向。因此,在您的示例中,如果您将文本更改为在括号后有一个单词,问题就会消失。我建议你用添加的单词来测试它以理解解决方案。
这很麻烦,对于您的生产代码,我建议使用另一种解决方案。假设您知道括号仅出现在从左到右的语言中,您需要使用 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)
Run Code Online (Sandbox Code Playgroud)
显然,如果您的从右到左的语言中有括号,则必须首先测试 use_language_code 的方向,然后仅在适当的情况下更新本机语言(rtl 中的ltr,反之亦然)...