Class TranslationCheck

All Implemented Interfaces:
Configurable, Contextualizable, FileSetCheck

public class TranslationCheck extends AbstractFileSetCheck

Ensures the correct translation of code by checking property files for consistency regarding their keys. Two property files describing one and the same context are consistent if they contain the same keys. TranslationCheck also can check an existence of required translations which must exist in project, if requiredTranslations option is used.

Consider the following properties file in the same directory:

 #messages.properties
 hello=Hello
 cancel=Cancel

 #messages_de.properties
 hell=Hallo
 ok=OK
 

The Translation check will find the typo in the German hello key, the missing ok key in the default resource file and the missing cancel key in the German resource file:

 messages_de.properties: Key 'hello' missing.
 messages_de.properties: Key 'cancel' missing.
 messages.properties: Key 'hell' missing.
 messages.properties: Key 'ok' missing.
 

Language code for the property requiredTranslations is composed of the lowercase, two-letter codes as defined by ISO 639-1. Default value is empty String Set which means that only the existence of default translation is checked. Note, if you specify language codes (or just one language code) of required translations the check will also check for existence of default translation files in project.

Attention: the check will perform the validation of ISO codes if the option is used. So, if you specify, for example, "mm" for language code, TranslationCheck will rise violation that the language code is incorrect.

Attention: this Check could produce false-positives if it is used with Checker that use cache (property "cacheFile") This is known design problem, will be addressed at issue.

  • Property fileExtensions - Specify file type extension to identify translation files. Setting this property is typically only required if your translation files are preprocessed and the original files do not have the extension .properties Type is java.lang.String[]. Default value is .properties.
  • Property baseName - Specify Base name of resource bundles which contain message resources. It helps the check to distinguish config and localization resources. Type is java.util.regex.Pattern. Default value is "^messages.*$".
  • Property requiredTranslations - Specify language codes of required translations which must exist in project. Type is java.lang.String[]. Default value is "".

To configure the check to check only files which have '.properties' and '.translations' extensions:

 <module name="Translation">
   <property name="fileExtensions" value="properties, translations"/>
 </module>
 

Note, that files with the same path and base name but which have different extensions will be considered as files that belong to different resource bundles.

An example of how to configure the check to validate only bundles which base names start with "ButtonLabels":

 <module name="Translation">
   <property name="baseName" value="^ButtonLabels.*$"/>
 </module>
 

To configure the check to check existence of Japanese and French translations:

 <module name="Translation">
   <property name="requiredTranslations" value="ja, fr"/>
 </module>
 

The following example shows how the check works if there is a message bundle which element name contains language code, county code, platform name. Consider that we have the below configuration:

 <module name="Translation">
   <property name="requiredTranslations" value="es, fr, de"/>
 </module>
 

As we can see from the configuration, the TranslationCheck was configured to check an existence of 'es', 'fr' and 'de' translations. Lets assume that we have the resource bundle:

 messages_home.properties
 messages_home_es_US.properties
 messages_home_fr_CA_UNIX.properties
 

Than the check will rise the following violation: "0: Properties file 'messages_home_de.properties' is missing."

Parent is com.puppycrawl.tools.checkstyle.Checker

Violation Message Keys:

  • translation.missingKey
  • translation.missingTranslationFile
