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усский
Проблема заключается в том, что когда страница просматривается на языке RTL, например, на арабском, список выбора отображается следующим образом, а скобки текста ltr находятся в неправильных позициях:
لألمانية / Deutsch
البولندية / polski
البرتغالية) لبرتغال) / português) Portugal)
لإسبانية أمريكا) اللاتينية) / español) Latinoamérica)
الروسية / pусский
Как мне написать код в файле view.py, чтобы правильно отображать биди-скобки?
Я прочитал довольно много тем и попробовал много разных способов решить проблему, но у меня закончились идеи.
Одна из попыток, которая не сработала, состояла в том, чтобы изменить названия языков с помощью управляющих (направленных) символов Unicode & # 8234; & # 8236; & rlm; в файле view.py - & #8234; & #8236; & rlm; отображается в списке выбора на странице. Например:
& # 8234; إسبانية أمريكا) اللاتينية) / português (Бразилия)& #8236; & rlm;
Также добавление следующего к css не имеет никакого эффекта:
direction: rtl; unicode-bidi: embed
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, а затем обновлять только родной язык, если это необходимо (ltr в rtl и наоборот)...
Интересно, если это плохие данные для вашего арабского преобразования. Вы пытались перекомпилировать свои сообщения?
django-admin.py compilemessages
Чтобы решить проблему скобок BiDi: Вам просто нужно добавить символ LRM после последней скобки. HTML-сущность: ‎
<html dir="rtl">
<body>
<p>hello (world)‎</p>
</body></html>