Available since Sonar 2.10
This page gives guidelines to I18n for:
Although the basics of the i18n mechanism are the same for every part of the ecosystem, the packaging differs if you want to apply this mechanism to the Sonar core platform or to a plugin:
- Making the Sonar core platform available in a new language requires to develop and publish a new Language Pack plugin. By default Sonar embeds the English Pack. All other Language Pack plugins, like the French Pack plugin, are hosted in the plugins forge (https://svn.codehaus.org/sonar-plugins/trunk/l10n/), are maintained by the community and are available through Update Center (category "Localization").
- This is different for plugins, each plugin is in charge to embed its own translations. Of course supporting i18n mechanism is not mandatory for a plugin but in that case it will only be available in the default implemented language.
|To sum up|
There are 2 types of files for localized messages:
- These are regular properties files with key/value pairs where you will put most translations
- These files must be stored in the package "org.sonar.l10n" (usually in the directory src/main/resources/org/sonar/l10n)
- The name of these files must respect the convention "<plugin key>_<language>.properties", for example "technicaldebt_fr.properties"
Messages accept arguments. Such entries would look like:
- They are used for rule descriptions, which might be long and need HTML tags
- These files must be stored in the package org.sonar.l10n.<plugin key>_<language>, for example org.sonar.l10n.checkstyle_fr
- The name of these files must be the key of the rule they translate
- E.g.: the French description of the Squid Architectural Constraint rule is "src/main/resources/org/sonar/i18n/squidjava_fr/ArchitecturalConstraint.html"
In the Java API, properties files are supposed to be encoded in ISO-8859 charset. Without good tooling, this can be quite annoying to write translation for languages that do not fit in this charset.
Naming conventions for keys
Here are the conventions you have to know about keys :
Name of notification channel
Subscription to notification channel
Description of rule parameter
Description of widget property
Any other widget message
Page names shown in the left sidebar
Any other keys used in a page
Category name of properties, since 2.11
Property name, since 2.11
Property description, since 2.11
Any other keys used by plugin
How to use localized messages ?
Ruby on Rails API
This API is used when implementing Ruby widgets or pages. It's really simple, a single method must be used :
Options are :
:defaultis the default value when the property key does not exist in bundles. If it's not set, then the key itself is returned.
:paramsis an array of string message arguments.
Of course the Rails framework provides other formatting methods like :
GWT provides its own mechanisms to internationalize components. The static technique is the most efficient and must be used into Sonar GWT extensions. Read the Google documentation for more details.
org.sonar.api.i18n.I18n is available for server extensions. Batch extensions are not supported yet and can not load bundles.
How to contribute
How to localize a plugin
A plugin can embed its own bundles, for example to translate the labels used in its web extensions. Bundles must be added to src/main/resources with the following convention names :
- Standard messages : org/sonar/l10n/<plugin key>_<language>.properties
- Rule descriptions : org/sonar/l10n/<plugin key>_<language>/*.html
The english bundle is mandatory. For example the plugin with key "technicaldebt" must define the following files in order to enable the french bundle :
How to create a language pack
A language pack defines bundles for the whole Sonar distribution.
To create a new pack, it's recommended to copy the English bundles and to adapt them to the new language.
The language pack plugin must be executed in the same classloader than the English pack, so the property "basePlugin" must be set to "l10nen" into the configuration of sonar-packaging-maven-plugin (see example).