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 depending on what you are developing:
|
There are two types of files for localized messages:
org.sonar.l10n package (usually in the src/main/resources/org/sonar/l10n directory)Messages accept arguments. Such entries would look like:
myplugin.foo=This is a message with 2 params: the first "{0}" and the second "{1}".
|
org.sonar.l10n.<plugin key>_<language> package.org.sonar.l10n.<key of the plugin to translate>_<language>.rules.<repository key> package (backward compatibility is ensured for l10n plugins which use the former location)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. |
Here are the conventions you have to know about keys:
Key | Description | Example |
|---|---|---|
| Metric name |
|
| Metric description |
|
| Name of notification channel |
|
| Subscription to notification channel |
|
| Rule name |
|
| Description of rule parameter |
|
dashboard.<key>.name | Dashboard name, since 2.14. | dashboard.Hotstpots.name=Point Chauds |
| Qualifier name, since 2.13. |
|
| Widget name |
|
| Widget description |
|
widget.<key>.property.<property key>.name | Name of widget property | widget.hotspot_most_violated_rules.property.defaultSeverity.name=Default severity |
widget.<key>.property.<property key>.desc | Description of widget property | widget.hotspot_most_violated_rules.property.defaultSeverity.desc=If selected, |
widget.<key>.property.<property>.option.<option>.name | Name of item of dropdown list | |
| 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.category.<category key>.description | Short description of category of properties, since 3.6 | property.category.General.description=General properties of SonarQube |
property.category. | Subcategory name of properties, since 3.6 | property.category.exclusions.global=Global exclusions |
property.category. | Short description of subcategory of properties, since 3.6 | property.category.exclusions.global.description=Configuration of global exclusions |
| Property name, since 2.11 |
|
| Property description, since 2.11 |
|
| Any other keys used by plugin |
|
This API is used when implementing Ruby widgets or pages. It's really simple, a single method must be used :
message(property_key, options={})
|
Options are :
:default is the default value when the property key does not exist in bundles. If it's not set, then the key itself is returned.:params is an array of string message arguments.Examples :
message('cloud.size')
message('cloud.size', :default => 'Cloud')
message('with.arguments', :params => ['First', 'Two'])
message('with.arguments', :params => ['First', 'Two'], :default => 'Not found')
|
Of course the Rails framework provides other formatting methods like :
# localize dates or datetimes l(date_or_time) |
The component org.sonar.api.i18n.I18n is available for server extensions. Batch extensions are not supported yet and can not load bundles.
A Language Pack defines bundles for the SonarQubePlatform and for the SonarQube Community plugins.
The easiest way to create a new pack is to copy the French Pack and to adapt it to your language.
Set the versions of the plugins that you want to translate in the pom file:
<properties>
...
<!-- Versions of the plugins translated by this language pack -->
<bundle.abacus>0.1</bundle.abacus>
<bundle.branding>0.3</bundle.branding>
<bundle.core>3.4-RC3</bundle.core>
<bundle.javasquid>1.1</bundle.javasquid>
<bundle.jira>1.0</bundle.jira>
<bundle.motionchart>1.4</bundle.motionchart>
<bundle.squidjava>1.0</bundle.squidjava>
<bundle.violationdensity>1.2</bundle.violationdensity>
...
</properties>
|
To check the missing key, run:
mvn test |
If the build fails, it means that some keys are missing. Go to target/l10n to check the reports for each bundle.
Missing keys are listed under 'Missing translations are:'
Missing translations are: code_viewer.no_info_displayed_due_to_security=Due to security settings, no information can be displayed. comparison.version.latest=LATEST ... |
Each time you add a new bundle or you update an existing one, please create a JIRA ticket on the corresponding L10n component in order to track changes.
This part applies if you are developing a commercial / closed-source plugin, or an open-source plugin that is not part of the SonarSonarQube Community Plugins.
Such plugins must embed their own bundles. Bundles must be added to src/main/resources with the following convention names :
The default bundle is mandatory, and must be the English translation. For example the plugin with key "mysonarplugin" must define the following files in order to enable the French translation: