Addons

New in version 2.19.

Addons provide ways to customize translation workflow. You can install addons to your translation component and they will work behind the scenes. The addon management can be found under Manage menu of a translation component.

../_images/addons.png

Built in addons

Automatic translation

New in version 3.9.

This addon automatically translates strings using machine translation or other components.

Cleanup translation files

Update all translation files to match the monolingual base file. For most file formats, this means removing stale translation keys no longer present in the base file.

Language consistency

Ensure that all components within one project have translation to same languages. It will create empty translations for languages which are not present.

Missing languages are checked once in a 24 hours and when new language is being added in Weblate.

Unlike most others, this addon operates on whole project.

Hint

If you want to translate the strings as well, please look into Automatic translation.

Component discovery

This addon automatically adds or removes components to the project based on file changes in the version control system.

It is similar to the import_project management command, but the major difference is that it is triggered on every VCS update. This way you can easily track multiple translation components within one VCS.

To use component discovery, you first need to create one component which will act as master and others will use Weblate internal URLs to it as a VCS configuration. You should choose the one which is less likely to disappear in the future here.

Once you have one component from the target VCS, you can configure the discovery addon to find all translation components in the VCS. The matching is done using regular expression so it can be quite powerful, but it can be complex to configure. You can use examples in the addon help for some common use cases.

Once you hit save, you will be presented with a preview of matched components, so you can check whether the configuration actually matches your needs:

../_images/addon-discovery.png

See also

Template markup

Flag unchanged translations as “Needs editing”

New in version 3.1.

Whenever a new translatable string is imported from the VCS and it matches source strings, it is flagged as needing editing in Weblate. This is especially useful for file formats that include all strings even if they are not translated.

Flag new source strings as “Needs editing”

Whenever a new source string is imported from the VCS, it is flagged as needing editing in Weblate. This way you can easily filter and edit source strings written by the developers.

Flag new translations as “Needs editing”

Whenever a new translatable string is imported from the VCS, it is flagged as needing editing in Weblate. This way you can easily filter and edit translations created by the developers.

Statistics generator

This addon generates a file containing detailed information about the translation. You can use Django template in both filename and content, see Template markup for detailed markup description.

For example generating summary file for each translations:

Name of generated file
locale/{{ language_code }}.json
Content
{
   "language": "{{ language_code }}",
   "strings": "{{ stats.all }}",
   "translated": "{{ stats.translated }}",
   "last_changed": "{{ stats.last_changed }}",
   "last_author": "{{ stats.last_author }}",
}

See also

Template markup

Contributors in comment

Update comment in the PO file header to include contributor name and years of contributions.

Update ALL_LINGUAS variable in the “configure” file

Updates the ALL_LINGUAS variable in configure, configure.in or configure.ac files, when a new translation is added.

Customize gettext output

Allows customization of gettext output behavior, for example line wrapping.

It offers following options:

  • Wrap lines at 77 characters and at newlines
  • Only wrap lines at newlines
  • No line wrapping

Note

By default gettext wraps lines at 77 characters and newlines. With --no-wrap parameter, it wraps only at newlines.

Update LINGUAS file

Updates the LINGUAS file when a new translation is added.

Generate MO files

Automatically generates MO file for every changed PO file.

Update PO files to match POT (msgmerge)

Update all PO files to match the POT file using msgmerge. This is triggered whenever new changes are pulled from the upstream repository.

Squash Git commits

Squash Git commits prior to pushing changes. You can choose one of following modes:

  • All commits into one
  • Per language
  • Per file
  • Per author

Original commit messages are kept, but authorship is lost unless “Per author” is selected or the commit message is customized to include it.

Customize JSON output

Allows to customize JSON output behavior, for example indentation or sorting.

Formats the Java properties file

This addon sorts the Java properties file.

Stale comment removal

New in version 3.7.

Set timeframe for removal of comments. This can be useful to remove old comments which might have become outdated. Use with care as comment being old does not mean it has lost it’s importation.

Stale suggestion removal

New in version 3.7.

Set timeframe for removal of suggestions. This can be very useful in connection with suggestion voting (see Peer review) to remove suggestions which don’t receive enough positive votes until certain deadline.

Update RESX files

New in version 3.9.

