2013-09-25 58 views
5

Tôi đang hiển thị một số pluralization using the blocktrans tag; đây là đoạn mã có liên quan trong tệp mẫu:Làm cách nào để giữ khoảng trắng giữa các thẻ {% blocktrans%} và {% số nhiều%} mà không gây ra lỗi msgfmt?

{% blocktrans count choice_count=choice_count %} 
    You have {{ choice_count }} choice: 
{% plural %} 
    You have {{ choice_count }} choices: 
{% endblocktrans %} 

Sau khi chạy python manage.py makemessages --all, đây là đoạn mã có liên quan trong ví dụ của tôi, ví dụ: django.po tập tin cho en:

msgid ""                   
"\n"                    
" You have %(choice_count)s choice:\n"           
msgid_plural ""                 
"\n"                    
" You have %(choice_count)s choices:\n"           
msgstr[0] "You have one choices:"            
msgstr[1] "You have %(choice_count)s choice(s):" 

Nhưng khi tôi chạy python manage.py compilemessages, đây là thông báo lỗi tôi nhận được:

$ ./manage.py compilemessages 
processing file django.po in /home/yiqing/repos/training/site/training/locale/en/LC_MESSAGES 
/home/yiqing/repos/training/site/training/locale/en/LC_MESSAGES/django.po:60: `msgid' and `msgstr[0]' entries do not both begin with '\n' 
msgfmt: found 4 fatal errors 

Tôi biết rằng đó là vì các dòng mới/khoảng trống trong file template, và tôi biết cách nhận "xung quanh" - khi tôi thay đổi đoạn mã mẫu thành, ví dụ: điều này:

{% blocktrans count choice_count=choice_count %}You have {{ choice_count }} choice:{% plural %}You have {{ choice_count }} choices:{% endblocktrans %} 

Và chạy lại makemessages, loại bỏ các fuzzy đánh dấu từ các tin nhắn và sau đó chạy lại compilemessages, nó biên dịch tốt.

Tuy nhiên, câu hỏi của tôi là cách giữ cú pháp mẫu đầu tiên và vẫn có thể biên dịch thư, vì nó cải thiện đáng kể khả năng đọc của mã trong tệp mẫu.

+0

Các bạn đã thử bằng cách sử dụng [ '{% chốn%}' tag] (https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#spaceless)? – guival

Trả lời

2

Điều đơn giản nhất bạn có thể làm là khớp với định dạng của chuỗi đầu vào của bạn. Trong ví dụ của bạn, các tập tin .po sẽ trông như thế này:

msgid "" 
"\n" 
" You have %(choice_count)s choice:\n" 
msgid_plural "" 
"\n" 
" You have %(choice_count)s choices:\n" 
msgstr[0] "\nYou have one choices:\n" 
msgstr[1] "\nYou have %(choice_count)s choice(s):\n" 

Tập tin này biên dịch mà không có lỗi, nhưng, như bạn thấy, nó là tẻ nhạt.

Theo như tôi biết, hiện tại không có giải pháp nào khác cho vấn đề này. Có vẻ như django-rosetta không có bản vá để xử lý điều chính xác này (xem https://github.com/mbi/django-rosetta/pull/34).

0

Tôi tin rằng việc sử dụng {% spaceless %} tag sẽ giải quyết được sự cố. Những gì nó làm là loại bỏ bất kỳ dấu cách nào (và dòng nhảy) giữa đầu và cuối của nó. Tôi đã thử nghiệm này chỉ mà không sử dụng số nhiều, nhưng nó sẽ làm việc.

{% spaceless %}{% blocktrans count choice_count=choice_count %} 
    You have {{ choice_count }} choice: 
{% plural %} 
    You have {{ choice_count }} choices: 
{% endblocktrans %}{% endspaceless %} 
Các vấn đề liên quan