2014-05-12 8 views
8

Sto eseguendo python2.7 con django 1.4.problema di parentesi python/django - bidi in html select list

ho il seguente codice nella mia pagina views.py che restituisce i nomi delle lingue in un elenco di selezione:

codice 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 

codice HTML:

{{ field }} 

selezionare lista:

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

Il problema è quando la pagina viene visualizzata in una lingua RTL come l'arabo la lista di selezione è reso come segue, con le staffe del testo ltr nelle posizioni sbagliate:

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

Come fare Scrivo il codice nel file view.py per visualizzare correttamente le parentesi bidi?

Ho letto un bel po 'di thread e ho provato molti modi diversi per risolvere il problema, ma ho esaurito le idee.

Un tentativo che non ha funzionato è stato il bookending dei nomi di lingua con i caratteri di controllo (direzionale) Unicode & # 8234; & # 8236; & rlm; nel file view.py - & # 8234; & # 8236; & rlm; viene visualizzato nell'elenco di selezione nella pagina. Per esempio:

& # 8234; إسبانية أمريكا) اللاتينية)/Português (Brasil) & # 8236; & rlm;

aggiungendo inoltre quanto segue alla css non ha alcun effetto:

direction: rtl; unicode-bidi: embed 
+0

Hai provato https://pypi.python.org/pypi/django-right-to-left/0.1.1? –

+0

Non ho provato django-right-left-left perché il problema si verificava ancora a causa della combinazione di rtl, ltr e testo neutro. la parentesi è considerata un campo di testo neutro. – user1261774

+0

Hai provato a incorporare i caratteri di controllo Unicode direttamente nella sorgente (in 'LANGUAGES')? Penserei che aggiungere quei caratteri di controllo a views.py non ha senso dato che non sai se sarà un linguaggio RTL o LTR prima del tempo. – user193130

risposta

3

Nell'esempio di testo arabo, la direzione prevalente del testo è stata impostata da destra a sinistra. Una parentesi assume la direzione della lingua prevalente se si trova tra il testo da destra a sinistra e da sinistra a destra. Quindi nel tuo esempio se cambieresti il ​​testo per avere una parola dopo le parentesi il problema andrebbe via. Ti suggerirei di testarlo con parole aggiunte per comprendere la soluzione.

Questo è ingombrante e per il vostro codice di produzione suggerirei un'altra soluzione. Supponendo che tu sappia che le parentesi si verificano solo nelle lingue da sinistra a destra, devi terminare la parentesi con un carattere di controllo Unicode & # x200E; (Prova ad aggiungere questo al tuo test manualmente).Così la mia soluzione in questo caso è solo sostituire le staffe, con staffe e caratteri di controllo:

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) 

Ovviamente se avete parentesi nelle vostre lingue da destra a sinistra, dovrete prima prova quale direzione del use_language_code , e quindi aggiornare solo la lingua nativa, se appropriato (ltr in rtl e viceversa) ...

+1

cchristelis grazie. Sapevo che aggiungere del testo prima/dopo le parentesi risolveva il problema, ma quel testo sarebbe stato visualizzato nell'elenco di selezione. Quello che non sapevo era che l'aggiunta di ** \ u200E ** risolveva i problemi delle parentesi BiDi ed è ** non ** visualizzata all'utente nell'elenco di selezione. Il segno ** \ u00E ** da sinistra a destra (LRM) è un carattere di controllo o un carattere di formattazione invisibile. Inoltre, per tutti gli altri utenti che cercano di risolvere questo problema, l'aggiunta di \ u200E a tutte le parentesi sembra funzionare altrettanto bene come solo aggiungere il \ u200E alle lingue rtl. Ancora grazie. – user1261774

+0

felice di aiutare :) – cchristelis

1

Mi chiedo se le sue cattive dati per la vostra conversione arabo. Hai provato a ricompilare i tuoi messaggi?

django-admin.py compilemessages 
+0

Sì, ho già compilato i miei messaggi più volte, ma il problema persiste. – user1261774

0

per risolvere il problema della parentesi BiDi: è sufficiente aggiungere il carattere LRM dopo l'ultima parentesi. entità HTML: ‎

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