Make text translatable

In HTML or PHP wrap it like this <?php p($l→t('This is some text'));?> or this <?php print_unescaped($l→t('This is some text'));?> For the right date format use <?php p($l→l('date', time()));?>. Change the way dates are shown by editing /core/l10n/l10n-[lang].php To translate text in javascript use: t('appname','text to translate');

print_unescaped() should be preferred only if you would like to display HTML code. Otherwise, using p() is strongly preferred to escape HTML characters against XSS attacks.

You shall never split sentences!


Translators lose the context and they have no chance to possibly re-arrange words.


<?php p($l->t('Select file from')) . ' '; ?><a href='#' id="browselink"><?php p($l->t('local filesystem'));?></a><?php p($l->t(' or ')); ?><a href='#' id="cloudlink"><?php p($l->t('cloud'));?></a>

Translators will translate:

  • Select file from

  • local filesystem

  • ’ or "

  • cloud

Translating these individual strings results in local filesystem and cloud losing case. The two white spaces surrounding or will get lost while translating as well. For languages that have a different grammatical order it prevents the translators from reordering the sentence components.

Html in translation strings

Html tags can be kept out of translation strings like in the example below. Then the detail of the tags is uncoupled from the translation.

What about variables in the strings?

If you need to add variables to the translation strings do it like this:

$l->t('%1$s is available. Get %2$smore information%3$s', [$data['versionstring'], '<a href="' . $data['web']] . '">', '</a>');

When there are multiple substitutions, number them. Then the translators have the chance to re-order them if they need to translate the whole sentence in a different word order.

Automated synchronization of translations

Multiple nightly jobs have been setup in order to synchronize translations - it’s a multi-step process: perl read will rescan all php and javascript files and generate the templates. The templates are pushed to Transifex (tx push -s). All translations are pulled from Transifex (tx pull -a). perl write will write the php files containing the translations. Finally the changes are pushed to git.

Please follow the steps below to add translation support to your app:

Create a folder l10n. Create the file ignorelist which can contain files which shall not be scanned during step 4. Edit l10n/.tx/config and copy/past a config section and adopt it by changing the app/folder name. Run perl read with l10n Add the newly created translation template (l10n/Templates/<appname>.pot) to git and commit the changes above. After the next nightly sync job a new resource will appear on Transifex and from now on every night the latest translations will arrive.

Translation sync jobs:

Caution: information below is in general not needed!

Manual quick translation update:

cd l10n/ && perl read && tx push -s && tx pull -a && perl write && cd ..

The translation script requires Locale::PO, installable via apt-get install liblocale-po-perl

Configure transifex

tx init

for resource in calendar contacts core files media settings
tx set --auto-local -r owncloud.$resource "<lang>/$resource.po" --source-language=en \
 --source-file "templates/$resource.pot" --execute