Update all translation files to match the monolingual upstream base file. Unused strings are removed, and new ones are added as copies of the source string.

Hint

Use Cleanup translation files if you only want to remove stale translation keys.

Customizing list of addons

List of addons is configured by WEBLATE_ADDONS, to add another addon simply include class absolute name in this setting.

Writing addon

You can write own addons as well, all you need to do is subclass BaseAddon, define addon metadata and implement callback which will do the processing.

You can look at example addon for more information:

# -*- coding: utf-8 -*-
#
# Copyright © 2012 - 2019 Michal Čihař <michal@cihar.com>
#
# This file is part of Weblate <https://weblate.org/>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
#

from __future__ import unicode_literals

from django.utils.translation import ugettext_lazy as _

from weblate.addons.base import BaseAddon
from weblate.addons.events import EVENT_PRE_COMMIT


class ExampleAddon(BaseAddon):
    # Filter for compatible components, every key is
    # matched against property of component
    compat = {
        'file_format': frozenset((
            'po', 'po-mono',
        )),
    }
    # List of events addon should receive
    events = (EVENT_PRE_COMMIT,)
    # Addon unique identifier
    name = 'weblate.example.example'
    # Verbose name shown in the user interface
    verbose = _('Example addon')
    # Detailed addon description
    description = _('This addon does nothing it is just an example.')

    # Callback to implement custom behavior
    def pre_commit(self, translation, author):
        return

Executing scripts from addon

You can also use addons to execute external scripts. This used to be integrated in Weblate, but now you have to write little code to wrap your script with an addon.

# -*- coding: utf-8 -*-
#
# Copyright © 2012 - 2019 Michal Čihař <michal@cihar.com>
#
# This file is part of Weblate <https://weblate.org/>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
#
"""
Example pre commit script
"""

from __future__ import unicode_literals

from django.utils.translation import ugettext_lazy as _

from weblate.addons.events import EVENT_PRE_COMMIT
from weblate.addons.scripts import BaseScriptAddon


class ExamplePreAddon(BaseScriptAddon):
    # Event used to trigger the script
    events = (EVENT_PRE_COMMIT,)
    # Name of the addon, has to be unique
    name = 'weblate.example.pre'
    # Verbose name and long descrption
    verbose = _('Execute script before commit')
    description = _('This addon executes a script.')

    # Script to execute
    script = '/bin/true'
    # File to add in commit (for pre commit event)
    # does not have to be set
    add_file = 'po/{{ language_code }}.po'

For installing instructions see Custom addons.

The script is executed with the current directory set to the root of the VCS repository for given component.

Additionally, the following environment variables are available:

WL_VCS

Version control system used.

WL_REPO

Upstream repository URL.

WL_PATH

Absolute path to VCS repository.

WL_BRANCH

New in version 2.11.

Repository branch configured in the current component.

WL_FILEMASK

File mask for current component.

WL_TEMPLATE

File name of template for monolingual translations (can be empty).

WL_NEW_BASE

New in version 2.14.

File name of the file which is used for creating new translations (can be empty).

WL_FILE_FORMAT

File format used in current component.

WL_LANGUAGE

Language of currently processed translation (not available for component level hooks).

WL_PREVIOUS_HEAD

Previous HEAD on update (available only available when running post update hook).

WL_COMPONENT_SLUG

New in version 3.9.

Component slug used to contruct URL.

WL_PROJECT_SLUG

New in version 3.9.

Project slug used to contruct URL.

WL_COMPONENT_NAME

New in version 3.9.

Component name.

WL_PROJECT_NAME

New in version 3.9.

Project name.

WL_COMPONENT_URL

New in version 3.9.

Component URL

WL_ENGAGE_URL

New in version 3.9.

Project engage URL

Post update repository processing

Post update repository processing can be used to update translation files on the source change. To achieve this, please remember that Weblate only sees files which are committed to the VCS, so you need to commit changes as a part of the script.

For example with gulp you can do it using following code:

#! /bin/sh
gulp --gulpfile gulp-i18n-extract.js
git commit -m 'Update source strings' src/languages/en.lang.json

Pre commit processing of translations

In many cases you might want to automatically do some changes to the translation before it is committed to the repository. The pre commit script is exactly the place to achieve this.

It is passed a single parameter consisting of filename of current translation.