Merge remote-tracking branch 'mbi/develop' into reflang

Conflicts:
	rosetta/conf/settings.py
	rosetta/tests/__init__.py
	rosetta/urls.py
	rosetta/views.py
This commit is contained in:
Virgil Dupras 2014-08-07 11:01:34 -04:00
commit 90432b0eeb
54 changed files with 1979 additions and 3565 deletions

2
.gitignore vendored
View file

@ -13,4 +13,4 @@ testproject/htmlcov/
testproject/rosetta.db
testproject/src/
testproject/.coverage
venv_*
.venv_*

33
CHANGES
View file

@ -1,3 +1,34 @@
Version 0.7.5
-------------
* Fixed external JavaScript import to be url scheme independent (PR #101, thanks @tsouvarev)
* Fixed a test
* Added support for excluding certain locale paths from the list of PO catalogs (PR #102, thanks @elpaso)
* Added support for translator groups (PR #103, thanks @barklund)
* Removed Microsoft Translator as a shipped lib, relying on an external version instead
* Improved the app loading mechanism to cope with Django 1.7's new AppConfig (thanks @artscoop)
Version 0.7.4
-------------
* New ROSETTA_POFILENAMES setting. (PR #44, thanks @wrboyce)
* Updated Czech translation (#97, #99 thanks @cuchac)
* Fixed gettext standard compliance of all shipped translations
* No longer ship polib, rely on the Cheeseshop instead
Version 0.7.3
-------------
* Fix for test settings leaking onto global settings: LANGUAGES was overridden and not set back (Issue #81 - Thanks @zsoldosp)
* Test against Django 1.6.1
* Missing context variable in catalog list (Issue #87 - Thanks @kunitoki)
* Added support for Yandex translation API (Issue #89 - Thanks @BlackWizard) See supported languages and limitations here: https://github.com/mbi/django-rosetta/pull/89
* Added support for the Azure translation API, replacing the BING API. (Issue #86, thanks @davidkuchar and @maikelwever)
* Removed support for the signed_cookies SESSION_ENGINE + SessionRosettaStorage in Django 1.6, because serialization of POFiles would fail
* Simplified the group membership test (Issue #90 - Thanks @dotsbb)
* Better serving of admin static files. (Issue #61, thanks @tback)
* Dropped Django 1.3 support
Version 0.7.2
-------------
* Fix for when settings imports unicode_literals for some reason (Issue #67)
@ -5,6 +36,8 @@ Version 0.7.2
* Added Farsi translation. Thanks, @amiraliakbari
* Improved the permission system, allowing for more advanced permission mechanisms. Thanks, @codeinthehole and @tangentlabs
* Fixed the ordering of apps in the language selection screen. (Issue #73, thanks @tsouvarev, @kanu and everyone else involved in tracking this one down)
* Support for complex locale names. (Issue #71, Thanks @strycore)
* Configurable cache name (Issue #75, Thanks @Karmak23)
Version 0.7.1
-------------

View file

@ -4,6 +4,9 @@ exclude *.pyc
exclude *.sh
recursive-include rosetta/locale *
recursive-include rosetta/tests *
recursive-include rosetta/utils *
recursive-include rosetta/templates *
prune testproject
prune rosetta/tests/__pycache__
prune rosetta/utils/__pycache__
prune rosetta/utils/microsofttranslator/__pycache__

View file

@ -4,13 +4,13 @@ Rosetta
Rosetta is a `Django <http://www.djangoproject.com/>`_ application that eases the translation process of your Django projects.
Because it doesn't export any models, Rosetta doesn't create any tables in your project's database. Rosetta can be installed and uninstalled by simply adding and removing a single entry in your project's `INSTALLED_APPS` and a single line in your main ``urls.py`` file.
Because it doesn't export any models, Rosetta doesn't create any tables in your project's database. Rosetta can be installed and uninstalled by simply adding and removing a single entry in your project's `INSTALLED_APPS` and a single line in your main ``urls.py`` file.
********
Features
********
* Database independent
* Database independent
* Reads and writes your project's `gettext` catalogs (po and mo files)
* Installed and uninstalled in under a minute
* Uses Django's admin interface CSS
@ -20,7 +20,7 @@ Features
Requirements
************
Rosetta requires Django 1.3, 1.4 or 1.5. When running with Django 1.5, Python 3.x is supported.
Rosetta requires Django 1.4 or newer. When running with Django 1.5, Python 3.x is supported.
************
Installation
@ -34,7 +34,7 @@ To install Rosetta:
3. Add an URL entry to your project's ``urls.py``, for example::
from django.conf import settings
if 'rosetta' in settings.INSTALLED_APPS:
urlpatterns += patterns('',
url(r'^rosetta/', include('rosetta.urls')),
@ -54,7 +54,8 @@ Rosetta can be configured via the following parameters, to be defined in your pr
* ``ROSETTA_MESSAGES_PER_PAGE``: Number of messages to display per page. Defaults to ``10``.
* ``ROSETTA_ENABLE_TRANSLATION_SUGGESTIONS``: Enable AJAX translation suggestions. Defaults to ``False``.
* ``BING_APP_ID``: Translation suggestions used to come from the Google Translation API service, but free service has been discontinued, and the next best thing is Microsoft `Bing's Translation API <http://msdn.microsoft.com/en-us/library/ff512404.aspx>`_. To use this service you must first `obtain an AppID key <https://ssl.bing.com/webmaster/Developers/AppIds/>`_, then specify the key here. Defaults to ``None``.
* ``YANDEX_TRANSLATE_KEY``: Translation suggestions from Yandex `Yandex.Translate API <http://api.yandex.com/translate/>`_. To use this service you must first `obtain an AppID key <http://api.yandex.com/key/form.xml?service=trnsl>`_, then specify the key here. Defaults to ``None``.
* ``AZURE_CLIENT_ID`` and ``AZURE_CLIENT_SECRET``: Translation suggestions using the Microsoft Azure API. To use this service, you must first `register for the service <https://datamarket.azure.com/dataset/5BA839F1-12CE-4CCE-BF57-A49D98D29A44>`_, then specify the 'Customer ID' and 'Primary Account Key' respectively, which you can find on your `account information page on Azure Marketplace <https://datamarket.azure.com/account?lang=en>`_.
* ``ROSETTA_MESSAGES_SOURCE_LANGUAGE_CODE`` and ``ROSETTA_MESSAGES_SOURCE_LANGUAGE_NAME``: Change these if the source language in your PO files isn't English. Default to ``'en'`` and ``'English'`` respectively.
* ``ROSETTA_WSGI_AUTO_RELOAD`` and ``ROSETTA_UWSGI_AUTO_RELOAD``: When running WSGI daemon mode, using ``mod_wsgi`` 2.0c5 or later, this setting controls whether the contents of the gettext catalog files should be automatically reloaded by the WSGI processes each time they are modified. For performance reasons, this setting should be disabled in production environments. Default to ``False``.
* ``ROSETTA_EXCLUDED_APPLICATIONS``: Exclude applications defined in this list from being translated. Defaults to ``()``.
@ -63,19 +64,25 @@ Rosetta can be configured via the following parameters, to be defined in your pr
* ``ROSETTA_STORAGE_CLASS``: See the note below on Storages. Defaults to ``rosetta.storage.CacheRosettaStorage``
* ``ROSETTA_ENABLE_REFLANG``: See the note below on Reference Language. Defaults to ``False``.
* ``ROSETTA_ACCESS_CONTROL_FUNCTION``: An alternative function that determines if a given user can access the translation views. This function receives a ``user`` as its argument, and returns a boolean specifying whether the passed user is allowed to use Rosetta or not.
* ``ROSETTA_LANGUAGE_GROUPS``: Set to ``True`` to enable language-specific groups, which can be used to give different translators access to different languages. Instead of creating a global ``translators`` group, create individual per-language groups, e.g. ``translators-de``, ``translators-fr``, and assign users to these.
* ``ROSETTA_CACHE_NAME``: When using ``rosetta.storage.CacheRosettaStorage``, you can store the rosetta data in a specific cache. This is particularly useful when your ``default`` cache is a ``django.core.cache.backends.dummy.DummyCache`` (which happens on pre-production environments). If unset, it will default to ``rosetta`` if a cache with this name exists, or ``default`` if not.
* ``ROSETTA_POFILENAMES``: Defines which po filenames are exposed in the web interface. Defaults to ``('django.po', 'djangojs.po')``
* ``ROSETTA_EXCLUDE_PATHS``: Exclude paths defined in this list from being searched (usually ends with "locale"). Defaults to ``()``
********
Storages
********
To prevent re-reading and parsing the PO file catalogs over and over again, Rosetta stores them in a volatile location. This can be either the HTTP session or the Django cache.
To prevent re-reading and parsing the PO file catalogs over and over again, Rosetta stores them in a volatile location. This can be either the HTTP session or the Django cache.
Django 1.4 has introduced a signed cookie session backend, which stores the whole content of the session in an encrypted cookie. Unfortunately this doesn't work with large PO files, as the limit of 4096 chars that can be stored in a cookie are easily exceeded.
Django 1.4 has introduced a signed cookie session backend, which stores the whole content of the session in an encrypted cookie. Unfortunately this doesn't work with large PO files, as the limit of 4096 chars that can be stored in a cookie are easily exceeded.
In this case the Cache-based backend should be used (by setting ``ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage'``). Please make sure that a proper CACHES backend is configured in your Django settings.
In this case the Cache-based backend should be used (by setting ``ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage'``). Please make sure that a proper ``CACHES`` backend is configured in your Django settings if your Django app is being served in a multi-process environment, or the different server processes, serving subsequent requests, won't find the storage data left by previous requests.
Alternatively you can switch back to using the Session based storage by setting ``ROSETTA_STORAGE_CLASS = 'rosetta.storage.SessionRosettaStorage`` in your settings. This is perfectly safe on Django 1.3. On Django 1.4 or higher make sure you have DON'T use the `signed_cookies <https://docs.djangoproject.com/en/dev/topics/http/sessions/#using-cookie-based-sessions>`_ ``SESSION_BACKEND`` with this Rosetta storage backend or funky things might happen.
**TL;DR**: if you run Django with gunincorn, mod-wsgi or other multi-process environment, the Django-default ``CACHES`` ``LocMemCache`` backend won't suffice: use memcache instead, or you will run into issues.
********
Security
********
@ -83,7 +90,7 @@ Security
Because Rosetta requires write access to some of the files in your Django project, access to the application is restricted to the administrator user only (as defined in your project's Admin interface)
If you wish to grant editing access to other users:
1. Create a 'translators' group in your admin interface
2. Add the user you wish to grant translating rights to this group
@ -144,3 +151,6 @@ Acknowledgments
* Rosetta uses the excellent `polib <https://bitbucket.org/izi/polib>`_ library to parse and handle gettext files.
.. image:: https://d2weczhvl823v0.cloudfront.net/mbi/django-rosetta/trend.png
:alt: Bitdeli badge
:target: https://bitdeli.com/free

View file

@ -1,4 +1,4 @@
VERSION = (0, 7, 2)
VERSION = (0, 7, 5)
def get_version(svn=False, limit=3):

View file

@ -1,4 +1,6 @@
from django.conf import settings
from rosetta.conf import settings as rosetta_settings
from django.utils import importlib
@ -28,9 +30,15 @@ def is_superuser_staff_or_in_translators_group(user):
elif user.is_superuser and user.is_staff:
return True
else:
try:
from django.contrib.auth.models import Group
translators = Group.objects.get(name='translators')
return translators in user.groups.all()
except Group.DoesNotExist:
return False
return user.groups.filter(name='translators').exists()
def can_translate_language(user, langid):
if not rosetta_settings.ROSETTA_LANGUAGE_GROUPS:
return can_translate(user)
elif not user.is_authenticated():
return False
elif user.is_superuser and user.is_staff:
return True
else:
return user.groups.filter(name='translators-%s' % langid).exists()

View file

@ -6,8 +6,14 @@ MESSAGES_PER_PAGE = getattr(settings, 'ROSETTA_MESSAGES_PER_PAGE', 10)
# Enable Google translation suggestions
ENABLE_TRANSLATION_SUGGESTIONS = getattr(settings, 'ROSETTA_ENABLE_TRANSLATION_SUGGESTIONS', False)
# Can be obtained for free here: https://translate.yandex.com/apikeys
YANDEX_TRANSLATE_KEY = getattr(settings, 'YANDEX_TRANSLATE_KEY', None)
# Can be obtained for free here: https://ssl.bing.com/webmaster/Developers/AppIds/
BING_APP_ID = getattr(settings, 'BING_APP_ID', None)
AZURE_CLIENT_ID = getattr(settings, 'AZURE_CLIENT_ID', None)
AZURE_CLIENT_SECRET = getattr(settings, 'AZURE_CLIENT_SECRET', None)
# Displays this language beside the original MSGID in the admin
MAIN_LANGUAGE = getattr(settings, 'ROSETTA_MAIN_LANGUAGE', None)
@ -56,3 +62,23 @@ POFILE_WRAP_WIDTH = getattr(settings, 'ROSETTA_POFILE_WRAP_WIDTH', 78)
STORAGE_CLASS = getattr(settings, 'ROSETTA_STORAGE_CLASS', 'rosetta.storage.CacheRosettaStorage')
ENABLE_REFLANG = getattr(settings, 'ROSETTA_ENABLE_REFLANG', False)
# Allow overriding of the default filenames, you mostly won't need to change this
POFILENAMES = getattr(settings, 'ROSETTA_POFILENAMES', ('django.po', 'djangojs.po'))
ROSETTA_CACHE_NAME = getattr(settings, 'ROSETTA_CACHE_NAME', 'default'
if settings.CACHES.get('rosetta', None) is None
else 'rosetta')
# Require users to be authenticated (and Superusers or in group "translators").
# Set this to False at your own risk
ROSETTA_REQUIRES_AUTH = getattr(settings, 'ROSETTA_REQUIRES_AUTH', True)
# Exclude paths defined in this list from being searched (usually ends with "locale")
ROSETTA_EXCLUDED_PATHS = getattr(settings, 'ROSETTA_EXCLUDED_PATHS', ())
# Set to True to enable language-specific groups, which can be used to give
# different translators access to different languages. Instead of creating a
# 'translators` group, create individual per-language groups, e.g.
# 'translators-de', 'translators-fr', ...
ROSETTA_LANGUAGE_GROUPS = getattr(settings, 'ROSETTA_LANGUAGE_GROUPS', False)

View file

@ -7,56 +7,83 @@ msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-07-04 13:42+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2008-09-12 12:16\n"
"Last-Translator: <tomasz@napierala.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language-Team: cs <LL@li.org>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Translated-Using: django-rosetta 0.4.RC2\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Výběr jazyka"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:18
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Domů"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr "Filtr"
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr "Projekt"
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr "Třetích stran"
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr "Vše"
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr "Aplikace"
#: templates/rosetta/languages.html:18
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "Hotovo"
#: templates/rosetta/languages.html:19
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Textů"
#: templates/rosetta/languages.html:20
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "Přeloženo"
#: templates/rosetta/languages.html:21 templates/rosetta/pofile.html:57
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr ""
msgstr "Nepřesné"
#: templates/rosetta/languages.html:22
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Zastaralé"
#: templates/rosetta/languages.html:23
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "Soubor"
#: templates/rosetta/languages.html:44
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr "Nic k překladu!"
#: templates/rosetta/languages.html:45
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
@ -65,111 +92,110 @@ msgstr ""
"spuštěn proces překladu katalogů."
# python-format
#: templates/rosetta/languages.html:46
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
"a> for a guide on how to set up internationalization for your project."
msgstr ""
"Podívejte se prosím do <a href=\"%(i18n_doc_link)s\">Django dokumentace "
"I18N </a>, kde naleznete podklady pro nastavení Vašeho vícejazyčného projektu."
"Podívejte se prosím do <a href=\"%(i18n_doc_link)s\">Django dokumentace I18N "
"</a>, kde naleznete podklady pro nastavení Vašeho vícejazyčného projektu."
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Vybrat jiný soubor"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Stáhnout tento katalog"
#: templates/rosetta/pofile.html:21
msgid "Progress: %(percent_translated)s%"
#: templates/rosetta/pofile.html:25
#, fuzzy, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "Hotovo: %(percent_translated)s %"
#: templates/rosetta/pofile.html:23
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr "Soubor je pouze pro čtení: pro dokončení úprav si soubor stáhněte!"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
msgstr "Některé z Vámi přeložených textových položek nebyly uloženy: důvodem je"
", že Váš kolega Vám provedl pod rukami nějaké úpravy :-)."
msgstr ""
"Některé z Vámi přeložených textových položek nebyly uloženy: důvodem je, že "
"Váš kolega Vám provedl pod rukami nějaké úpravy :-)."
#: templates/rosetta/pofile.html:28
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Překlad do %(rosetta_i18n_lang_name)s "
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Zobrazit:"
#: templates/rosetta/pofile.html:32
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Pouze nepřeložené"
#: templates/rosetta/pofile.html:33
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Pouze přeložené"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr "Pouze Fuzzy"
msgstr "Pouze nepřesné"
#: templates/rosetta/pofile.html:35
msgid "All"
msgstr "Vše"
#: templates/rosetta/pofile.html:42
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Hledat"
#: templates/rosetta/pofile.html:44
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Hledat"
#: templates/rosetta/pofile.html:54
msgid "Original"
msgstr ""
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr "Originál"
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "Výskyt(y)"
#: templates/rosetta/pofile.html:82
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr "Nápověda"
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr "navrhnout"
#: templates/rosetta/pofile.html:93
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] "%(more_count)s více"
msgstr[1] "%(more_count)s více"
msgstr[0] "další %(more_count)s"
msgstr[1] "další %(more_count)s"
msgstr[2] "dalších %(more_count)s"
#: templates/rosetta/pofile.html:105
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Uložit a přeložit další část"
#: templates/rosetta/pofile.html:109
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Přejít na stránku:"
#: templates/rosetta/pofile.html:122
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Zobrazeno:"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"
msgstr[0] "%(hits)s/%(message_number)s text"
msgstr[1] "%(hits)s/%(message_number)s textů"
#~ msgid "English"
#~ msgstr "Anglicky"
#~ msgid "Both"
#~ msgstr "Oba"
msgstr[1] "%(hits)s/%(message_number)s texty"
msgstr[2] "%(hits)s/%(message_number)s textů"

View file

@ -7,10 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-07-04 13:42+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2008-06-16 10:11+0100\n"
"Last-Translator: Martin Mahner <martin@mahner.org>\n"
"Language-Team: patrick lauber <patrick.lauber@divio.ch>\n"
"Language-Team: de patrick lauber <patrick.lauber@divio.ch>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -18,47 +19,71 @@ msgstr ""
"X-Poedit-Language: German\n"
"X-Poedit-Country: SWITZERLAND\n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Sprachwahl"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:18
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Home"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr ""
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr ""
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr ""
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr "Alle"
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr ""
#: templates/rosetta/languages.html:18
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "Fortschritt"
#: templates/rosetta/languages.html:19
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Texte"
#: templates/rosetta/languages.html:20
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "Übersetzt"
#: templates/rosetta/languages.html:21 templates/rosetta/pofile.html:57
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr "Unscharf"
#: templates/rosetta/languages.html:22
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Veraltet"
#: templates/rosetta/languages.html:23
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "Datei"
#: templates/rosetta/languages.html:44
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr "Nichts zu übersetzen!"
#: templates/rosetta/languages.html:45
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
@ -67,7 +92,7 @@ msgstr ""
"noch keine Übersetzungskataloge generiert."
# python-format
#: templates/rosetta/languages.html:46
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
@ -77,95 +102,97 @@ msgstr ""
"Sie eine Anleitung, wie sie Internationalisierung in Ihrem Projekt "
"einrichten."
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Wähle eine andere Datei"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Laden sie diesen Katalog herunter"
#: templates/rosetta/pofile.html:21
msgid "Progress: %(percent_translated)s%"
#: templates/rosetta/pofile.html:25
#, fuzzy, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "Fortschritt: %(percent_translated)s%"
#: templates/rosetta/pofile.html:23
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr ""
"Datei ist schreibgeschützt: Laden Sie die Datei herunter wenn sie mit dem "
"Editieren fertig sind!"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
msgstr ""
#: templates/rosetta/pofile.html:28
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Übersetze in %(rosetta_i18n_lang_name)s"
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Anzeige:"
#: templates/rosetta/pofile.html:32
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Nur unübersetzte"
#: templates/rosetta/pofile.html:33
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Nur übersetzte"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr "Nur unscharfe"
#: templates/rosetta/pofile.html:35
msgid "All"
msgstr "Alle"
#: templates/rosetta/pofile.html:42
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Suchen"
#: templates/rosetta/pofile.html:44
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Los"
#: templates/rosetta/pofile.html:54
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr "Original"
#: templates/rosetta/pofile.html:58
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "Gefunden in"
#: templates/rosetta/pofile.html:82
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr ""
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr "vorschlagen"
#: templates/rosetta/pofile.html:93
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] "%(more_count)s mehr"
msgstr[1] "%(more_count)s mehr"
#: templates/rosetta/pofile.html:105
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Speichern und nächsten Block übersetzen"
#: templates/rosetta/pofile.html:109
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Zur Seite:"
#: templates/rosetta/pofile.html:122
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Anzeigen:"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"

View file

@ -5,58 +5,85 @@
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: Django Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-07-04 13:42+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2008-11-30 12:12\n"
"Last-Translator: <antonio.mele@django.es>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language-Team: es <LL@li.org>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Translated-Using: django-rosetta 0.4.RC2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Selección de idioma"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:18
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Inicio"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr ""
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr ""
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr ""
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr ""
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr ""
#: templates/rosetta/languages.html:18
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "Progreso"
#: templates/rosetta/languages.html:19
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Mensajes"
#: templates/rosetta/languages.html:20
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "Traducido"
#: templates/rosetta/languages.html:21 templates/rosetta/pofile.html:57
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr "Revisar"
#: templates/rosetta/languages.html:22
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Obsoleto"
#: templates/rosetta/languages.html:23
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "Archivo"
#: templates/rosetta/languages.html:44
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr "¡Nada que traducir!"
#: templates/rosetta/languages.html:45
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
@ -64,7 +91,7 @@ msgstr ""
"No has especificado ningún idioma en tu archivo de settings o no has "
"generado todavía un batch para traducción de catálogos."
#: templates/rosetta/languages.html:46
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
@ -74,95 +101,97 @@ msgstr ""
"sobre I18N</a> para obtener una guía sobre cómo añadir internacionalización "
"a tu proyecto."
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Selecciona otro archivo"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Descarga este catálogo"
#: templates/rosetta/pofile.html:21
msgid "Progress: %(percent_translated)s%"
#: templates/rosetta/pofile.html:25
#, fuzzy, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "Progreso: %(percent_translated)s%"
#: templates/rosetta/pofile.html:23
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr ""
"El archivo está en modo lectura: ¡Descarga el archivo cuando termines de "
"editarlo!"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
msgstr ""
#: templates/rosetta/pofile.html:28
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Traducir al %(rosetta_i18n_lang_name)s "
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Pantalla:"
#: templates/rosetta/pofile.html:32
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Sin traducir sólo"
#: templates/rosetta/pofile.html:33
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Traducidos sólo"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr "Vellosos sólo"
#: templates/rosetta/pofile.html:35
msgid "All"
msgstr ""
#: templates/rosetta/pofile.html:42
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Búsqueda"
#: templates/rosetta/pofile.html:44
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Ir"
#: templates/rosetta/pofile.html:54
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr ""
#: templates/rosetta/pofile.html:58
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "Ocurrencia(s)"
#: templates/rosetta/pofile.html:82
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr ""
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr "sugerir"
#: templates/rosetta/pofile.html:93
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] "%(more_count)s más"
msgstr[1] "%(more_count)s más"
#: templates/rosetta/pofile.html:105
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Guardar y traducir siguiente bloque"
#: templates/rosetta/pofile.html:109
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Ir a la página:"
#: templates/rosetta/pofile.html:122
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Mostrando:"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"

View file

@ -2,20 +2,19 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: Django Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-04-01 18:36+0430\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2013-04-01 19:03+0430\n"
"Last-Translator: <admin@arsh.co>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language-Team: fa <LL@li.org>\n"
"Language: fa\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=1; plural=0\n"
"X-Translated-Using: django-rosetta 0.7.1\n"
@ -30,14 +29,14 @@ msgstr "خانه"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or "
"higher.<br/>Setting ROSETTA_STORAGE_CLASS = "
"'rosetta.storage.CacheRosettaStorage' in your settings file should fix this."
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
"بارگزاری کاتالوگ زبان مورد نظر ممکن نبود. این مشکل معمولا به خاطر استفاده از"
" Encrypted Cookies Session Storage backend در جنگو ۱.۴ یا بالاتر رخ "
"می‌دهد.<br/>با افزودن خط زیر به فایل تنظیمات پروژه معمولا این مشکل را حل "
"می‌کند:<br/>ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage'"
"بارگزاری کاتالوگ زبان مورد نظر ممکن نبود. این مشکل معمولا به خاطر استفاده از "
"Encrypted Cookies Session Storage backend در جنگو ۱.۴ یا بالاتر رخ می‌دهد.<br/"
">با افزودن خط زیر به فایل تنظیمات پروژه معمولا این مشکل را حل می‌کند:<br/"
">ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage'"
#: templates/rosetta/languages.html:15
msgid "Filter"
@ -71,7 +70,7 @@ msgstr "پیام‌ها"
msgid "Translated"
msgstr "ترجمه شده"
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:71
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr "نیاز به بازبینی"
@ -92,19 +91,18 @@ msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
msgstr ""
"شما زبانی را در فایل تنظیمات تعیین نکردید، یا هنوز کاتالوگ‌های ترجمه را "
"ایجاد نکردید."
"شما زبانی را در فایل تنظیمات تعیین نکردید، یا هنوز کاتالوگ‌های ترجمه را ایجاد "
"نکردید."
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N "
"documentation</a> for a guide on how to set up internationalization for your"
" project."
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
"a> for a guide on how to set up internationalization for your project."
msgstr ""
"لطفا به <a href=\"%(i18n_doc_link)s\">مستندات جهانی‌سازی جنگو "
"documentation</a> برای راهنما در مورد روش راه‌اندازی امکانات جهانی‌سازی برای"
" پروژه‌تان مراجعه کنید."
"لطفا به <a href=\"%(i18n_doc_link)s\">مستندات جهانی‌سازی جنگو documentation</"
"a> برای راهنما در مورد روش راه‌اندازی امکانات جهانی‌سازی برای پروژه‌تان مراجعه "
"کنید."
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
@ -162,45 +160,45 @@ msgstr "جستجو"
msgid "Go"
msgstr "برو"
#: templates/rosetta/pofile.html:68
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr "اصلی"
#: templates/rosetta/pofile.html:72
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "موارد رخداد"
#: templates/rosetta/pofile.html:86 templates/rosetta/pofile.html.py:89
#: templates/rosetta/pofile.html:104 templates/rosetta/pofile.html.py:107
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr "راهنمای محلی"
#: templates/rosetta/pofile.html:114
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr "پیشنهاد"
#: templates/rosetta/pofile.html:125
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] "%(more_count)s مورد بیش‌تر"
msgstr[1] "%(more_count)s مورد بیش‌تر"
#: templates/rosetta/pofile.html:137
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "ذخیره و ترجمه‌ی دسته‌ی بعدی"
#: templates/rosetta/pofile.html:141
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "پرش به صفحه:"
#: templates/rosetta/pofile.html:154
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "در حال نمایش:"
#: templates/rosetta/pofile.html:158
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"
msgstr[0] "%(hits)s از %(message_number)s پیام"
msgstr[1] "%(hits)s از %(message_number)s پیام"

View file

@ -2,77 +2,88 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#
msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-04-05 15:09+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2008-09-22 11:02\n"
"Last-Translator: Admin Admin <admin@admin.com>\n"
"Language-Team: French <LL@li.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Translated-Using: django-rosetta 0.6.7\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Sélection de la langue"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:21
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Accueil"
#: templates/rosetta/languages.html:11
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr "Filtrer"
#: templates/rosetta/languages.html:12
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr "Projet"
#: templates/rosetta/languages.html:13
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr "Tiers"
#: templates/rosetta/languages.html:15 templates/rosetta/pofile.html:38
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr "Tous"
#: templates/rosetta/languages.html:28
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr "Application"
#: templates/rosetta/languages.html:29
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "Progression"
#: templates/rosetta/languages.html:30
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Messages"
#: templates/rosetta/languages.html:31
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "Traduits"
#: templates/rosetta/languages.html:32 templates/rosetta/pofile.html:70
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr "Flous"
#: templates/rosetta/languages.html:33
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Obsolètes"
#: templates/rosetta/languages.html:34
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "Fichier"
#: templates/rosetta/languages.html:57
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr "Rien à Traduire!"
#: templates/rosetta/languages.html:58
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
@ -82,110 +93,109 @@ msgstr ""
"projet."
# python-format
#: templates/rosetta/languages.html:59
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N "
"documentation</a> for a guide on how to set up internationalization for your"
" project."
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
"a> for a guide on how to set up internationalization for your project."
msgstr ""
"Veuillez vous référer à la <a href=\"%(i18n_doc_link)s\">documentation sur "
"l'internationalisation de Django</a> pour un guide sur comment activer et "
"configurer la traduction de votre projet."
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Choisir un autre fichier"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Télécharger ce catalogue"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:25
#, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "Progression: %(percent_translated)s%%"
#: templates/rosetta/pofile.html:26
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr ""
"Fichier en seule lecture: télécharger le fichier à la fin de l'édition!"
#: templates/rosetta/pofile.html:27
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
msgstr ""
"Certains parmi vos derniers éléments n'ont pas pu être sauvés: ceci arrive "
"généralement quand le catalogue de traductions à été modifié après qu'il ait"
" été chargé."
"généralement quand le catalogue de traductions à été modifié après qu'il ait "
"été chargé."
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Traduire en %(rosetta_i18n_lang_name)s"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Afficher:"
#: templates/rosetta/pofile.html:35
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Non-traduits uniquement"
#: templates/rosetta/pofile.html:36
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Traduits uniquement"
#: templates/rosetta/pofile.html:37
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr "Flous uniquement"
#: templates/rosetta/pofile.html:45
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Recherche"
#: templates/rosetta/pofile.html:47
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Go"
#: templates/rosetta/pofile.html:67
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr "Original"
#: templates/rosetta/pofile.html:71
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "Occurrences(s)"
#: templates/rosetta/pofile.html:85 templates/rosetta/pofile.html.py:88
#: templates/rosetta/pofile.html:103 templates/rosetta/pofile.html.py:106
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr "Indice contextuel"
#: templates/rosetta/pofile.html:113
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr "suggérer"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] "%(more_count)s de plus"
msgstr[1] "%(more_count)s de plus"
#: templates/rosetta/pofile.html:136
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Sauver et traduire le prochain bloc"
#: templates/rosetta/pofile.html:140
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Passer à la page:"
#: templates/rosetta/pofile.html:153
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Affichés:"
#: templates/rosetta/pofile.html:157
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"

View file

@ -5,57 +5,82 @@ msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-07-04 13:42+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2008-10-09 19:08+0100\n"
"Last-Translator: Gergely Kontra <pihentagy@yahoo.com>\n"
"Language-Team: nomail <hu@example.org>\n"
"Language-Team: hu <hu@example.org>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Translated-Using: django-rosetta 0.4.RC2\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Nyelvválasztás"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:18
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Főoldal"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr ""
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr ""
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr ""
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr ""
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr ""
#: templates/rosetta/languages.html:18
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "Állapot"
#: templates/rosetta/languages.html:19
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Üzenet"
#: templates/rosetta/languages.html:20
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "Lefordítva"
#: templates/rosetta/languages.html:21 templates/rosetta/pofile.html:57
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr ""
#: templates/rosetta/languages.html:22
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Elavult"
#: templates/rosetta/languages.html:23
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "Fájl"
#: templates/rosetta/languages.html:44
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr "Nincs mit fordítani!"
#: templates/rosetta/languages.html:45
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
@ -63,7 +88,7 @@ msgstr ""
"Nincs beállítva egyetlen nyelv sem van nem hozott létre egy fordítási "
"katalóguskoteget."
#: templates/rosetta/languages.html:46
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
@ -72,92 +97,94 @@ msgstr ""
"Projekted többnyelvűvé alakításához lásd a <a href=\"%(i18n_doc_link)s"
"\">Django I18N dokumentációt</a>!"
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Másik fájl választása"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Katalógus letöltése"
#: templates/rosetta/pofile.html:21
msgid "Progress: %(percent_translated)s%"
#: templates/rosetta/pofile.html:25
#, fuzzy, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "%(percent_translated)s% kész"
#: templates/rosetta/pofile.html:23
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr "A fájl írásvédett: töltse le a katalógust, ha végzett!"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
msgstr ""
#: templates/rosetta/pofile.html:28
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Fordítsa %(rosetta_i18n_lang_name)s nyelvre"
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Szűrés:"
#: templates/rosetta/pofile.html:32
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Fordításra vár"
#: templates/rosetta/pofile.html:33
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Lefordított"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr ""
#: templates/rosetta/pofile.html:35
msgid "All"
msgstr ""
#: templates/rosetta/pofile.html:42
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Keresés"
#: templates/rosetta/pofile.html:44
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Keress"
#: templates/rosetta/pofile.html:54
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr ""
#: templates/rosetta/pofile.html:58
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "Előfordulások"
#: templates/rosetta/pofile.html:82
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr ""
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr "ajánl"
#: templates/rosetta/pofile.html:93
#: templates/rosetta/pofile.html:115
#, fuzzy, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] "még %(more_count)s"
#: templates/rosetta/pofile.html:105
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Mentés"
#: templates/rosetta/pofile.html:109
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Ugorj erre az oldalra:"
#: templates/rosetta/pofile.html:122
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Szűrés:"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:148
#, fuzzy, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"

View file

@ -7,54 +7,81 @@ msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-07-04 13:42+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2010-07-04 13:42+0200\n"
"Last-Translator: Marco Bonetti <mbi@mbi.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language-Team: it <mbi@mbi.com>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Selezione della lingua"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:18
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Inizio"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr "Filtro"
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr "Progetto"
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr "Altro"
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr "Tutti"
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr "Applicazione"
#: templates/rosetta/languages.html:18
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "Progressione"
#: templates/rosetta/languages.html:19
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Messaggio"
#: templates/rosetta/languages.html:20
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "Tradotto"
#: templates/rosetta/languages.html:21 templates/rosetta/pofile.html:57
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr ""
#: templates/rosetta/languages.html:22
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Obsoleto"
#: templates/rosetta/languages.html:23
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "File"
#: templates/rosetta/languages.html:44
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr "Nulla da tradurre!"
#: templates/rosetta/languages.html:45
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
@ -63,7 +90,7 @@ msgstr ""
"ancore generato un catalogo iniziale da tradurre."
# python-format
#: templates/rosetta/languages.html:46
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
@ -73,94 +100,97 @@ msgstr ""
"sull'internazionalizzazione di Django</a> per una giuda su come impostare le "
"traduzioni per il vostro progetto."
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Scegliere un altro file"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Scaricare il catalogo"
#: templates/rosetta/pofile.html:21
msgid "Progress: %(percent_translated)s%"
#: templates/rosetta/pofile.html:25
#, fuzzy, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "Progressione: %(percent_translated)s%"
#: templates/rosetta/pofile.html:23
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr "file in solo lettura: scaricare il file alla fine dell'edizione!"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
msgstr "Alcuni elementi non sono stati salvati: questo capita solitamente quando "
"il catalogo delle traduzioni è stato modificato dopo che voi l'abbiate caricato."
msgstr ""
"Alcuni elementi non sono stati salvati: questo capita solitamente quando il "
"catalogo delle traduzioni è stato modificato dopo che voi l'abbiate caricato."
#: templates/rosetta/pofile.html:28
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Tradurre verso il %(rosetta_i18n_lang_name)s"
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Mostra:"
#: templates/rosetta/pofile.html:32
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Solo non tradotti"
#: templates/rosetta/pofile.html:33
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Solo tradotti"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr "Solo fuzzy"
#: templates/rosetta/pofile.html:35
msgid "All"
msgstr "Tutti"
#: templates/rosetta/pofile.html:42
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Cercare"
#: templates/rosetta/pofile.html:44
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Via"
#: templates/rosetta/pofile.html:54
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr "Originale"
#: templates/rosetta/pofile.html:58
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "Occorrenze"
#: templates/rosetta/pofile.html:82
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr ""
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr "suggerire"
#: templates/rosetta/pofile.html:93
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] "un altro"
msgstr[1] "ancora %(more_count)s"
#: templates/rosetta/pofile.html:105
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Salvare e tradurre il prossimo blocco"
#: templates/rosetta/pofile.html:109
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Passare alla pagina:"
#: templates/rosetta/pofile.html:122
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Mostrato:"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"

View file

@ -7,56 +7,81 @@ msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-07-04 13:42+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2008-06-05 17:06+0200\n"
"Last-Translator: Joost Cassee <cassee@gmail.com>\n"
"Language-Team: Joost Cassee <cassee@gmail.com>\n"
"Language-Team: nl Joost Cassee <cassee@gmail.com>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Taalselectie"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:18
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Voorpagina"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr ""
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr ""
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr ""
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr ""
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr ""
#: templates/rosetta/languages.html:18
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "Voortgang"
#: templates/rosetta/languages.html:19
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Berichten"
#: templates/rosetta/languages.html:20
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "Vertaald"
#: templates/rosetta/languages.html:21 templates/rosetta/pofile.html:57
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr ""
#: templates/rosetta/languages.html:22
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Niet meer gebruikt"
#: templates/rosetta/languages.html:23
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "Bestand"
#: templates/rosetta/languages.html:44
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr "Niets te vertalen!"
#: templates/rosetta/languages.html:45
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
@ -65,7 +90,7 @@ msgstr ""
"catalogus gegenereerd."
# python-format
#: templates/rosetta/languages.html:46
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
@ -74,95 +99,97 @@ msgstr ""
"Zie <a href=\"%(i18n_doc_link)s\">Django's I18N documentatie</a> (Engels) "
"voor meer informatie over internationalisatie."
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Selecteer een ander bestand"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Download deze catalogus"
#: templates/rosetta/pofile.html:21
msgid "Progress: %(percent_translated)s%"
#: templates/rosetta/pofile.html:25
#, fuzzy, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "Voortgang: %(percent_translated)s%"
#: templates/rosetta/pofile.html:23
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr ""
"Dit is bestand is alleen-lezen; download dit bestand wanneer u klaar bent "
"met bewerken!"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
msgstr ""
#: templates/rosetta/pofile.html:28
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Vertalen in het %(rosetta_i18n_lang_name)s"
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Beeld:"
#: templates/rosetta/pofile.html:32
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Alleen onvertaald"
#: templates/rosetta/pofile.html:33
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Alleen vertaald"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr ""
#: templates/rosetta/pofile.html:35
msgid "All"
msgstr ""
#: templates/rosetta/pofile.html:42
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Zoeken"
#: templates/rosetta/pofile.html:44
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Ga"
#: templates/rosetta/pofile.html:54
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr ""
#: templates/rosetta/pofile.html:58
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "Gevonden in"
#: templates/rosetta/pofile.html:82
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr ""
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr ""
#: templates/rosetta/pofile.html:93
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] ""
msgstr[1] ""
#: templates/rosetta/pofile.html:105
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Opslaan en volgende blok vertalen"
#: templates/rosetta/pofile.html:109
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Snel naar pagina:"
#: templates/rosetta/pofile.html:122
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Tonen:"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"

View file

@ -7,56 +7,83 @@ msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-07-04 13:42+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2008-09-12 12:16\n"
"Last-Translator: <tomasz@napierala.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language-Team: pl <LL@li.org>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Translated-Using: django-rosetta 0.4.RC2\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Wybór języka"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:18
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Początek"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr ""
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr ""
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr ""
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr ""
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr ""
#: templates/rosetta/languages.html:18
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "Postęp"
#: templates/rosetta/languages.html:19
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Komunikaty"
#: templates/rosetta/languages.html:20
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "Przetłumaczone"
#: templates/rosetta/languages.html:21 templates/rosetta/pofile.html:57
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr ""
#: templates/rosetta/languages.html:22
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Przestarzałe"
#: templates/rosetta/languages.html:23
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "Plik"
#: templates/rosetta/languages.html:44
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr "Nie ma nic do przetłumaczenia!"
#: templates/rosetta/languages.html:45
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
@ -65,7 +92,7 @@ msgstr ""
"jeszcze katalogów do tłumaczeń."
# python-format
#: templates/rosetta/languages.html:46
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
@ -75,98 +102,102 @@ msgstr ""
"Django I18N </a>, aby znaleźć dokumentację na temat internacjonalizacji "
"twojego projektu."
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Wybierz inny plik"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Pobierz ten katalog"
#: templates/rosetta/pofile.html:21
msgid "Progress: %(percent_translated)s%"
#: templates/rosetta/pofile.html:25
#, fuzzy, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "Postęp: %(percent_translated)s %"
#: templates/rosetta/pofile.html:23
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr "Plik jest tylko do odczytu: pobierz go kiedy skończysz edytować"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
msgstr ""
#: templates/rosetta/pofile.html:28
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Przetłumacz na %(rosetta_i18n_lang_name)s "
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Wyświetl:"
#: templates/rosetta/pofile.html:32
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Tylko nieprzetłumaczone"
#: templates/rosetta/pofile.html:33
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Tylko przetłumaczone"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr ""
#: templates/rosetta/pofile.html:35
msgid "All"
msgstr ""
#: templates/rosetta/pofile.html:42
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Szukaj"
#: templates/rosetta/pofile.html:44
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Idź"
#: templates/rosetta/pofile.html:54
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr ""
#: templates/rosetta/pofile.html:58
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "Wystąpienie(a)"
#: templates/rosetta/pofile.html:82
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr ""
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr "sugeruj"
#: templates/rosetta/pofile.html:93
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] "%(more_count)s więcej"
msgstr[1] "%(more_count)s więcej"
msgstr[2] "%(more_count)s więcej"
#: templates/rosetta/pofile.html:105
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Zapisz i tłumacz następny blok"
#: templates/rosetta/pofile.html:109
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Przejdź do strony:"
#: templates/rosetta/pofile.html:122
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Wyświetlanie:"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"
msgstr[0] "%(hits)s/%(message_number)s komunikat"
msgstr[1] "%(hits)s/%(message_number)s komunikatów"
msgstr[2] "%(hits)s/%(message_number)s komunikatów"
#~ msgid "English"
#~ msgstr "Angielski"

View file

@ -7,159 +7,191 @@ msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-07-04 13:42+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2010-07-04 13:42+0200\n"
"Last-Translator: Nazar Leush <nazar@pleso.net>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Выбор языка"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:18
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Начало"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr ""
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr ""
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr ""
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr ""
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr ""
#: templates/rosetta/languages.html:18
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "Обработано"
#: templates/rosetta/languages.html:19
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Сообщений"
#: templates/rosetta/languages.html:20
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "С переводом"
#: templates/rosetta/languages.html:21 templates/rosetta/pofile.html:57
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr ""
#: templates/rosetta/languages.html:22
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Устаревших"
#: templates/rosetta/languages.html:23
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "Файл"
#: templates/rosetta/languages.html:44
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr ""
#: templates/rosetta/languages.html:45
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
msgstr ""
#: templates/rosetta/languages.html:46
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
"a> for a guide on how to set up internationalization for your project."
msgstr ""
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Выбрать другой файл"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Скачать этот каталог"
#: templates/rosetta/pofile.html:21
msgid "Progress: %(percent_translated)s%"
#: templates/rosetta/pofile.html:25
#, fuzzy, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "Обработано: %(percent_translated)s%"
#: templates/rosetta/pofile.html:23
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr ""
"Файл только для чтения: загрузите файл после завершения редактирования!"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
msgstr ""
#: templates/rosetta/pofile.html:28
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Перевод на %(rosetta_i18n_lang_name)s"
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Отображать:"
#: templates/rosetta/pofile.html:32
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Только без перевода"
#: templates/rosetta/pofile.html:33
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Только с переводом"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr ""
#: templates/rosetta/pofile.html:35
msgid "All"
msgstr ""
#: templates/rosetta/pofile.html:42
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Поиск"
#: templates/rosetta/pofile.html:44
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Вперёд"
#: templates/rosetta/pofile.html:54
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr ""
#: templates/rosetta/pofile.html:58
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "Встречается в"
#: templates/rosetta/pofile.html:82
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr ""
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr ""
#: templates/rosetta/pofile.html:93
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: templates/rosetta/pofile.html:105
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Сохранить и перевести следующий блок"
#: templates/rosetta/pofile.html:109
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Перейти к странице:"
#: templates/rosetta/pofile.html:122
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Отображение:"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"
msgstr[0] "%(hits)s/%(message_number)s сообщение"
msgstr[1] "%(hits)s/%(message_number)s сообщений"
msgstr[2] "%(hits)s/%(message_number)s сообщений"
#~ msgid "English"
#~ msgstr "Английский"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-11-11 15:45+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2008-06-16 10:11+0100\n"
"Last-Translator: RECEP KIRMIZI <rkirmizi@gmail.com>\n"
"Language-Team: \n"
@ -19,47 +19,71 @@ msgstr ""
"X-Poedit-Language: \n"
"X-Poedit-Country: \n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Dil seçimi"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:18
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Ana Sayfa"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr ""
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr ""
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr ""
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr "Hepsi"
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr "Uygulama"
#: templates/rosetta/languages.html:18
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "İlerleme"
#: templates/rosetta/languages.html:19
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Mesaj"
#: templates/rosetta/languages.html:20
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "Çevrildi"
#: templates/rosetta/languages.html:21 templates/rosetta/pofile.html:57
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr "Belirsiz"
#: templates/rosetta/languages.html:22
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Kullanımda olmayan"
#: templates/rosetta/languages.html:23
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "Dosya"
#: templates/rosetta/languages.html:44
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr "Çevrilecek birşey yok!"
#: templates/rosetta/languages.html:45
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
@ -68,7 +92,7 @@ msgstr ""
"kataloglarını oluşturmadınız."
# python-format
#: templates/rosetta/languages.html:46
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
@ -77,25 +101,25 @@ msgstr ""
"Projenizdeki çoklu dilde geliştirebilmek için lütfen Django'nun <a href="
"\"%(i18n_doc_link)s\">Django'nun I18N dökümantasyonuna</a> başvurun."
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Başka bir dosya alın"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Bu kataloğu bilgisayarınıza indirin"
#: templates/rosetta/pofile.html:21
#: templates/rosetta/pofile.html:25
#, fuzzy, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "İlerleme: %(percent_translated)s%"
#: templates/rosetta/pofile.html:23
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr ""
"Dosya salt-okunur: İşlemleriniz bittikten sonra bilgisayarınıza indirin"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
@ -103,71 +127,72 @@ msgstr ""
"Çeviri bloğunuzdaki bazı öğeler kayıt edilemedi: bu genellikle üzerinde "
"çalıştığınız dosyanın sunucu tarafında değişmesi sonucundaortaya çıkar."
#: templates/rosetta/pofile.html:28
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Şuna çevir %(rosetta_i18n_lang_name)s"
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Göster:"
#: templates/rosetta/pofile.html:32
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Sadece çevirilmemiş"
#: templates/rosetta/pofile.html:33
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Sadece çevirilmiş"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr "Sadece belirsiz"
#: templates/rosetta/pofile.html:35
msgid "All"
msgstr "Hepsi"
#: templates/rosetta/pofile.html:42
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Arama"
#: templates/rosetta/pofile.html:44
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Git"
#: templates/rosetta/pofile.html:54
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr "Orijinal"
#: templates/rosetta/pofile.html:58
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr ""
#: templates/rosetta/pofile.html:82
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr ""
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr "öneri"
#: templates/rosetta/pofile.html:93
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] "%(more_count)s daha"
msgstr[1] "%(more_count)s daha"
#: templates/rosetta/pofile.html:105
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Kaydet ve sonraki bloğu çevir"
#: templates/rosetta/pofile.html:109
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Sayfaya geç:"
#: templates/rosetta/pofile.html:122
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Gösteriliyor:"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"

View file

@ -7,158 +7,190 @@ msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-07-04 13:42+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2010-07-04 13:42+0200\n"
"Last-Translator: Nazar Leush <nazar@pleso.net>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: templates/rosetta/languages.html:4 templates/rosetta/languages.html.py:6
#: templates/rosetta/languages.html:5 templates/rosetta/languages.html.py:8
msgid "Language selection"
msgstr "Вибір мови"
#: templates/rosetta/languages.html:6 templates/rosetta/pofile.html:18
#: templates/rosetta/languages.html:8 templates/rosetta/pofile.html:22
msgid "Home"
msgstr "Домівка"
#: templates/rosetta/languages.html:9
msgid ""
"Couldn't load the specified language file. This usually happens when using "
"the Encrypted Cookies Session Storage backend on Django 1.4 or higher.<br/"
">Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in "
"your settings file should fix this."
msgstr ""
#: templates/rosetta/languages.html:15
msgid "Filter"
msgstr ""
#: templates/rosetta/languages.html:16
msgid "Project"
msgstr ""
#: templates/rosetta/languages.html:17
msgid "Third party"
msgstr ""
#: templates/rosetta/languages.html:19 templates/rosetta/pofile.html:39
msgid "All"
msgstr ""
#: templates/rosetta/languages.html:32
msgid "Application"
msgstr ""
#: templates/rosetta/languages.html:18
#: templates/rosetta/languages.html:33
msgid "Progress"
msgstr "Завершено"
#: templates/rosetta/languages.html:19
#: templates/rosetta/languages.html:34
msgid "Messages"
msgstr "Повідомлень"
#: templates/rosetta/languages.html:20
#: templates/rosetta/languages.html:35
msgid "Translated"
msgstr "Перекладено"
#: templates/rosetta/languages.html:21 templates/rosetta/pofile.html:57
#: templates/rosetta/languages.html:36 templates/rosetta/pofile.html:61
msgid "Fuzzy"
msgstr ""
#: templates/rosetta/languages.html:22
#: templates/rosetta/languages.html:37
msgid "Obsolete"
msgstr "Застарілих"
#: templates/rosetta/languages.html:23
#: templates/rosetta/languages.html:38
msgid "File"
msgstr "Файл"
#: templates/rosetta/languages.html:44
#: templates/rosetta/languages.html:61
msgid "Nothing to translate!"
msgstr ""
#: templates/rosetta/languages.html:45
#: templates/rosetta/languages.html:62
msgid ""
"You haven't specified any languages in your settings file, or haven't yet "
"generated a batch of translation catalogs."
msgstr ""
#: templates/rosetta/languages.html:46
#: templates/rosetta/languages.html:63
#, python-format
msgid ""
"Please refer to <a href=\"%(i18n_doc_link)s\">Django's I18N documentation</"
"a> for a guide on how to set up internationalization for your project."
msgstr ""
#: templates/rosetta/pofile.html:8
#: templates/rosetta/pofile.html:9
msgid "Pick another file"
msgstr "Вибрати інший файл"
#: templates/rosetta/pofile.html:9
#: templates/rosetta/pofile.html:10
msgid "Download this catalog"
msgstr "Завантажити цей каталог"
#: templates/rosetta/pofile.html:21
msgid "Progress: %(percent_translated)s%"
#: templates/rosetta/pofile.html:25
#, fuzzy, python-format
msgid "Progress: %(percent_translated)s%%"
msgstr "Завершено: %(percent_translated)s%"
#: templates/rosetta/pofile.html:23
#: templates/rosetta/pofile.html:27
msgid "File is read-only: download the file when done editing!"
msgstr "Файл тільки для читання: завантажте файл після завершення редагування!"
#: templates/rosetta/pofile.html:24
#: templates/rosetta/pofile.html:28
msgid ""
"Some items in your last translation block couldn't be saved: this usually "
"happens when the catalog file changes on disk after you last loaded it."
msgstr ""
#: templates/rosetta/pofile.html:28
#: templates/rosetta/pofile.html:32
#, python-format
msgid "Translate into %(rosetta_i18n_lang_name)s"
msgstr "Переклад на %(rosetta_i18n_lang_name)s"
#: templates/rosetta/pofile.html:31
#: templates/rosetta/pofile.html:35
msgid "Display:"
msgstr "Відображати:"
#: templates/rosetta/pofile.html:32
#: templates/rosetta/pofile.html:36
msgid "Untranslated only"
msgstr "Тільки неперекладені"
#: templates/rosetta/pofile.html:33
#: templates/rosetta/pofile.html:37
msgid "Translated only"
msgstr "Тільки перекладені"
#: templates/rosetta/pofile.html:34
#: templates/rosetta/pofile.html:38
msgid "Fuzzy only"
msgstr ""
#: templates/rosetta/pofile.html:35
msgid "All"
msgstr ""
#: templates/rosetta/pofile.html:42
#: templates/rosetta/pofile.html:46
msgid "Search"
msgstr "Пошук"
#: templates/rosetta/pofile.html:44
#: templates/rosetta/pofile.html:48
msgid "Go"
msgstr "Вперед"
#: templates/rosetta/pofile.html:54
#: templates/rosetta/pofile.html:58
msgid "Original"
msgstr ""
#: templates/rosetta/pofile.html:58
#: templates/rosetta/pofile.html:62
msgid "Occurrences(s)"
msgstr "Зустрічається в"
#: templates/rosetta/pofile.html:82
#: templates/rosetta/pofile.html:76 templates/rosetta/pofile.html.py:79
#: templates/rosetta/pofile.html:94 templates/rosetta/pofile.html.py:97
msgid "Context hint"
msgstr ""
#: templates/rosetta/pofile.html:104
msgid "suggest"
msgstr ""
#: templates/rosetta/pofile.html:93
#: templates/rosetta/pofile.html:115
#, python-format
msgid "%(more_count)s more"
msgid_plural "%(more_count)s more"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: templates/rosetta/pofile.html:105
#: templates/rosetta/pofile.html:127
msgid "Save and translate next block"
msgstr "Записати і перекласти наступний блок"
#: templates/rosetta/pofile.html:109
#: templates/rosetta/pofile.html:131
msgid "Skip to page:"
msgstr "Перейти до сторінки:"
#: templates/rosetta/pofile.html:122
#: templates/rosetta/pofile.html:144
msgid "Displaying:"
msgstr "Відображення:"
#: templates/rosetta/pofile.html:124
#: templates/rosetta/pofile.html:148
#, python-format
msgid "%(hits)s/%(message_number)s message"
msgid_plural "%(hits)s/%(message_number)s messages"
msgstr[0] "%(hits)s/%(message_number)s повідомлення"
msgstr[1] "%(hits)s/%(message_number)s повідомлень"
msgstr[2] "%(hits)s/%(message_number)s повідомлень"
#~ msgid "English"
#~ msgstr "Англійська"

View file

@ -2,21 +2,21 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#
msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-10-21 12:21+0200\n"
"POT-Creation-Date: 2014-02-28 13:36+0100\n"
"PO-Revision-Date: 2008-09-22 11:02\n"
"Last-Translator: Admin Admin <admin@admin.com>\n"
"Language-Team: French <LL@li.org>\n"
"Language-Team: XX <LL@li.org>\n"
"Language: XX\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Translated-Using: django-rosetta 0.4.RC2\n"
msgid "String 1"
msgstr ""

File diff suppressed because it is too large Load diff

View file

@ -1,21 +1,27 @@
from datetime import datetime
from django.conf import settings
from django.core.cache import cache
from django.core.cache import get_cache
from rosetta.conf import settings as rosetta_settings
import django
import os
import six
import inspect
try:
from django.utils import timezone
except:
timezone = None
try:
set
except NameError:
from sets import Set as set # Python 2.3 fallback
if django.VERSION[0:2] >= (1,7):
from django.apps import AppConfig
from django.apps import apps
cache = get_cache(rosetta_settings.ROSETTA_CACHE_NAME)
def timestamp_with_timezone(dt=None):
"""
@ -77,6 +83,20 @@ def find_pos(lang, project_apps=True, django_apps=False, third_party_apps=False)
app = getattr(__import__(appname[:p], {}, {}, [str(appname[p + 1:])]), appname[p + 1:])
else:
app = __import__(appname, {}, {}, [])
# For django 1.7, an imported INSTALLED_APP can be an AppConfig instead
# of an app module. This code converts the AppConfig to its application
# module.
if django.VERSION[0:2] >= (1,7):
if inspect.isclass(app) and issubclass(app, AppConfig):
app = apps.get_app_config(app.name).module
try:
if issubclass(app, AppConfig):
app = apps.get_app_config(app.name).module
else:
pass
except:
pass
apppath = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(app.__file__), 'locale')))
@ -92,27 +112,30 @@ def find_pos(lang, project_apps=True, django_apps=False, third_party_apps=False)
if not project_apps and abs_project_path in apppath:
continue
if os.path.isdir(apppath):
paths.append(apppath)
ret = set()
langs = (lang,)
langs = [lang, ]
if u'-' in lang:
_l, _c = map(lambda x: x.lower(), lang.split(u'-'))
langs += (u'%s_%s' % (_l, _c), u'%s_%s' % (_l, _c.upper()), )
langs += [u'%s_%s' % (_l, _c), u'%s_%s' % (_l, _c.upper()), ]
elif u'_' in lang:
_l, _c = map(lambda x: x.lower(), lang.split(u'_'))
langs += (u'%s-%s' % (_l, _c), u'%s-%s' % (_l, _c.upper()), )
langs += [u'%s-%s' % (_l, _c), u'%s-%s' % (_l, _c.upper()), ]
paths = map(os.path.normpath, paths)
paths = list(set(paths))
for path in paths:
for lang_ in langs:
dirname = os.path.join(path, lang_, 'LC_MESSAGES')
for fn in ('django.po', 'djangojs.po',):
filename = os.path.join(dirname, fn)
if os.path.isfile(filename):
ret.add(os.path.abspath(filename))
# Exclude paths
if not path in rosetta_settings.ROSETTA_EXCLUDED_PATHS:
for lang_ in langs:
dirname = os.path.join(path, lang_, 'LC_MESSAGES')
for fn in rosetta_settings.POFILENAMES:
filename = os.path.join(dirname, fn)
if os.path.isfile(filename):
ret.add(os.path.abspath(filename))
return list(sorted(ret))

View file

@ -1,10 +1,15 @@
from django.core.cache import cache
from django.core.cache import get_cache
from django.conf import settings
from django.utils import importlib
from django.core.exceptions import ImproperlyConfigured
from rosetta.conf import settings as rosetta_settings
import hashlib
import time
import six
import django
cache = get_cache(rosetta_settings.ROSETTA_CACHE_NAME)
class BaseRosettaStorage(object):
@ -39,6 +44,12 @@ class DummyRosettaStorage(BaseRosettaStorage):
class SessionRosettaStorage(BaseRosettaStorage):
def __init__(self, request):
super(SessionRosettaStorage, self).__init__(request)
if 'signed_cookies' in settings.SESSION_ENGINE and django.VERSION[1] >= 6 and 'pickle' not in settings.SESSION_SERIALIZER.lower():
raise ImproperlyConfigured("Sorry, but django-rosetta doesn't support the `signed_cookies` SESSION_ENGINE in Django >= 1.6, because rosetta specific session files cannot be serialized.")
def get(self, key, default=None):
if key in self.request.session:
return self.request.session[key]
@ -70,7 +81,7 @@ class CacheRosettaStorage(BaseRosettaStorage):
raise ImproperlyConfigured("You can't use the CacheRosettaStorage because your Django Session storage doesn't seem to be working. The CacheRosettaStorage relies on the Django Session storage to avoid conflicts.")
# Make sure we're not using DummyCache
if 'dummycache' in settings.CACHES['default']['BACKEND'].lower():
if 'dummycache' in settings.CACHES[rosetta_settings.ROSETTA_CACHE_NAME]['BACKEND'].lower():
raise ImproperlyConfigured("You can't use the CacheRosettaStorage if your cache isn't correctly set up (you are use the DummyCache cache backend).")
# Make sure the actually actually works

View file

@ -1,16 +1,16 @@
<!DOCTYPE html>{% load url from future %}
<!DOCTYPE html>{% load url from future %}{% load admin_static %}
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>{% block pagetitle %}Rosetta{% endblock %}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="{{ADMIN_MEDIA_PREFIX}}css/base.css" type="text/css"/>
<link rel="stylesheet" href="{{ADMIN_MEDIA_PREFIX}}css/forms.css" type="text/css"/>
<link rel="stylesheet" href="{{ADMIN_MEDIA_PREFIX}}css/changelists.css" type="text/css"/>
<link rel="stylesheet" href="{% static "admin/css/base.css" %}" type="text/css"/>
<link rel="stylesheet" href="{% static "admin/css/forms.css" %}" type="text/css"/>
<link rel="stylesheet" href="{% static "admin/css/changelists.css" %}" type="text/css"/>
<style type="text/css" media="screen">
{% include 'rosetta/css/rosetta.css' %}
</style>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script src="//www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
//<!--
google.load("jquery", "1.3");

View file

@ -7,7 +7,7 @@ google.setOnLoadCallback(function() {
$('.hide', $(this).parent()).hide();
});
{% if rosetta_settings.ENABLE_TRANSLATION_SUGGESTIONS and rosetta_settings.BING_APP_ID %}
{% if rosetta_settings.ENABLE_TRANSLATION_SUGGESTIONS and rosetta_settings.AZURE_CLIENT_ID and rosetta_settings.AZURE_CLIENT_SECRET %}
$('a.suggest').click(function(e){
e.preventDefault();
var a = $(this);
@ -16,30 +16,63 @@ google.setOnLoadCallback(function() {
var trans=$('textarea',a.parent());
var sourceLang = '{{ rosetta_settings.MESSAGES_SOURCE_LANGUAGE_CODE }}';
var destLang = '{{ rosetta_i18n_lang_code }}';
var app_id = '{{ rosetta_settings.BING_APP_ID }}';
var apiUrl = "http://api.microsofttranslator.com/V2/Ajax.svc/Translate";
orig = unescape(orig).replace(/<br\s?\/?>/g,'\n').replace(/<code>/,'').replace(/<\/code>/g,'').replace(/&gt;/g,'>').replace(/&lt;/g,'<');
a.attr('class','suggesting').html('...');
window.onTranslationComplete = function(resp) {
trans.val(unescape(resp).replace(/&#39;/g,'\'').replace(/&quot;/g,'"').replace(/%\s+(\([^\)]+\))\s*s/g,' %$1s '));
a.hide();
};
window.onTranslationError = function(response){
a.text(response);
};
$.getJSON("/rosetta/translate/", {
from: sourceLang,
to: destLang,
text: orig
},
function(data) {
if (data.success){
trans.val(unescape(data.translation).replace(/&#39;/g,'\'').replace(/&quot;/g,'"').replace(/%\s+(\([^\)]+\))\s*s/g,' %$1s '));
a.hide();
} else {
a.text(data.error);
}
}
);
});
{% endif %}
{% if rosetta_settings.ENABLE_TRANSLATION_SUGGESTIONS and rosetta_settings.YANDEX_TRANSLATE_KEY %}
$('a.suggest').click(function(e){
e.preventDefault();
var a = $(this);
var str = a.html();
var orig = $('.original .message', a.parents('tr')).html();
var trans=$('textarea',a.parent());
var apiUrl = "https://translate.yandex.net/api/v1.5/tr.json/translate";
a.attr('class','suggesting').html('...');
var apiData = {
onerror: 'onTranslationError',
appid: app_id,
from: sourceLang,
to: destLang,
oncomplete: "onTranslationComplete",
error: 'onTranslationError',
success: 'onTranslationComplete',
lang: '{{ rosetta_settings.MESSAGES_SOURCE_LANGUAGE_CODE }}-{{ rosetta_i18n_lang_code }}',
key: '{{ rosetta_settings.YANDEX_TRANSLATE_KEY }}',
format: 'html',
text: orig
};
$.ajax({
url: apiUrl,
data: apiData,
dataType: 'jsonp'});
dataType: 'jsonp',
success: function(response) {
if (response.code == 200) {
trans.val(response.text[0]);
a.hide();
} else {
a.text(response);
}
},
error: function(response) {
a.text(response);
}
});
});
{% endif %}
@ -50,7 +83,7 @@ google.setOnLoadCallback(function() {
$($('.part',td).get(j)).css('top',textareaY + 'px');
});
});
$('.translation textarea').blur(function() {
if($(this).val()) {
$('.alert', $(this).parents('tr')).remove();
@ -78,5 +111,5 @@ google.setOnLoadCallback(function() {
});
$('.translation textarea').eq(0).focus();
});

View file

@ -1,4 +1,4 @@
{% extends "rosetta/base.html" %}
{% extends "rosetta/base.html" %}{% load admin_static %}
{% load rosetta i18n %}
{% load url from future %}
@ -49,23 +49,14 @@
<div id="changelist" class="module{% if rosetta_i18n_lang_bidi %} rtl{% endif %}">
<div id="toolbar">
<form id="changelist-search" action="" method="post">
<div>
{% rosetta_csrf_token %}
<label for="searchbar"><img src="{{ADMIN_IMAGE_DIR}}/icon_searchbox.png" alt="{% trans "Search" %}" /></label>
<input type="text" size="40" name="query" value="{% if query %}{{query}}{% endif %}" id="searchbar" tabindex="0" />
<input type="submit" name="search" value="{% trans "Go" %}" />
</div>
</form>
{% comment %}
{% if rosetta_settings.ENABLE_TRANSLATION_SUGGESTIONS %}
<form id="translate-all">
<div>
<input type="submit" class="googleall" value="{% trans "Suggest All Translations" %}" />
</div>
</form>
{% endif %}
{% endcomment %}
<form id="changelist-search" action="" method="post">
<div>
{% rosetta_csrf_token %}
<label for="searchbar"><img src="{% static "admin/img/icon_searchbox.png" %}" alt="{% trans "Search" %}" /></label>
<input type="text" size="40" name="query" value="{% if query %}{{query}}{% endif %}" id="searchbar" tabindex="0" />
<input type="submit" name="search" value="{% trans "Go" %}" />
</div>
</form>
</div>
<form method="post" action="">

View file

@ -1,573 +1,2 @@
# -*- coding: utf-8 -*-
from django.conf import settings
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.template.defaultfilters import floatformat
from django.test import TestCase
from django.test.client import Client
from rosetta.conf import settings as rosetta_settings
from rosetta.signals import entry_changed, post_save
import os
import shutil
import six
import django
try:
from django.dispatch import receiver
except ImportError:
# We might be in django < 1.3, so backport this function
def receiver(signal, **kwargs):
def _decorator(func):
signal.connect(func, **kwargs)
return func
return _decorator
class RosettaTestCase(TestCase):
urls = 'rosetta.tests.urls'
def __init__(self, *args, **kwargs):
super(RosettaTestCase, self).__init__(*args, **kwargs)
self.curdir = os.path.dirname(__file__)
self.dest_file = os.path.normpath(os.path.join(self.curdir, '../locale/xx/LC_MESSAGES/django.po'))
self.django_version_major, self.django_version_minor = django.VERSION[0], django.VERSION[1]
def setUp(self):
user = User.objects.create_user('test_admin', 'test@test.com', 'test_password')
user2 = User.objects.create_user('test_admin2', 'test@test2.com', 'test_password')
user3 = User.objects.create_user('test_admin3', 'test@test2.com', 'test_password')
user.is_superuser, user2.is_superuser, user3.is_superuser = True, True, True
user.is_staff, user2.is_staff, user3.is_staff = True, True, False
user.save()
user2.save()
user3.save()
self.client2 = Client()
self.client.login(username='test_admin', password='test_password')
self.client2.login(username='test_admin2', password='test_password')
settings.LANGUAGES = (('xx', 'dummy language'),)
shutil.copy(self.dest_file, self.dest_file + '.orig')
def tearDown(self):
shutil.move(self.dest_file + '.orig', self.dest_file)
def test_1_ListLoading(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
def test_2_PickFile(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()) + '?rosetta')
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('dummy language' in str(r.content))
def test_3_DownloadZIP(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()) + '?rosetta')
r = self.client.get(reverse('rosetta-home'))
r = self.client.get(reverse('rosetta-download-file') + '?rosetta')
self.assertTrue('content-type' in r._headers.keys())
self.assertTrue('application/x-zip' in r._headers.get('content-type'))
def test_4_DoChanges(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
# Load the template file
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
# make sure both strings are untranslated
self.assertTrue('dummy language' in str(r.content))
self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 2' in str(r.content))
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
# reload all untranslated strings
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()) + '?rosetta')
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
# the translated string no longer is up for translation
self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 2' not in str(r.content))
# display only translated strings
r = self.client.get(reverse('rosetta-home') + '?filter=translated')
r = self.client.get(reverse('rosetta-home'))
# The tranlsation was persisted
self.assertTrue('String 1' not in str(r.content))
self.assertTrue('String 2' in str(r.content))
self.assertTrue('Hello, world' in str(r.content))
def test_5_TestIssue67(self):
# testcase for issue 67: http://code.google.com/p/django-rosetta/issues/detail?id=67
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue67.template')), self.dest_file)
# Make sure the plurals string is valid
f_ = open(self.dest_file, 'rb')
content = f_.read()
f_.close()
self.assertTrue('Hello, world' not in six.text_type(content))
self.assertTrue('|| n%100>=20) ? 1 : 2)' in six.text_type(content))
del(content)
# Load the template file
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()) + '?rosetta')
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
# make sure all strings are untranslated
self.assertTrue('dummy language' in str(r.content))
self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 2' in str(r.content))
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
# Make sure the plurals string is still valid
f_ = open(self.dest_file, 'rb')
content = f_.read()
f_.close()
self.assertTrue('Hello, world' in str(content))
self.assertTrue('|| n%100>=20) ? 1 : 2)' in str(content))
self.assertTrue('or n%100>=20) ? 1 : 2)' not in str(content))
del(content)
def test_6_ExcludedApps(self):
rosetta_settings.EXCLUDED_APPLICATIONS = ('rosetta',)
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' not in str(r.content))
rosetta_settings.EXCLUDED_APPLICATIONS = ()
r = self.client.get(reverse('rosetta-pick-file') + '?rosetta')
self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' in str(r.content))
def test_7_selfInApplist(self):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=project')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' not in str(r.content))
def test_8_hideObsoletes(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
# not in listing
for p in range(1, 5):
r = self.client.get(reverse('rosetta-home') + '?page=%d' % p)
self.assertTrue('dummy language' in str(r.content))
self.assertTrue('Les deux' not in str(r.content))
r = self.client.get(reverse('rosetta-home') + '?query=Les%20Deux')
self.assertTrue('dummy language' in str(r.content))
self.assertTrue('Les deux' not in str(r.content))
def test_9_concurrency(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client2.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
self.client2.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
# Load the template file
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
r2 = self.client2.get(reverse('rosetta-home') + '?filter=untranslated')
r2 = self.client2.get(reverse('rosetta-home'))
self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 1' in str(r2.content))
self.assertTrue('m_08e4e11e2243d764fc45a5a4fba5d0f2' in str(r.content))
r = self.client.post(reverse('rosetta-home'), dict(m_08e4e11e2243d764fc45a5a4fba5d0f2='Hello, world', _next='_next'), follow=True)
r2 = self.client2.get(reverse('rosetta-home'))
# Client 2 reloads the home, forces a reload of the catalog,
# the untranslated string1 is now translated
self.assertTrue('String 1' not in str(r2.content))
self.assertTrue('String 2' in str(r2.content))
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
r2 = self.client2.get(reverse('rosetta-home') + '?filter=untranslated')
r2 = self.client2.get(reverse('rosetta-home'))
self.assertTrue('String 2' in str(r2.content) and 'm_e48f149a8b2e8baa81b816c0edf93890' in str(r2.content))
self.assertTrue('String 2' in str(r.content) and 'm_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# client 2 posts!
r2 = self.client2.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world, from client two!', _next='_next'), follow=True)
self.assertTrue('save-conflict' not in str(r2.content))
# uh-oh here comes client 1
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world, from client one!', _next='_next'), follow=True)
# An error message is displayed
self.assertTrue('save-conflict' in str(r.content))
# client 2 won
pofile_content = open(self.dest_file, 'r').read()
self.assertTrue('Hello, world, from client two!' in pofile_content)
# Both clients show all strings, error messages are gone
r = self.client.get(reverse('rosetta-home') + '?filter=translated')
self.assertTrue('save-conflict' not in str(r.content))
r2 = self.client2.get(reverse('rosetta-home') + '?filter=translated')
self.assertTrue('save-conflict' not in str(r2.content))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('save-conflict' not in str(r.content))
r2 = self.client2.get(reverse('rosetta-home'))
self.assertTrue('save-conflict' not in str(r2.content))
# Both have client's two version
self.assertTrue('Hello, world, from client two!' in str(r.content))
self.assertTrue('Hello, world, from client two!' in str(r2.content))
self.assertTrue('save-conflict' not in str(r2.content))
self.assertTrue('save-conflict' not in str(r.content))
def test_10_issue_79_num_entries(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue79.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue('<td class="ch-messages r">1</td>' in str(r.content))
self.assertTrue('<td class="ch-progress r">%s%%</td>' % str(floatformat(0.0, 2)) in str(r.content))
self.assertTrue('<td class="ch-obsolete r">1</td>' in str(r.content))
def test_11_issue_80_tab_indexes(self):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('tabindex="3"' in str(r.content))
def test_12_issue_82_staff_user(self):
settings.ROSETTA_REQUIRES_AUTH = True
self.client3 = Client()
self.client3.login(username='test_admin3', password='test_password')
self.client3.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client3.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client3.get(reverse('rosetta-home'))
self.assertTrue(not r.content)
settings.ROSETTA_REQUIRES_AUTH = False
self.client3.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client3.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()))
r = self.client3.get(reverse('rosetta-home'))
self.assertFalse(not r.content)
def test_13_catalog_filters(self):
settings.LANGUAGES = (('fr', 'French'), ('xx', 'Dummy Language'),)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
self.assertTrue(('contrib') not in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=django')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') not in str(r.content))
if self.django_version_major >= 1 and self.django_version_minor >= 3:
self.assertTrue(('contrib') in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=all')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
if self.django_version_major >= 1 and self.django_version_minor >= 3:
self.assertTrue(('contrib') in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=project')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') not in str(r.content))
if self.django_version_major >= 1 and self.django_version_minor >= 3:
self.assertTrue(('contrib') not in str(r.content))
def test_14_issue_99_context_and_comments(self):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('This is a text of the base template' in str(r.content))
self.assertTrue('Context hint' in str(r.content))
def test_14_issue_87_entry_changed_signal(self):
# copy the template file
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
@receiver(entry_changed)
def test_receiver(sender, **kwargs):
self.test_old_msgstr = kwargs.get('old_msgstr')
self.test_new_msgstr = sender.msgstr
self.test_msg_id = sender.msgid
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
self.assertTrue(self.test_old_msgstr == '')
self.assertTrue(self.test_new_msgstr == 'Hello, world')
self.assertTrue(self.test_msg_id == 'String 2')
del(self.test_old_msgstr, self.test_new_msgstr, self.test_msg_id)
def test_15_issue_101_post_save_signal(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
@receiver(post_save)
def test_receiver(sender, **kwargs):
self.test_sig_lang = kwargs.get('language_code')
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
self.assertTrue(self.test_sig_lang == 'xx')
del(self.test_sig_lang)
def test_16_issue_103_post_save_signal_has_request(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
@receiver(post_save)
def test_receiver(sender, **kwargs):
self.test_16_has_request = 'request' in kwargs
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
self.assertTrue(self.test_16_has_request)
del(self.test_16_has_request)
# reset the original file
def test_17_Test_Issue_gh24(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue24gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('m_bb9d8fe6159187b9ea494c1b313d23d4' in str(r.content))
# post a translation, it should have properly wrapped lines
r = self.client.post(reverse('rosetta-home'), dict(m_bb9d8fe6159187b9ea494c1b313d23d4='Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.', _next='_next'))
pofile_content = open(self.dest_file, 'r').read()
self.assertTrue('"pede mollis pretium."' in pofile_content)
# Again, with unwrapped lines
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue24gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('m_bb9d8fe6159187b9ea494c1b313d23d4' in str(r.content))
rosetta_settings.POFILE_WRAP_WIDTH = 0
r = self.client.post(reverse('rosetta-home'), dict(m_bb9d8fe6159187b9ea494c1b313d23d4='Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.', _next='_next'))
pofile_content = open(self.dest_file, 'r').read()
self.assertTrue('felis eu pede mollis pretium."' in pofile_content)
def test_18_Test_Issue_gh34(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue34gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('m_ff7060c1a9aae9c42af4d54ac8551f67_1' in str(r.content))
self.assertTrue('m_ff7060c1a9aae9c42af4d54ac8551f67_0' in str(r.content))
self.assertTrue('m_09f7e02f1290be211da707a266f153b3' in str(r.content))
# post a translation, it should have properly wrapped lines
r = self.client.post(reverse('rosetta-home'), dict(
m_ff7060c1a9aae9c42af4d54ac8551f67_0='Foo %s',
m_ff7060c1a9aae9c42af4d54ac8551f67_1='Bar %s',
m_09f7e02f1290be211da707a266f153b3='Salut', _next='_next'))
pofile_content = open(self.dest_file, 'r').read()
self.assertTrue('msgstr "Salut\\n"' in pofile_content)
self.assertTrue('msgstr[0] ""\n"\\n"\n"Foo %s\\n"' in pofile_content)
self.assertTrue('msgstr[1] ""\n"\\n"\n"Bar %s\\n"' in pofile_content)
def test_19_Test_Issue_gh38(self):
if self.django_version_minor >= 4 and self.django_version_major >= 1:
self.assertTrue('django.contrib.sessions.middleware.SessionMiddleware' in settings.MIDDLEWARE_CLASSES)
settings.SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
# One: cache backend
rosetta_settings.STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage'
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue38gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertFalse(len(str(self.client.cookies.get('sessionid'))) > 4096)
self.assertTrue('m_9efd113f7919952523f06e0d88da9c54' in str(r.content))
r = self.client.post(reverse('rosetta-home'), dict(
m_9efd113f7919952523f06e0d88da9c54='Testing cookie length',
_next='_next'
))
pofile_content = open(self.dest_file, 'r').read()
self.assertTrue('Testing cookie length' in pofile_content)
self.client.get(reverse('rosetta-home') + '?filter=translated')
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('Testing cookie length' in str(r.content))
self.assertTrue('m_9f6c442c6d579707440ba9dada0fb373' in str(r.content))
# Two, the cookie backend
rosetta_settings.STORAGE_CLASS = 'rosetta.storage.SessionRosettaStorage'
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue38gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue(len(str(self.client.cookies.get('sessionid'))) > 4096)
# boom: be a good browser, truncate the cookie
self.client.cookies['sessionid'] = six.text_type(self.client.cookies.get('sessionid'))[:4096]
r = self.client.get(reverse('rosetta-home'))
self.assertFalse('m_9efd113f7919952523f06e0d88da9c54' in str(r.content))
def test_20_concurrency_of_cache_backend(self):
rosetta_settings.STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage'
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue38gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
self.client2.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.client2.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
self.assertTrue(self.client.session.get('rosetta_cache_storage_key_prefix') != self.client2.session.get('rosetta_cache_storage_key_prefix'))
def test_21_Test_Issue_gh39(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue39gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
# We have distinct hashes, even though the msgid and msgstr are identical
#print (r.content)
self.assertTrue('m_4765f7de94996d3de5975fa797c3451f' in str(r.content))
self.assertTrue('m_08e4e11e2243d764fc45a5a4fba5d0f2' in str(r.content))
def test_22_save_header_data(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
unicode_user = User.objects.create_user('test_unicode', 'save_header_data@test.com', 'test_unicode')
unicode_user.first_name = "aéaéaé aàaàaàa"
unicode_user.last_name = "aâââ üüüü"
unicode_user.is_superuser, unicode_user.is_staff = True, True
unicode_user.save()
self.client.login(username='test_unicode', password='test_unicode')
# Load the template file
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
# make sure both strings are untranslated
self.assertTrue('dummy language' in str(r.content))
self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 2' in str(r.content))
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
# read the result
f_ = open(self.dest_file, 'rb')
content = six.text_type(f_.read())
f_.close()
#print (content)
# make sure unicode data was properly converted to ascii
self.assertTrue('Hello, world' in content)
self.assertTrue('save_header_data@test.com' in content)
self.assertTrue('aeaeae aaaaaaa aaaa uuuu' in content)
def test_23_percent_transaltion(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
# Load the template file
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('Progress: 0.00%' in str(r.content))
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('Progress: 25.00%' in str(r.content))
def test_24_replace_access_control(self):
# Test default access control allows access
url = reverse('rosetta-home')
response = self.client.get(url)
self.assertEqual(200, response.status_code)
# Now replace access control, and check we get redirected
settings.ROSETTA_ACCESS_CONTROL_FUNCTION = 'rosetta.tests.no_access'
response = self.client.get(url)
self.assertEqual(302, response.status_code)
# Restore setting to default
settings.ROSETTA_ACCESS_CONTROL_FUNCTION = None
def test_25_reflang(self):
rosetta_settings.ENABLE_REFLANG = True
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue60.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
# Verify that there's an option to select a reflang
self.assertTrue('<option value="/rosetta/select-ref/xx/">dummy language</option>' in str(r.content))
r = self.client.get('/rosetta/select-ref/xx/')
r = self.client.get(reverse('rosetta-home'))
# The translated string in the test PO file ends up in the "Reference" column
self.assertTrue('<span class="message">translated-string1</span>' in str(r.content))
# Stubbed access control function
def no_access(user):
return False
from .tests import *
from microsofttranslator.test import *

View file

@ -0,0 +1,27 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-10-21 12:21+0200\n"
"PO-Revision-Date: 2008-09-22 11:02\n"
"Last-Translator: Admin Admin <admin@admin.com>\n"
"Language-Team: French <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Translated-Using: django-rosetta 0.4.RC2\n"
msgid "String 1"
msgstr ""
#~ msgid "String 2"
#~ msgstr ""

675
rosetta/tests/tests.py Normal file
View file

@ -0,0 +1,675 @@
# -*- coding: utf-8 -*-
from django.conf import settings
from django.contrib.auth.models import User, Group
from django.core.urlresolvers import reverse, resolve
from django.core.exceptions import ImproperlyConfigured
from django.core.cache import cache
from django.template.defaultfilters import floatformat
from django.test import TestCase
from django.test.client import Client
from rosetta.conf import settings as rosetta_settings
from rosetta.signals import entry_changed, post_save
import os
import shutil
import six
import django
try:
from django.dispatch import receiver
except ImportError:
# We might be in django < 1.3, so backport this function
def receiver(signal, **kwargs):
def _decorator(func):
signal.connect(func, **kwargs)
return func
return _decorator
class RosettaTestCase(TestCase):
urls = 'rosetta.tests.urls'
def __init__(self, *args, **kwargs):
super(RosettaTestCase, self).__init__(*args, **kwargs)
self.curdir = os.path.dirname(__file__)
self.dest_file = os.path.normpath(os.path.join(self.curdir, '../locale/xx/LC_MESSAGES/django.po'))
self.django_version_major, self.django_version_minor = django.VERSION[0], django.VERSION[1]
def setUp(self):
user = User.objects.create_user('test_admin', 'test@test.com', 'test_password')
user2 = User.objects.create_user('test_admin2', 'test@test2.com', 'test_password')
user3 = User.objects.create_user('test_admin3', 'test@test2.com', 'test_password')
user.is_superuser, user2.is_superuser, user3.is_superuser = True, True, True
user.is_staff, user2.is_staff, user3.is_staff = True, True, False
user.save()
user2.save()
user3.save()
self.client2 = Client()
self.client.login(username='test_admin', password='test_password')
self.client2.login(username='test_admin2', password='test_password')
self.__old_settings_languages = settings.LANGUAGES
settings.LANGUAGES = (('xx', 'dummy language'), ('fr_FR.utf8', 'French (France), UTF8'))
self.__session_engine = settings.SESSION_ENGINE
self.__storage_class = rosetta_settings.STORAGE_CLASS
self.__require_auth = rosetta_settings.ROSETTA_REQUIRES_AUTH
shutil.copy(self.dest_file, self.dest_file + '.orig')
def tearDown(self):
settings.LANGUAGES = self.__old_settings_languages
settings.SESSION_ENGINE = self.__session_engine
rosetta_settings.STORAGE_CLASS = self.__storage_class
rosetta_settings.ROSETTA_REQUIRES_AUTH = self.__require_auth
shutil.move(self.dest_file + '.orig', self.dest_file)
def test_1_ListLoading(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
def test_2_PickFile(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()) + '?rosetta')
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('dummy language' in str(r.content))
def test_3_DownloadZIP(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()) + '?rosetta')
r = self.client.get(reverse('rosetta-home'))
r = self.client.get(reverse('rosetta-download-file') + '?rosetta')
self.assertTrue('content-type' in r._headers.keys())
self.assertTrue('application/x-zip' in r._headers.get('content-type'))
def test_4_DoChanges(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
# Load the template file
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
# make sure both strings are untranslated
self.assertTrue('dummy language' in str(r.content))
self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 2' in str(r.content))
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
# reload all untranslated strings
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()) + '?rosetta')
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
# the translated string no longer is up for translation
self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 2' not in str(r.content))
# display only translated strings
r = self.client.get(reverse('rosetta-home') + '?filter=translated')
r = self.client.get(reverse('rosetta-home'))
# The tranlsation was persisted
self.assertTrue('String 1' not in str(r.content))
self.assertTrue('String 2' in str(r.content))
self.assertTrue('Hello, world' in str(r.content))
def test_5_TestIssue67(self):
# testcase for issue 67: http://code.google.com/p/django-rosetta/issues/detail?id=67
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue67.template')), self.dest_file)
# Make sure the plurals string is valid
f_ = open(self.dest_file, 'rb')
content = f_.read()
f_.close()
self.assertTrue('Hello, world' not in six.text_type(content))
self.assertTrue('|| n%100>=20) ? 1 : 2)' in six.text_type(content))
del(content)
# Load the template file
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()) + '?rosetta')
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
# make sure all strings are untranslated
self.assertTrue('dummy language' in str(r.content))
self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 2' in str(r.content))
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
# Make sure the plurals string is still valid
f_ = open(self.dest_file, 'rb')
content = f_.read()
f_.close()
self.assertTrue('Hello, world' in str(content))
self.assertTrue('|| n%100>=20) ? 1 : 2)' in str(content))
self.assertTrue('or n%100>=20) ? 1 : 2)' not in str(content))
del(content)
def test_6_ExcludedApps(self):
rosetta_settings.EXCLUDED_APPLICATIONS = ('rosetta',)
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' not in str(r.content))
rosetta_settings.EXCLUDED_APPLICATIONS = ()
r = self.client.get(reverse('rosetta-pick-file') + '?rosetta')
self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' in str(r.content))
def test_7_selfInApplist(self):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=project')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' not in str(r.content))
def test_8_hideObsoletes(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
# not in listing
for p in range(1, 5):
r = self.client.get(reverse('rosetta-home') + '?page=%d' % p)
self.assertTrue('dummy language' in str(r.content))
self.assertTrue('Les deux' not in str(r.content))
r = self.client.get(reverse('rosetta-home') + '?query=Les%20Deux')
self.assertTrue('dummy language' in str(r.content))
self.assertTrue('Les deux' not in str(r.content))
def test_9_concurrency(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client2.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
self.client2.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
# Load the template file
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
r2 = self.client2.get(reverse('rosetta-home') + '?filter=untranslated')
r2 = self.client2.get(reverse('rosetta-home'))
self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 1' in str(r2.content))
self.assertTrue('m_08e4e11e2243d764fc45a5a4fba5d0f2' in str(r.content))
r = self.client.post(reverse('rosetta-home'), dict(m_08e4e11e2243d764fc45a5a4fba5d0f2='Hello, world', _next='_next'), follow=True)
r2 = self.client2.get(reverse('rosetta-home'))
# Client 2 reloads the home, forces a reload of the catalog,
# the untranslated string1 is now translated
self.assertTrue('String 1' not in str(r2.content))
self.assertTrue('String 2' in str(r2.content))
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
r2 = self.client2.get(reverse('rosetta-home') + '?filter=untranslated')
r2 = self.client2.get(reverse('rosetta-home'))
self.assertTrue('String 2' in str(r2.content) and 'm_e48f149a8b2e8baa81b816c0edf93890' in str(r2.content))
self.assertTrue('String 2' in str(r.content) and 'm_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# client 2 posts!
r2 = self.client2.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world, from client two!', _next='_next'), follow=True)
self.assertTrue('save-conflict' not in str(r2.content))
# uh-oh here comes client 1
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world, from client one!', _next='_next'), follow=True)
# An error message is displayed
self.assertTrue('save-conflict' in str(r.content))
# client 2 won
pofile_content = open(self.dest_file, 'r').read()
self.assertTrue('Hello, world, from client two!' in pofile_content)
# Both clients show all strings, error messages are gone
r = self.client.get(reverse('rosetta-home') + '?filter=translated')
self.assertTrue('save-conflict' not in str(r.content))
r2 = self.client2.get(reverse('rosetta-home') + '?filter=translated')
self.assertTrue('save-conflict' not in str(r2.content))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('save-conflict' not in str(r.content))
r2 = self.client2.get(reverse('rosetta-home'))
self.assertTrue('save-conflict' not in str(r2.content))
# Both have client's two version
self.assertTrue('Hello, world, from client two!' in str(r.content))
self.assertTrue('Hello, world, from client two!' in str(r2.content))
self.assertTrue('save-conflict' not in str(r2.content))
self.assertTrue('save-conflict' not in str(r.content))
def test_10_issue_79_num_entries(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue79.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue('<td class="ch-messages r">1</td>' in str(r.content))
self.assertTrue('<td class="ch-progress r">%s%%</td>' % str(floatformat(0.0, 2)) in str(r.content))
self.assertTrue('<td class="ch-obsolete r">1</td>' in str(r.content))
def test_11_issue_80_tab_indexes(self):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('tabindex="3"' in str(r.content))
def test_12_issue_82_staff_user(self):
settings.ROSETTA_REQUIRES_AUTH = True
self.client3 = Client()
self.client3.login(username='test_admin3', password='test_password')
self.client3.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client3.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client3.get(reverse('rosetta-home'))
self.assertTrue(not r.content)
settings.ROSETTA_REQUIRES_AUTH = False
self.client3.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client3.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()))
r = self.client3.get(reverse('rosetta-home'))
self.assertFalse(not r.content)
def test_13_catalog_filters(self):
settings.LANGUAGES = (('fr', 'French'), ('xx', 'Dummy Language'),)
cache.delete('rosetta_django_paths')
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
self.assertTrue(('contrib') not in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=django')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') not in str(r.content))
if self.django_version_major >= 1 and self.django_version_minor >= 3:
self.assertTrue(('contrib') in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=all')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
if self.django_version_major >= 1 and self.django_version_minor >= 3:
self.assertTrue(('contrib') in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=project')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') not in str(r.content))
if self.django_version_major >= 1 and self.django_version_minor >= 3:
self.assertTrue(('contrib') not in str(r.content))
def test_14_issue_99_context_and_comments(self):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('This is a text of the base template' in str(r.content))
self.assertTrue('Context hint' in str(r.content))
def test_15_issue_87_entry_changed_signal(self):
# copy the template file
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
@receiver(entry_changed)
def test_receiver(sender, **kwargs):
self.test_old_msgstr = kwargs.get('old_msgstr')
self.test_new_msgstr = sender.msgstr
self.test_msg_id = sender.msgid
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
self.assertTrue(self.test_old_msgstr == '')
self.assertTrue(self.test_new_msgstr == 'Hello, world')
self.assertTrue(self.test_msg_id == 'String 2')
del(self.test_old_msgstr, self.test_new_msgstr, self.test_msg_id)
def test_16_issue_101_post_save_signal(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
@receiver(post_save)
def test_receiver(sender, **kwargs):
self.test_sig_lang = kwargs.get('language_code')
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
self.assertTrue(self.test_sig_lang == 'xx')
del(self.test_sig_lang)
def test_17_issue_103_post_save_signal_has_request(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
@receiver(post_save)
def test_receiver(sender, **kwargs):
self.test_16_has_request = 'request' in kwargs
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
self.assertTrue(self.test_16_has_request)
del(self.test_16_has_request)
# reset the original file
def test_18_Test_Issue_gh24(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue24gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('m_bb9d8fe6159187b9ea494c1b313d23d4' in str(r.content))
# post a translation, it should have properly wrapped lines
r = self.client.post(reverse('rosetta-home'), dict(m_bb9d8fe6159187b9ea494c1b313d23d4='Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.', _next='_next'))
pofile_content = open(self.dest_file, 'r').read()
self.assertTrue('"pede mollis pretium."' in pofile_content)
# Again, with unwrapped lines
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue24gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('m_bb9d8fe6159187b9ea494c1b313d23d4' in str(r.content))
rosetta_settings.POFILE_WRAP_WIDTH = 0
r = self.client.post(reverse('rosetta-home'), dict(m_bb9d8fe6159187b9ea494c1b313d23d4='Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.', _next='_next'))
pofile_content = open(self.dest_file, 'r').read()
self.assertTrue('felis eu pede mollis pretium."' in pofile_content)
def test_19_Test_Issue_gh34(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue34gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('m_ff7060c1a9aae9c42af4d54ac8551f67_1' in str(r.content))
self.assertTrue('m_ff7060c1a9aae9c42af4d54ac8551f67_0' in str(r.content))
self.assertTrue('m_09f7e02f1290be211da707a266f153b3' in str(r.content))
# post a translation, it should have properly wrapped lines
r = self.client.post(reverse('rosetta-home'), dict(
m_ff7060c1a9aae9c42af4d54ac8551f67_0='Foo %s',
m_ff7060c1a9aae9c42af4d54ac8551f67_1='Bar %s',
m_09f7e02f1290be211da707a266f153b3='Salut', _next='_next'))
pofile_content = open(self.dest_file, 'r').read()
self.assertTrue('msgstr "Salut\\n"' in pofile_content)
self.assertTrue('msgstr[0] ""\n"\\n"\n"Foo %s\\n"' in pofile_content)
self.assertTrue('msgstr[1] ""\n"\\n"\n"Bar %s\\n"' in pofile_content)
def test_20_Test_Issue_gh38(self):
if self.django_version_minor >= 4 and self.django_version_major >= 1:
self.assertTrue('django.contrib.sessions.middleware.SessionMiddleware' in settings.MIDDLEWARE_CLASSES)
settings.SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
# One: cache backend
rosetta_settings.STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage'
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue38gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertFalse(len(str(self.client.cookies.get('sessionid'))) > 4096)
self.assertTrue('m_9efd113f7919952523f06e0d88da9c54' in str(r.content))
r = self.client.post(reverse('rosetta-home'), dict(
m_9efd113f7919952523f06e0d88da9c54='Testing cookie length',
_next='_next'
))
pofile_content = open(self.dest_file, 'r').read()
self.assertTrue('Testing cookie length' in pofile_content)
self.client.get(reverse('rosetta-home') + '?filter=translated')
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('Testing cookie length' in str(r.content))
self.assertTrue('m_9f6c442c6d579707440ba9dada0fb373' in str(r.content))
# Two, the cookie backend
if self.django_version_minor < 6:
rosetta_settings.STORAGE_CLASS = 'rosetta.storage.SessionRosettaStorage'
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue38gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue(len(str(self.client.cookies.get('sessionid'))) > 4096)
# boom: be a good browser, truncate the cookie
self.client.cookies['sessionid'] = six.text_type(self.client.cookies.get('sessionid'))[:4096]
r = self.client.get(reverse('rosetta-home'))
self.assertFalse('m_9efd113f7919952523f06e0d88da9c54' in str(r.content))
def test_21_concurrency_of_cache_backend(self):
rosetta_settings.STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage'
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue38gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
self.client2.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.client2.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
self.assertTrue(self.client.session.get('rosetta_cache_storage_key_prefix') != self.client2.session.get('rosetta_cache_storage_key_prefix'))
def test_22_Test_Issue_gh39(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue39gh.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
# We have distinct hashes, even though the msgid and msgstr are identical
#print (r.content)
self.assertTrue('m_4765f7de94996d3de5975fa797c3451f' in str(r.content))
self.assertTrue('m_08e4e11e2243d764fc45a5a4fba5d0f2' in str(r.content))
def test_23_save_header_data(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
unicode_user = User.objects.create_user('test_unicode', 'save_header_data@test.com', 'test_unicode')
unicode_user.first_name = "aéaéaé aàaàaàa"
unicode_user.last_name = "aâââ üüüü"
unicode_user.is_superuser, unicode_user.is_staff = True, True
unicode_user.save()
self.client.login(username='test_unicode', password='test_unicode')
# Load the template file
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
# make sure both strings are untranslated
self.assertTrue('dummy language' in str(r.content))
self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 2' in str(r.content))
self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
# read the result
f_ = open(self.dest_file, 'rb')
content = six.text_type(f_.read())
f_.close()
#print (content)
# make sure unicode data was properly converted to ascii
self.assertTrue('Hello, world' in content)
self.assertTrue('save_header_data@test.com' in content)
self.assertTrue('aeaeae aaaaaaa aaaa uuuu' in content)
def test_24_percent_transaltion(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
# Load the template file
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('Progress: 0.00%' in str(r.content))
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('Progress: 25.00%' in str(r.content))
def test_25_replace_access_control(self):
# Test default access control allows access
url = reverse('rosetta-home')
response = self.client.get(url)
self.assertEqual(200, response.status_code)
# Now replace access control, and check we get redirected
settings.ROSETTA_ACCESS_CONTROL_FUNCTION = 'rosetta.tests.no_access'
response = self.client.get(url)
self.assertEqual(302, response.status_code)
# Restore setting to default
settings.ROSETTA_ACCESS_CONTROL_FUNCTION = None
def test_26_urlconf_accept_dots_and_underscores(self):
resolver_match = resolve("/rosetta/select/fr_FR.utf8/0/")
self.assertEqual(resolver_match.url_name, "rosetta-language-selection")
self.assertEqual(resolver_match.kwargs['langid'], 'fr_FR.utf8')
def test_27_extended_urlconf_language_code_loads_file(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=all')
r = self.client.get(reverse('rosetta-language-selection', args=('fr_FR.utf8', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('French (France), UTF8' in str(r.content))
self.assertTrue('m_71a6479faf8712e37dd5755cd1d11804' in str(r.content))
def test_28_issue_gh87(self):
"make sure that rosetta_i18n_catalog_filter is passed into the context"
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue('<li class="active"><a href="?filter=third-party">' in str(r.content))
def test_29_unsupported_p3_django_16_storage(self):
if self.django_version_minor >= 6 and self.django_version_major >= 1:
self.assertTrue('django.contrib.sessions.middleware.SessionMiddleware' in settings.MIDDLEWARE_CLASSES)
settings.SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
rosetta_settings.STORAGE_CLASS = 'rosetta.storage.SessionRosettaStorage'
try:
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
self.fail()
except ImproperlyConfigured:
pass
def test_30_pofile_names(self):
POFILENAMES = rosetta_settings.POFILENAMES
rosetta_settings.POFILENAMES = ('pr44.po', )
os.unlink(self.dest_file)
destfile = os.path.normpath(os.path.join(self.curdir, '../locale/xx/LC_MESSAGES/pr44.po'))
shutil.copy(os.path.normpath(os.path.join(self.curdir, './pr44.po.template')), destfile)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('xx/LC_MESSAGES/pr44.po' in str(r.content))
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()) + '?rosetta')
r = self.client.get(reverse('rosetta-home'))
self.assertTrue('dummy language' in str(r.content))
os.unlink(destfile)
rosetta_settings.POFILENAMES = POFILENAMES
def test_31_pr_102__exclude_paths(self):
ROSETTA_EXCLUDED_PATHS = rosetta_settings.ROSETTA_EXCLUDED_PATHS
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
exclude_path = os.path.normpath(os.path.join(self.curdir, '../locale'))
rosetta_settings.ROSETTA_EXCLUDED_PATHS = [exclude_path, ]
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertFalse(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
rosetta_settings.ROSETTA_EXCLUDED_PATHS = ROSETTA_EXCLUDED_PATHS
def test_32_pr_103__language_groups(self):
ROSETTA_LANGUAGE_GROUPS = rosetta_settings.ROSETTA_LANGUAGE_GROUPS
rosetta_settings.ROSETTA_LANGUAGE_GROUPS = False
# Default behavior: non admins need to be in a translators group, they see
# all catalogs
translators = Group.objects.create(name='translators')
translators_xx = Group.objects.create(name='translators-xx')
user4 = User.objects.create_user('test_admin4', 'test@test3.com', 'test_password')
user4.groups.add(translators)
user4.is_superuser = False
user4.is_staff = True
user4.save()
self.client.login(username='test_admin4', password='test_password')
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
# Activate the option, user doesn't see the XX catalog
rosetta_settings.ROSETTA_LANGUAGE_GROUPS = True
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertFalse(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
# Now add them to the custom group
user4.groups.add(translators_xx)
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
rosetta_settings.ROSETTA_LANGUAGE_GROUPS = ROSETTA_LANGUAGE_GROUPS
# Stubbed access control function
def no_access(user):
return False

View file

@ -8,6 +8,7 @@ urlpatterns = patterns('rosetta.views',
url(r'^$', 'home', name='rosetta-home'),
url(r'^pick/$', 'list_languages', name='rosetta-pick-file'),
url(r'^download/$', 'download_file', name='rosetta-download-file'),
url(r'^select/(?P<langid>[\w\-]+)/(?P<idx>\d+)/$', 'lang_sel', name='rosetta-language-selection'),
url(r'^select/(?P<langid>[\w\-_\.]+)/(?P<idx>\d+)/$', 'lang_sel', name='rosetta-language-selection'),
url(r'^select-ref/(?P<langid>[\w\-]+)/$', 'ref_sel', name='rosetta-reference-selection'),
url(r'^translate/$', 'translate_text', name='translate_text'),
)

View file

View file

@ -8,12 +8,17 @@ from django.template import RequestContext
from django.utils.encoding import iri_to_uri
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.cache import never_cache
from microsofttranslator import Translator, TranslateApiException
from rosetta.conf import settings as rosetta_settings
from rosetta.polib import pofile
from polib import pofile
from rosetta.poutil import find_pos, pagination_range, timestamp_with_timezone
from rosetta.signals import entry_changed, post_save
from rosetta.storage import get_storage
from rosetta.access import can_translate
from rosetta.access import can_translate, can_translate_language
import json
import re
import rosetta
import unicodedata
@ -93,6 +98,10 @@ def home(request):
# so we need unicode here.
plural_id = six.text_type(rx_plural.match(key).groups()[1])
# Above no longer true as of Polib 1.0.4
if plural_id and plural_id.isdigit():
plural_id = int(plural_id)
elif rx.match(key):
md5hash = str(rx.match(key).groups()[0])
@ -152,7 +161,7 @@ def home(request):
post_save.send(sender=None, language_code=rosetta_i18n_lang_code, request=request)
# Try auto-reloading via the WSGI daemon mode reload mechanism
if rosetta_settings.WSGI_AUTO_RELOAD and \
if rosetta_settings.WSGI_AUTO_RELOAD and \
'mod_wsgi.process_group' in request.environ and \
request.environ.get('mod_wsgi.process_group', None) and \
'SCRIPT_FILENAME' in request.environ and \
@ -356,12 +365,15 @@ def list_languages(request, do_session_warn=False):
has_pos = False
for language in settings.LANGUAGES:
if not can_translate_language(request.user, language[0]):
continue
pos = find_pos(language[0], project_apps=project_apps, django_apps=django_apps, third_party_apps=third_party_apps)
has_pos = has_pos or len(pos)
languages.append(
(language[0],
_(language[1]),
sorted([(get_app_name(l), os.path.realpath(l), pofile(l)) for l in pos], key=lambda app: app[0]),
sorted([(get_app_name(l), os.path.realpath(l), pofile(l)) for l in pos], key=lambda app: app[0]),
)
)
try:
@ -375,7 +387,8 @@ def list_languages(request, do_session_warn=False):
ADMIN_MEDIA_PREFIX=ADMIN_MEDIA_PREFIX,
do_session_warn=do_session_warn,
languages=languages,
has_pos=has_pos
has_pos=has_pos,
rosetta_i18n_catalog_filter=rosetta_i18n_catalog_filter
), context_instance=RequestContext(request))
@ -391,7 +404,7 @@ def lang_sel(request, langid, idx):
Selects a file to be translated
"""
storage = get_storage(request)
if langid not in [l[0] for l in settings.LANGUAGES]:
if langid not in [l[0] for l in settings.LANGUAGES] or not can_translate_language(request.user, langid):
raise Http404
else:
@ -404,7 +417,7 @@ def lang_sel(request, langid, idx):
storage.set('rosetta_i18n_lang_code', langid)
storage.set('rosetta_i18n_lang_name', six.text_type([l[1] for l in settings.LANGUAGES if l[0] == langid][0]))
storage.set('rosetta_i18n_fn', file_)
storage.set('rosetta_i18n_fn', file_)
po = pofile(file_)
for entry in po:
entry.md5hash = hashlib.new('md5',
@ -434,3 +447,26 @@ def ref_sel(request, langid):
return HttpResponseRedirect(reverse('rosetta-home'))
ref_sel = never_cache(ref_sel)
ref_sel = user_passes_test(lambda user: can_translate(user), settings.LOGIN_URL)(ref_sel)
@user_passes_test(lambda user: can_translate(user), settings.LOGIN_URL)
def translate_text(request):
language_from = request.GET.get('from', None)
language_to = request.GET.get('to', None)
text = request.GET.get('text', None)
if language_from == language_to:
data = {'success': True, 'translation': text}
else:
# run the translation:
AZURE_CLIENT_ID = getattr(settings, 'AZURE_CLIENT_ID', None)
AZURE_CLIENT_SECRET = getattr(settings, 'AZURE_CLIENT_SECRET', None)
translator = Translator(AZURE_CLIENT_ID, AZURE_CLIENT_SECRET)
try:
translated_text = translator.translate(text, language_to)
data = {'success': True, 'translation': translated_text}
except TranslateApiException as e:
data = {'success': False, 'error': "Translation API Exception: {0}".format(e.message)}
return HttpResponse(json.dumps(data), mimetype='application/json')

View file

@ -1,16 +0,0 @@
#!/bin/bash
if [ ! -d venv_13 ]
then
virtualenv --no-site-packages --distribute --python=python2 venv_13
. venv_13/bin/activate
pip install Django==1.3 coverage python-memcached six
deactivate
fi
. venv_13/bin/activate
cd testproject
python manage.py test rosetta
cd ..
deactivate

View file

@ -1,16 +0,0 @@
#!/bin/bash
if [ ! -d venv_13 ]
then
virtualenv --no-site-packages --distribute --python=python2 venv_13
. venv_13/bin/activate
pip install Django==1.3 coverage python-memcached six
deactivate
fi
. venv_13/bin/activate
cd testproject
coverage run --rcfile=.coveragerc manage.py test --failfast rosetta
coverage xml
coverage html
cd ..

View file

@ -1,58 +1,59 @@
#!/bin/bash
if [ ! -d venv_13 ]
if [ ! -d .venv_14 ]
then
virtualenv --no-site-packages --distribute --python=python2 venv_13
. venv_13/bin/activate
pip install Django==1.3 coverage python-memcached six
virtualenv --no-site-packages --distribute --python=python2.7 .venv_14
. .venv_14/bin/activate
pip install --use-mirrors Django==1.4 coverage python-memcached six requests==2.1.0 polib==1.0.4 microsofttranslator==0.5
deactivate
fi
if [ ! -d venv_14 ]
if [ ! -d .venv_15 ]
then
virtualenv --no-site-packages --distribute --python=python2 venv_14
. venv_14/bin/activate
pip install Django==1.4 coverage python-memcached six
virtualenv --no-site-packages --distribute --python=python2.7 .venv_15
. .venv_15/bin/activate
pip install --use-mirrors Django==1.5 coverage python-memcached six requests==2.1.0 polib==1.0.4 microsofttranslator==0.5
deactivate
fi
if [ ! -d venv_15 ]
if [ ! -d .venv_15_p3 ]
then
virtualenv --no-site-packages --distribute --python=python2 venv_15
. venv_15/bin/activate
pip install Django==1.5 coverage python-memcached six
virtualenv --no-site-packages --distribute --python=python3 .venv_15_p3
. .venv_15_p3/bin/activate
pip install --use-mirrors Django==1.5 coverage python3-memcached six requests==2.1.0 polib==1.0.4 microsofttranslator==0.5
deactivate
fi
if [ ! -d venv_15_p3 ]
if [ ! -d .venv_16 ]
then
virtualenv --no-site-packages --distribute --python=python3 venv_15_p3
. venv_15_p3/bin/activate
pip install Django==1.5 coverage python3-memcached six
virtualenv --no-site-packages --distribute --python=python2.7 .venv_16
. .venv_16/bin/activate
pip install --use-mirrors coverage python-memcached six Django==1.6.1 requests==2.1.0 polib==1.0.4 microsofttranslator==0.5
deactivate
fi
if [ ! -d .venv_16_p3 ]
then
virtualenv --no-site-packages --distribute --python=python3 .venv_16_p3
. .venv_16_p3/bin/activate
pip install --use-mirrors coverage python3-memcached six Django==1.6.1 requests==2.1.0 polib==1.0.4 microsofttranslator==0.5
deactivate
fi
if [ ! -d .venv_17b ]
then
virtualenv --no-site-packages --distribute --python=python2.7 .venv_17b
. .venv_17b/bin/activate
pip install https://www.djangoproject.com/download/1.7.b4/tarball/
pip install --use-mirrors coverage python-memcached six requests==2.1.0 polib==1.0.4 microsofttranslator==0.5
deactivate
fi
if [ ! -d .venv_17b_p3 ]
then
virtualenv --no-site-packages --distribute --python=python3 .venv_17b_p3
. .venv_17b_p3/bin/activate
pip install https://www.djangoproject.com/download/1.7.b4/tarball/
pip install --use-mirrors coverage python3-memcached six requests==2.1.0 polib==1.0.4 microsofttranslator==0.5
deactivate
fi
. venv_13/bin/activate
cd testproject
python manage.py --version
python manage.py test rosetta
cd ..
deactivate
. venv_14/bin/activate
cd testproject
python manage.py --version
python manage.py test rosetta
cd ..
deactivate
. venv_15/bin/activate
cd testproject
python manage.py --version
python manage.py test rosetta
cd ..
deactivate
. venv_15_p3/bin/activate
. .venv_14/bin/activate
cd testproject
python manage.py --version
python --version
@ -60,3 +61,53 @@ python manage.py test rosetta
cd ..
deactivate
. .venv_15/bin/activate
cd testproject
python manage.py --version
python --version
python manage.py test rosetta
cd ..
deactivate
. .venv_15_p3/bin/activate
cd testproject
python manage.py --version
python --version
python manage.py test rosetta
cd ..
deactivate
. .venv_16/bin/activate
cd testproject
python manage.py --version
python --version
python manage.py test rosetta
cd ..
deactivate
. .venv_16_p3/bin/activate
cd testproject
python manage.py --version
python --version
python manage.py test rosetta
cd ..
deactivate
. .venv_17b/bin/activate
cd testproject
python manage.py --version
python --version
python manage.py test rosetta
cd ..
deactivate
. .venv_17b_p3/bin/activate
cd testproject
python manage.py --version
python --version
python manage.py test rosetta
cd ..
deactivate
# Check translations
for d in `find rosetta -name LC_MESSAGES -type d`; do msgfmt -c -o $d/django.mo $d/django.po; done

View file

@ -18,11 +18,17 @@ setup(
'Topic :: Software Development :: Localization',
'Topic :: Software Development :: Internationalization',
'Framework :: Django',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.3',
],
include_package_data=True,
zip_safe=False,
install_requires=[
'six >=1.2.0',
'Django >= 1.3'
'Django >= 1.3',
'requests >= 2.1.0',
'polib == 1.0.4',
'microsofttranslator == 0.5'
]
)

View file

@ -0,0 +1,34 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-04-30 14:37+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: templates/test.html:3
msgid "Some text to translate"
msgstr ""
#: templates/test.html:5
#, python-format
msgid ""
"\n"
"one bottle of beer on the wall\n"
msgid_plural ""
"\n"
"%(num_bottles)s bottles of beer on the wall\n"
msgstr[0] ""
msgstr[1] ""

View file

@ -0,0 +1,34 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-04-30 14:37+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: templates/test.html:3
msgid "Some text to translate"
msgstr ""
#: templates/test.html:5
#, python-format
msgid ""
"\n"
"one bottle of beer on the wall\n"
msgid_plural ""
"\n"
"%(num_bottles)s bottles of beer on the wall\n"
msgstr[0] ""
msgstr[1] ""

View file

@ -2,617 +2,66 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#
msgid ""
msgstr ""
"Project-Id-Version: Rosetta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-10-21 12:21+0200\n"
"POT-Creation-Date: 2013-04-30 14:37+0200\n"
"PO-Revision-Date: 2012-05-27 14:59\n"
"Last-Translator: <admin@admin.com>\n"
"Language-Team: French <LL@li.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2)\n"
"X-Translated-Using: django-rosetta 0.6.7\n"
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 1"
msgstr "aaa"
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 2"
msgstr "111"
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 3"
msgstr "asdasd"
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 4"
msgstr "aa"
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 5"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 6"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 7"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 8"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 9"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 10"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 11"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 12"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 13"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 14"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 15"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 16"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 17"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 18"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 19"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 20"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 21"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 22"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 23"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 24"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 25"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 26"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 27"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 28"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 29"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 30"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 31"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 32"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 33"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 34"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 35"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 36"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 37"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 38"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 39"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 40"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 41"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 42"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 43"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 44"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 45"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 46"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 47"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 48"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 49"
msgstr ""
msgid ""
"0_81EhfRiLPoxAH5j3f1D2P33S_-"
"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 50"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 1"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 2"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 3"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 4"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 5"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 6"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 7"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 8"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 9"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 10"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 11"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 12"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 13"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 14"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 15"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 16"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 17"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 18"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 19"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 20"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 21"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 22"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 23"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 24"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 25"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 26"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 27"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 28"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 29"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 30"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 31"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 32"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 33"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 34"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 35"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 36"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 37"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 38"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 39"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 40"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 41"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 42"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 43"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 44"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 45"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 46"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 47"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 48"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 49"
msgstr ""
msgid ""
"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 50"
msgstr "aaa2"
#: templates/test.html:3
msgid "Some text to translate"
msgstr ""
#: templates/test.html:5
#, python-format
msgid ""
"\n"
"one bottle of beer on the wall\n"
msgid_plural ""
"\n"
"%(num_bottles)s bottles of beer on the wall\n"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#~ msgid ""
#~ "0_81EhfRiLPoxAH5j3f1D2P33S_-"
#~ "Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
#~ "kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 1"
#~ msgstr "aaa"
#~ msgid ""
#~ "0_81EhfRiLPoxAH5j3f1D2P33S_-"
#~ "Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
#~ "kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 2"
#~ msgstr "111"
#~ msgid ""
#~ "0_81EhfRiLPoxAH5j3f1D2P33S_-"
#~ "Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
#~ "kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 3"
#~ msgstr "asdasd"
#~ msgid ""
#~ "0_81EhfRiLPoxAH5j3f1D2P33S_-"
#~ "Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-"
#~ "kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 4"
#~ msgstr "aa"
#~ msgid ""
#~ "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-"
#~ "aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-"
#~ "qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String "
#~ "50"
#~ msgstr "aaa2"

View file

@ -1,16 +1,26 @@
#!/usr/bin/env python
from django.core.management import execute_manager
import sys
import os
try:
import settings # Assumed to be in the same directory.
from django.core.management import execute_manager
OLD_DJANGO = True
except ImportError:
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
sys.exit(1)
from django.core.management import execute_from_command_line
OLD_DJANGO = False
if OLD_DJANGO:
try:
import settings # Assumed to be in the same directory.
except ImportError:
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
sys.exit(1)
BASEDIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.insert(0, BASEDIR)
if __name__ == "__main__":
execute_manager(settings)
os.environ["DJANGO_SETTINGS_MODULE"] = "testproject.settings"
if OLD_DJANGO:
execute_manager(settings)
else:
execute_from_command_line(sys.argv)

View file

@ -47,10 +47,14 @@ INSTALLED_APPS = [
LANGUAGE_CODE = "en"
LANGUAGES = (
('en', 'English'),
('ja', u'日本語'),
('xx', u'XXXXX'),
('fr', u'French'),
('fr_FR.utf8', u'French (France), UTF8'),
)
LOCALE_PATHS = [
os.path.join(PROJECT_PATH, 'locale'),
]
SOUTH_TESTS_MIGRATE = False

View file

@ -0,0 +1,9 @@
{% load i18n %}
{% trans "Some text to translate" %}
{% blocktrans %}
one bottle of beer on the wall
{% plural %}
{{num_bottles}} bottles of beer on the wall
{% endblocktrans %}