Since:
3.0
  • Field Details

    • MSG_KEY

      public static final String MSG_KEY
      A key is pointing to the warning message text for missing key in "messages.properties" file.
      See Also:
    • MSG_KEY_MISSING_TRANSLATION_FILE

      public static final String MSG_KEY_MISSING_TRANSLATION_FILE
      A key is pointing to the warning message text for missing translation file in "messages.properties" file.
      See Also:
    • TRANSLATION_BUNDLE

      private static final String TRANSLATION_BUNDLE
      Resource bundle which contains messages for TranslationCheck.
      See Also:
    • WRONG_LANGUAGE_CODE_KEY

      private static final String WRONG_LANGUAGE_CODE_KEY
      A key is pointing to the warning message text for wrong language code in "messages.properties" file.
      See Also:
    • DEFAULT_TRANSLATION_REGEXP

      private static final String DEFAULT_TRANSLATION_REGEXP
      Regexp string for default translation files. For example, messages.properties.
      See Also:
    • LANGUAGE_COUNTRY_VARIANT_PATTERN

      private static final Pattern LANGUAGE_COUNTRY_VARIANT_PATTERN
      Regexp pattern for bundles names which end with language code, followed by country code and variant suffix. For example, messages_es_ES_UNIX.properties.
    • LANGUAGE_COUNTRY_PATTERN

      private static final Pattern LANGUAGE_COUNTRY_PATTERN
      Regexp pattern for bundles names which end with language code, followed by country code suffix. For example, messages_es_ES.properties.
    • LANGUAGE_PATTERN

      private static final Pattern LANGUAGE_PATTERN
      Regexp pattern for bundles names which end with language code suffix. For example, messages_es.properties.
    • DEFAULT_TRANSLATION_FILE_NAME_FORMATTER

      private static final String DEFAULT_TRANSLATION_FILE_NAME_FORMATTER
      File name format for default translation.
      See Also:
    • FILE_NAME_WITH_LANGUAGE_CODE_FORMATTER

      private static final String FILE_NAME_WITH_LANGUAGE_CODE_FORMATTER
      File name format with language code.
      See Also:
    • REGEXP_FORMAT_TO_CHECK_REQUIRED_TRANSLATIONS

      private static final String REGEXP_FORMAT_TO_CHECK_REQUIRED_TRANSLATIONS
      Formatting string to form regexp to validate required translations file names.
      See Also:
    • REGEXP_FORMAT_TO_CHECK_DEFAULT_TRANSLATIONS

      private static final String REGEXP_FORMAT_TO_CHECK_DEFAULT_TRANSLATIONS
      Formatting string to form regexp to validate default translations file names.
      See Also:
    • log

      private final org.apache.commons.logging.Log log
      Logger for TranslationCheck.
    • filesToProcess

      private final Set<File> filesToProcess
      The files to process.
    • baseName

      private Pattern baseName
      Specify Base name of resource bundles which contain message resources. It helps the check to distinguish config and localization resources.
    • requiredTranslations

      private Set<String> requiredTranslations
      Specify language codes of required translations which must exist in project.
  • Constructor Details

    • TranslationCheck

      public TranslationCheck()
      Creates a new TranslationCheck instance.
  • Method Details

    • setBaseName

      public void setBaseName(Pattern baseName)
      Setter to specify Base name of resource bundles which contain message resources. It helps the check to distinguish config and localization resources.
      Parameters:
      baseName - base name regexp.
    • setRequiredTranslations

      public void setRequiredTranslations(String... translationCodes)
      Setter to specify language codes of required translations which must exist in project.
      Parameters:
      translationCodes - a comma separated list of language codes.
    • validateUserSpecifiedLanguageCodes

      private void validateUserSpecifiedLanguageCodes(Set<String> languageCodes)
      Validates the correctness of user specified language codes for the check.
      Parameters:
      languageCodes - user specified language codes for the check.
      Throws:
      IllegalArgumentException - when any item of languageCodes is not valid language code
    • isValidLanguageCode

      private static boolean isValidLanguageCode(String userSpecifiedLanguageCode)
      Checks whether user specified language code is correct (is contained in available locales).
      Parameters:
      userSpecifiedLanguageCode - user specified language code.
      Returns:
      true if user specified language code is correct.
    • beginProcessing

      public void beginProcessing(String charset)
      Description copied from interface: FileSetCheck
      Called when about to be called to process a set of files.
      Specified by:
      beginProcessing in interface FileSetCheck
      Overrides:
      beginProcessing in class AbstractFileSetCheck
      Parameters:
      charset - the character set used to read the files.
    • processFiltered

      protected void processFiltered(File file, FileText fileText)
      Description copied from class: AbstractFileSetCheck
      Called to process a file that matches the specified file extensions.
      Specified by:
      processFiltered in class AbstractFileSetCheck
      Parameters:
      file - the file to be processed
      fileText - the contents of the file.
    • finishProcessing

      public void finishProcessing()
      Description copied from interface: FileSetCheck
      Called when all the files have been processed. This is the time to perform any checks that need to be done across a set of files. In this method, the implementation is responsible for the logging of violations.
      Specified by:
      finishProcessing in interface FileSetCheck
      Overrides:
      finishProcessing in class AbstractFileSetCheck
    • checkExistenceOfDefaultTranslation

      private void checkExistenceOfDefaultTranslation(TranslationCheck.ResourceBundle bundle)
      Checks an existence of default translation file in the resource bundle.
      Parameters:
      bundle - resource bundle.
    • checkExistenceOfRequiredTranslations

      private void checkExistenceOfRequiredTranslations(TranslationCheck.ResourceBundle bundle)
      Checks an existence of translation files in the resource bundle. The name of translation file begins with the base name of resource bundle which is followed by '_' and a language code (country and variant are optional), it ends with the extension suffix.
      Parameters:
      bundle - resource bundle.
    • getMissingFileName

      private static Optional<String> getMissingFileName(TranslationCheck.ResourceBundle bundle, String languageCode)
      Returns the name of translation file which is absent in resource bundle or Guava's Optional, if there is not missing translation.
      Parameters:
      bundle - resource bundle.
      languageCode - language code.
      Returns:
      the name of translation file which is absent in resource bundle or Guava's Optional, if there is not missing translation.
    • logMissingTranslation

      private void logMissingTranslation(String filePath, String fileName)
      Logs that translation file is missing.
      Parameters:
      filePath - file path.
      fileName - file name.
    • groupFilesIntoBundles

      private static Set<TranslationCheck.ResourceBundle> groupFilesIntoBundles(Set<File> files, Pattern baseNameRegexp)
      Groups a set of files into bundles. Only files, which names match base name regexp pattern will be grouped.
      Parameters:
      files - set of files.
      baseNameRegexp - base name regexp pattern.
      Returns:
      set of ResourceBundles.
    • findBundle

      Searches for specific resource bundle in a set of resource bundles.
      Parameters:
      bundles - set of resource bundles.
      targetBundle - target bundle to search for.
      Returns:
      Guava's Optional of resource bundle (present if target bundle is found).
    • extractBaseName

      private static String extractBaseName(String fileName)
      Extracts the base name (the unique prefix) of resource bundle from translation file name. For example "messages" is the base name of "messages.properties", "messages_de_AT.properties", "messages_en.properties", etc.
      Parameters:
      fileName - the fully qualified name of the translation file.
      Returns:
      the extracted base name.
    • getPath

      private static String getPath(String fileNameWithPath)
      Extracts path from a file name which contains the path. For example, if the file name is /xyz/messages.properties, then the method will return /xyz/.
      Parameters:
      fileNameWithPath - file name which contains the path.
      Returns:
      file path.
    • checkTranslationKeys

      private void checkTranslationKeys(TranslationCheck.ResourceBundle bundle)
      Checks resource files in bundle for consistency regarding their keys. All files in bundle must have the same key set. If this is not the case an audit event message is posted giving information which key misses in which file.
      Parameters:
      bundle - resource bundle.
    • checkFilesForConsistencyRegardingTheirKeys

      private void checkFilesForConsistencyRegardingTheirKeys(Map<File,Set<String>> fileKeys, Set<String> keysThatMustExist)
      Compares th the specified key set with the key sets of the given translation files (arranged in a map). All missing keys are reported.
      Parameters:
      fileKeys - a Map from translation files to their key sets.
      keysThatMustExist - the set of keys to compare with.
    • getTranslationKeys

      private Set<String> getTranslationKeys(File file)
      Loads the keys from the specified translation file into a set.
      Parameters:
      file - translation file.
      Returns:
      a Set object which holds the loaded keys.
    • logException

      private void logException(Exception exception, File file)
      Helper method to log an exception.
      Parameters:
      exception - the exception that occurred
      file - the file that could not be processed