2014-05-12 16 views
8

Ich führe python2.7 mit django 1.4.python/django - bidi klammern problem in html select list

Ich habe den folgenden Code in meiner views.py Seite, die die Sprachnamen in einer Auswahlliste zurückgibt:

Python-Code: (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-Code:

{{ field }} 

Auswahlliste:

German/Deutsch 
Polish/polski 
Portuguese (Brasil)/português (Brasil) 
Spanish (Latin America)/español (Latinoamérica) 
Russian/pусский 

Das Problem ist, wenn die Seite in einer rtl Sprache wie Arabisch betrachtet wird die Auswahlliste wiedergegeben wird, wie mit den Klammern des ltr Textes in den falschen Positionen folgt:

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

Wie Ich schreibe den Code in der Datei view.py, um die bidi-Klammern korrekt anzuzeigen.

Ich habe einige Threads gelesen und viele verschiedene Möglichkeiten ausprobiert, um das Problem zu beheben, aber mir sind die Ideen ausgegangen.

Ein Versuch, der nicht funktionierte, war das Büchsen der Sprachnamen mit den Unicode-Kontroll- (Richtungs-) Zeichen & # 8234; & # 8236; & rlm; in der Datei view.py - & # 8234; & # 8236; & rlm; wird in die Auswahlliste auf der Seite gerendert. Zum Beispiel:

& # 8234; إسبانية أمريكا) اللاتينية)/português (Brasil) & # 8236; & rlm; wenn seine schlechte Daten für Ihre Arabisch Umwandlung

direction: rtl; unicode-bidi: embed 
+0

Haben Sie versucht https://pypi.python.org/pypi/django-right-to-left/0.1.1? –

+0

Ich habe nicht versucht, Django-rechts-nach-links, weil das Problem immer noch aufgrund der Mischung von RTL, Ltr und neutralen Text auftreten würde. Die Klammer wird als neutrales Textfeld betrachtet. – user1261774

+0

Haben Sie versucht, die Unicode-Steuerzeichen direkt in die Quelle einzubetten (in 'LANGUAGES')? Ich würde denken, dass das Hinzufügen dieser Steuerzeichen zu views.py keinen Sinn macht, da Sie nicht wissen, ob es im voraus eine RTL- oder LTR-Sprache sein wird. – user193130

Antwort

3

In Ihrem Beispiel für arabisches Text wurde die vorherrschende Richtung des Textes von rechts nach links eingestellt Eine Klammer nimmt die Richtung der vorherrschenden Sprache an, wenn sie zwischen einem Text von rechts nach links und von links nach rechts ist. Wenn Sie in Ihrem Beispiel den Text ändern würden, um ein Wort nach den Klammern zu haben, würde das Problem verschwinden. Ich würde vorschlagen, dass Sie es mit zusätzlichen Worten testen, um die Lösung zu verstehen.

Dies ist umständlich und für Ihren Produktionscode würde ich eine andere Lösung vorschlagen. Angenommen, Sie wissen, dass die Klammern nur in Ihren Sprachen von links nach rechts vorkommen, müssen Sie die Klammer mit einem Unicode-Steuerzeichen beenden. & # X200; (Versuchen Sie dies manuell zu Ihrem Test hinzuzufügen).Also meine Lösung ist in diesem Fall nur die Klammern ersetzen, mit Klammern und Steuerzeichen:

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) 

Offensichtlich, wenn Sie Klammern in der rechten Seite nach links Sprachen, werden Sie zum ersten Test haben, was die use_language_code der Richtung , und dann nur die Muttersprache aktualisieren, falls zutreffend (ltr in rtl und umgekehrt) ...

+1

cchristelis danke. Ich wusste, dass das Hinzufügen von Text vor/nach den Klammern das Problem gelöst hat, aber dann würde dieser Text in der Auswahlliste angezeigt werden. Was ich nicht wusste, war, dass das Hinzufügen von ** \ u200E ** die Probleme mit BiDi-Klammern löste und ** dem Benutzer in der Auswahlliste ** nicht angezeigt wurde. Die ** ** von links nach rechts (LRM) ist ein Steuerzeichen oder unsichtbares Formatierungszeichen. Auch für alle anderen Benutzer, die versuchen, dieses Problem zu lösen, scheint nur das Hinzufügen der \ u200e zu allen Klammern genauso gut zu funktionieren wie das Hinzufügen des \ u200e zu den RTL-Sprachen. Nochmals vielen Dank. – user1261774

+0

froh zu helfen :) – cchristelis

1

Ich frage mich:

auch auf die CSS die folgende Zugabe hat keine Wirkung. Haben Sie versucht, Ihre Nachrichten neu zu kompilieren?

+0

10 Ja Ich habe meine Nachrichten bereits mehrfach zusammengestellt, aber das Problem besteht weiterhin. – user1261774

0

zu lösen BiDi Klammer Problem: Sie müssen nur das LRM-Zeichen nach der letzten Klammer hinzufügen. HTML-Entität: ‎

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