2013-09-25 28 views
5

Renderuję niektóre pluralization using the blocktrans tag; Oto odnośny fragment w pliku szablonu:Jak zachować odstępy między znacznikami {% blocktrans%} i {% mnoga%} bez powodowania błędów msgfmt?

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

Po uruchomieniu python manage.py makemessages --all, to jest odpowiedni fragment w moim, na przykład django.po plik dla 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):" 

Ale kiedy biegnę python manage.py compilemessages, to jest komunikat o błędzie pojawia się:

$ ./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 

wiem, że to dlatego, że z nowej linii/przestrzeni w pliku szablonu, a ja wiedzieć, jak uzyskać „ok” go - kiedy zmienić fragment szablonu do, na przykład, tak:

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

i ponownie makemessages, usuń znacznik fuzzy z wiadomości, a następnie ponownie uruchom compilemessages, kompiluje się dobrze.

Jednak moje pytanie brzmi, jak zachować pierwszą składnię szablonu i nadal móc kompilować wiadomości, ponieważ znacznie poprawia czytelność kodu w plikach szablonów.

+0

Czy próbowałeś użyć znacznika ['{% spaceless%}'] (https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#spaceless)? – guival

Odpowiedz

2

Najprostszą rzeczą, jaką możesz zrobić, to dopasować format wejściowych ciągów. W przykładzie plik .po będzie wyglądać następująco:

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" 

Ten plik kompiluje bez błędów, ale, jak widać, jest to uciążliwe.

O ile mi wiadomo, nie ma obecnie innego sposobu obejścia tego problemu. Wygląda na to, że django-rosetta ma łatkę do obsługi tej właśnie rzeczy (patrz https://github.com/mbi/django-rosetta/pull/34).

0

Wierzę, że korzystanie z {% spaceless %} tag powinno rozwiązać problem. To, co robi, usuwa wszelkie spacje (i skoki linii) między początkiem i końcem. Przetestowałem to tylko bez użycia liczby mnogiej, ale powinno działać.

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