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)&#x200E;</p>
</body></html>
Другие вопросы по тегам