2014-05-12 13 views
8

Tôi đang chạy python2.7 với django 1.4.python/django - vấn đề ngoặc vuông bidi trong danh sách chọn html

Tôi có đoạn mã sau vào trang views.py của tôi mà trả về tên ngôn ngữ trong một danh sách lựa chọn:

mã 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 code:

{{ field }} 

chọn danh sách:

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

Vấn đề là khi trang được xem trong một ngôn ngữ rtl như tiếng Ả Rập danh sách lựa chọn được trả lại như sau với khung của văn bản lít ở các vị trí sai:

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

thế nào Tôi viết mã trong tệp view.py để hiển thị chính xác các dấu ngoặc đơn?

Tôi đã đọc một vài chủ đề và đã thử nhiều cách khác nhau để khắc phục vấn đề, nhưng tôi đã hết ý tưởng.

Một nỗ lực không hoạt động đã làm lộn xộn các tên ngôn ngữ với các ký tự điều khiển Unicode (hướng) & # 8234; & # 8236; & rlm; trong tệp view.py - & # 8234; & # 8236; & rlm; được hiển thị cho danh sách chọn trong trang. Ví dụ:

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

Cũng thêm dòng sau vào css không có tác dụng:

direction: rtl; unicode-bidi: embed 
+0

Bạn đã thử https://pypi.python.org/pypi/django-right-to-left/0.1.1 chưa? –

+0

Tôi đã không thử django-phải-qua-trái vì vấn đề vẫn sẽ xảy ra do hỗn hợp của rtl, ltr và văn bản trung tính. khung được coi là trường văn bản trung lập. – user1261774

+0

Bạn đã thử nhúng các ký tự điều khiển Unicode trực tiếp vào nguồn (trong 'LANGUAGES') chưa? Tôi nghĩ rằng việc thêm các ký tự điều khiển đó vào views.py không có ý nghĩa vì bạn không biết liệu đó có phải là ngôn ngữ RTL hoặc LTR trước thời hạn hay không. – user193130

Trả lời

3

Trong ví dụ văn bản arabic, hướng hiện tại của văn bản đã được đặt sang phải sang trái. Dấu ngoặc theo hướng ngôn ngữ thịnh hành nếu nó nằm giữa văn bản từ phải sang trái và từ trái sang phải. Vì vậy, trong ví dụ của bạn nếu bạn sẽ thay đổi văn bản để có một từ sau khi dấu ngoặc vuông vấn đề sẽ biến mất. Tôi sẽ đề nghị bạn thử nghiệm nó với các từ được thêm vào để hiểu giải pháp.

Điều này là cồng kềnh và cho mã sản xuất của bạn, tôi sẽ đề xuất một giải pháp khác. Giả sử bạn biết rằng các dấu ngoặc chỉ xảy ra trong các ngôn ngữ từ trái sang phải, bạn cần phải kết thúc khung với ký tự điều khiển unicode & # x200E; (Hãy thử thêm điều này vào thử nghiệm của bạn theo cách thủ công).Vì vậy, giải pháp của tôi trong trường hợp này chỉ là thay thế các dấu ngoặc, với dấu ngoặc và ký tự điều khiển:

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) 

Rõ ràng nếu bạn có dấu ngoặc trong ngôn ngữ từ phải sang trái, bạn sẽ phải thử nghiệm đầu tiên những gì hướng của use_language_code , và sau đó chỉ cập nhật ngôn ngữ gốc, nếu thích hợp (ltr trong rtl và ngược lại) ...

+1

cchristelis cảm ơn bạn. Tôi biết rằng việc thêm văn bản trước/sau khi dấu ngoặc vuông đã giải quyết được vấn đề, nhưng sau đó văn bản đó sẽ được hiển thị trong danh sách chọn. Điều tôi không biết là việc thêm ** \ u200E ** đã giải quyết các vấn đề về dấu ngoặc BiDi và không hiển thị ** cho người dùng trong danh sách chọn. Dấu từ trái sang phải (LRM) ** \ u200E ** là ký tự điều khiển hoặc ký tự định dạng ẩn. Ngoài ra, với bất kỳ người dùng nào khác đang cố gắng giải quyết vấn đề này, chỉ cần thêm \ u200E vào tất cả các dấu ngoặc có vẻ hoạt động cũng như chỉ thêm \ u200E vào các ngôn ngữ rtl. Một lần nữa, cảm ơn. – user1261774

+0

vui lòng trợ giúp :) – cchristelis

1

Tôi tự hỏi nếu dữ liệu xấu của nó đối với chuyển đổi tiếng Ả Rập của bạn. Bạn đã thử biên dịch lại tin nhắn của mình chưa?

django-admin.py compilemessages 
+0

Có, tôi đã biên soạn các tin nhắn của tôi nhiều lần, nhưng vấn đề vẫn tồn tại. – user1261774

0

để giải quyết vấn đề khung BiDi: Bạn chỉ cần thêm ký tự LRM sau dấu ngoặc cuối cùng. Đối tượng HTML: ‎

<html dir="rtl"> 
<body> 
<p>hello (world)&#x200E;</p> 
</body></html> 
Các vấn đề liên quan