ftw.recipe.translations provides mass theese features:
bin/i18n-build: Package rebuilding script for installing in a single package.
bin/masstranslate: export / import of translations into / from Google Docs spreadsheets for letting translators translate in a better environment.
Table of Contents
i18n-build script is installed for a single package.
When executed, all languages of all domains translated in this package are rebuilt.
The script expectes exactly one primary domain. The domain name is expected to be equal to the package name (configurable).
What the script does:
- The script rebuilds the primary package using i18ndude: it scans for translated strings in the code and rebuilds the .pot of the primary domain.
- It syncs the .po-files of all domains in all languages.
For installation simply use the zc.buildout recipe
[buildout] parts = i18n-build [i18n-build] recipe = ftw.recipe.translations:package package-name = my.package
- The setuptools-name of the package (required).
- The name of the primary domain of this package (optional, defaults to the package name).
- The package namespace used for scanning the code when rebuilding the primary domain (optional, defaults to the the package name).
[buildout] parts = i18n-build [i18n-build] recipe = ftw.recipe.translations:package package-name = MyPackage i18n-domain = mypackage package-namespace = my.package
Rebuilding and syncing all existing languages:
$ bin/i18n-build Rebuilding .../my/package/locales/mypackage.pot .../my/package/locales/de/LC_MESSAGES/mypackage.po: 0 added, 2 removed .../my/package/locales/en/LC_MESSAGES/mypackage.po: 1 added, 2 removed .../my/package/locales/de/LC_MESSAGES/plone.po: 1 added .../my/package/locales/en/LC_MESSAGES/plone.po: 1 added
Creating translations (.po-files) for new languages:
$ bin/i18n-build fr it Rebuilding .../my/package/locales/mypackage.pot .../my/package/locales/de/LC_MESSAGES/mypackage.po: 0 added, 2 removed .../my/package/locales/en/LC_MESSAGES/mypackage.po: 1 added, 2 removed .../my/package/locales/fr/LC_MESSAGES/mypackage.po: 80 added, 0 removed .../my/package/locales/it/LC_MESSAGES/mypackage.po: 80 added, 0 removed .../my/package/locales/de/LC_MESSAGES/plone.po: 1 added .../my/package/locales/en/LC_MESSAGES/plone.po: 1 added .../my/package/locales/fr/LC_MESSAGES/plone.po: 3 added, 0 removed .../my/package/locales/it/LC_MESSAGES/plone.po: 3 added, 0 removed
masstranslate script is installed in a buildout which checks out
all relevant packages into an
src-directory (e.g. using
You then can upload all translations of all packages in the source-directory into a Googlea spreadsheet for translation. When the translation is done in the Google spreadsheet the script can download all translations and sync them back to the right place in the packages.
Using the buildout recipe generates a script
[buildout] parts = translations [translations] recipe = ftw.recipe.translations [masstranslate] spreadsheet = https://docs.google.com/spreadsheet/ccc?key=0AgoYEZSDYCg1dEZvVGFTRUc3RDd6123DAFDER
bin/masstranslate script is preconfigured with the
spreadsheet url and applies to all .po-files in the
./src directory by default.
Google auth is implemented using OAuth2.
This means you require to have an application set up in your
Google API Console or at least have the application secrets (.json) of such
The application secrets need to be copied to
For instructions for creating a Google application see the
When using the
download commands, the OAuth2 authentication
is done with the configure application.
The browser is opened and the user can grant access for the application
to his Google Drive.
The received ticket is stored in the users keyring / keychain.
If the server in your running this script do not have a web browser (for instance
you are running it in a shared computer logged-in through SSH), the browser
that pops-up is unable to handle the authorization process or if you prefer
to authorize the application using your own web browser; add the
--noauth_local_webserver=True parameter to the script. Using this option the
script will show a URL which you should open with your browser manualy, and later
enter the authorization code showed in that browser back in the console.
bin/masstranslate script provides a
sync command for rebuilding
primary-domain .pot-files and syncing them with all languages.
As primary domain the package name (folder in the
src directory) is
Primary domains are rebuilt (the package is searched for translatable
[domain]-manual.pot-files in the
directory are automatically merged.
Non-primary domains are never rebuilt and expected to be updated manually.
All domains are then sync to all existing languages.
Creating new languages for all packages and domains is as easy as passing a positional argument:
./bin/masstranslate sync de
With the upload command translations can easily be extracted from the
.po-Files and uploaded into a Google spreadsheet.
upload command always creates a new worksheet in the Google spreadsheet,
so that existing data is never overwritten.
Configuration section on how to configure the spreadsheet URL.
With positional arguments the languages to be translated can be specificied.
Each defined language is included in the spreadsheet.
If a message is translated in all languages, the message is not uploaded
--all keyword is used.
Additional languages, which are not checked for existing translations, can
be added using the
--additional-languages keyword, those may be useful
for the translator.
./bin/masstranslate upload de fr --additional-languages en es Spreadsheet: https://docs.google.com/spreadsheet/ccc?key=0AgoYEZ.... Loading translations Starting Upload 1 of 191 (0%): Upload 9 of 191 (4%): Upload ... Finished Upload Uploaded into worksheet "013: 2014-01-31"
The download command syncs translations back from the spreadsheet into the
.po-files in the source directory.
When starting a download, the user is asked for the worksheet and languages
When a message is not translated in the spreadsheet, it is never updated
in the .po-file.
./bin/masstranslate download Please select a worksheet to download:  011: 2014-01-31  012: 2014-01-31  013: 2014-01-31 Please enter the spreadsheet number: 1 Please select the languages to synchronize: - de - fr Enter one language code at a time, finish selection with an empty enter. Language: fr Language:
The syncing commands remove the .po-file header Domain, Language-Name and Language-Code. The reason for this behavior is that this package is primarely made for Plone packages and Plone does not read those headers (it gets the information from the paths, e.g. locales/[lang-code]/LC_MESSAGES/[domain].po). Because the headers are not relevant they are often not maintained properly and therefore usually wrong.
- github project: https://github.com/4teamwork/ftw.recipe.translations
- Issues: https://github.com/4teamwork/ftw.recipe.translations/issues
- Pypi: http://pypi.python.org/pypi/ftw.recipe.translations
- Continuous integration: https://jenkins.4teamwork.ch/search?q=ftw.recipe.translations
This package is copyright by 4teamwork.
ftw.recipe.translations is licensed under GNU General Public License, version 2.