public class TranslationCheck extends AbstractFileSetCheck
The TranslationCheck class helps to ensure the correct translation of code by checking locale-specific resource files for consistency regarding their keys. Two locale-specific resource 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.
An example of how to configure the check is:
<module name="Translation"/>Check has the following options:
baseName - a base name regexp for resource bundles which contain message resources. It helps the check to distinguish config and localization resources. Default value is ^messages.*$
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 only files which have '.properties' and '.translations' extensions:
<module name="Translation"> <property name="fileExtensions" value="properties, translations"/> </module>
requiredTranslations which allows to specify language codes of required translations
which must exist in project. Language code 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.
Modifier and Type | Class and Description |
---|---|
private static class |
TranslationCheck.ResourceBundle
Class which represents a resource bundle.
|
Modifier and Type | Field and Description |
---|---|
private java.util.regex.Pattern |
baseName
The base name regexp pattern.
|
private static java.lang.String |
DEFAULT_TRANSLATION_FILE_NAME_FORMATTER
File name format for default translation.
|
private static java.lang.String |
DEFAULT_TRANSLATION_REGEXP
Regexp string for default translation files.
|
private static java.lang.String |
FILE_NAME_WITH_LANGUAGE_CODE_FORMATTER
File name format with language code.
|
private java.util.Set<java.io.File> |
filesToProcess
The files to process.
|
private static java.util.regex.Pattern |
LANGUAGE_COUNTRY_PATTERN
Regexp pattern for bundles names wich end with language code, followed by country code
suffix.
|
private static java.util.regex.Pattern |
LANGUAGE_COUNTRY_VARIANT_PATTERN
Regexp pattern for bundles names wich end with language code, followed by country code and
variant suffix.
|
private static java.util.regex.Pattern |
LANGUAGE_PATTERN
Regexp pattern for bundles names wich end with language code suffix.
|
private static org.apache.commons.logging.Log |
LOG
Logger for TranslationCheck.
|
static java.lang.String |
MSG_KEY
A key is pointing to the warning message text for missing key
in "messages.properties" file.
|
static java.lang.String |
MSG_KEY_MISSING_TRANSLATION_FILE
A key is pointing to the warning message text for missing translation file
in "messages.properties" file.
|
private static java.lang.String |
REGEXP_FORMAT_TO_CHECK_DEFAULT_TRANSLATIONS
Formatting string to form regexp to validate default translations file names.
|
private static java.lang.String |
REGEXP_FORMAT_TO_CHECK_REQUIRED_TRANSLATIONS
Formatting string to form regexp to validate required translations file names.
|
private java.util.Set<java.lang.String> |
requiredTranslations
Language codes of required translations for the check (de, pt, ja, etc).
|
private static java.lang.String |
TRANSLATION_BUNDLE
Resource bundle which contains messages for TranslationCheck.
|
private static java.lang.String |
WRONG_LANGUAGE_CODE_KEY
A key is pointing to the warning message text for wrong language code
in "messages.properties" file.
|
Constructor and Description |
---|
TranslationCheck()
Creates a new
TranslationCheck instance. |
Modifier and Type | Method and Description |
---|---|
void |
beginProcessing(java.lang.String charset)
Called when about to be called to process a set of files.
|
private void |
checkExistenceOfDefaultTranslation(TranslationCheck.ResourceBundle bundle)
Checks an existence of default translation file in the resource bundle.
|
private void |
checkExistenceOfRequiredTranslations(TranslationCheck.ResourceBundle bundle)
Checks an existence of translation files in the resource bundle.
|
private void |
checkFilesForConsistencyRegardingTheirKeys(com.google.common.collect.SetMultimap<java.io.File,java.lang.String> fileKeys,
java.util.Set<java.lang.String> keysThatMustExist)
Compares th the specified key set with the key sets of the given translation files (arranged
in a map).
|
private void |
checkTranslationKeys(TranslationCheck.ResourceBundle bundle)
Checks resource files in bundle for consistency regarding their keys.
|
private static java.lang.String |
extractBaseName(java.lang.String fileName)
Extracts the base name (the unique prefix) of resource bundle from translation file name.
|
private static java.util.Optional<TranslationCheck.ResourceBundle> |
findBundle(java.util.Set<TranslationCheck.ResourceBundle> bundles,
TranslationCheck.ResourceBundle targetBundle)
Searches for specific resource bundle in a set of resource bundles.
|
void |
finishProcessing()
Called when all the files have been processed.
|
private static java.util.Optional<java.lang.String> |
getMissingFileName(TranslationCheck.ResourceBundle bundle,
java.lang.String languageCode)
Returns the name of translation file which is absent in resource bundle or Guava's Optional,
if there is not missing translation.
|
private static java.lang.String |
getPath(java.lang.String fileNameWithPath)
Extracts path from a file name which contains the path.
|
private java.util.Set<java.lang.String> |
getTranslationKeys(java.io.File file)
Loads the keys from the specified translation file into a set.
|
private static java.util.Set<TranslationCheck.ResourceBundle> |
groupFilesIntoBundles(java.util.Set<java.io.File> files,
java.util.regex.Pattern baseNameRegexp)
Groups a set of files into bundles.
|
private static boolean |
isValidLanguageCode(java.lang.String userSpecifiedLanguageCode)
Checks whether user specified language code is correct (is contained in available locales).
|
private void |
logIoException(java.io.IOException exception,
java.io.File file)
Helper method to log an io exception.
|
private void |
logMissingTranslation(java.lang.String filePath,
java.lang.String fileName)
Logs that translation file is missing.
|
protected void |
processFiltered(java.io.File file,
java.util.List<java.lang.String> lines)
Called to process a file that matches the specified file extensions.
|
void |
setBaseName(java.util.regex.Pattern baseName)
Sets the base name regexp pattern.
|
void |
setRequiredTranslations(java.lang.String... translationCodes)
Sets language codes of required translations for the check.
|
private void |
validateUserSpecifiedLanguageCodes(java.util.Set<java.lang.String> languageCodes)
Validates the correctness of user specified language codes for the check.
|
destroy, fireErrors, getFileExtensions, getMessageCollector, getMessageDispatcher, init, log, log, process, setFileExtensions, setMessageDispatcher
getCustomMessages, getId, getMessageBundle, getSeverity, getSeverityLevel, log, setId, setSeverity
configure, contextualize, finishLocalSetup, getConfiguration, setupChild
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
configure
contextualize
public static final java.lang.String MSG_KEY
public static final java.lang.String MSG_KEY_MISSING_TRANSLATION_FILE
private static final java.lang.String TRANSLATION_BUNDLE
private static final java.lang.String WRONG_LANGUAGE_CODE_KEY
private static final org.apache.commons.logging.Log LOG
private static final java.lang.String DEFAULT_TRANSLATION_REGEXP
private static final java.util.regex.Pattern LANGUAGE_COUNTRY_VARIANT_PATTERN
private static final java.util.regex.Pattern LANGUAGE_COUNTRY_PATTERN
private static final java.util.regex.Pattern LANGUAGE_PATTERN
private static final java.lang.String DEFAULT_TRANSLATION_FILE_NAME_FORMATTER
private static final java.lang.String FILE_NAME_WITH_LANGUAGE_CODE_FORMATTER
private static final java.lang.String REGEXP_FORMAT_TO_CHECK_REQUIRED_TRANSLATIONS
private static final java.lang.String REGEXP_FORMAT_TO_CHECK_DEFAULT_TRANSLATIONS
private final java.util.Set<java.io.File> filesToProcess
private java.util.regex.Pattern baseName
private java.util.Set<java.lang.String> requiredTranslations
public TranslationCheck()
TranslationCheck
instance.public void setBaseName(java.util.regex.Pattern baseName)
baseName
- base name regexp.public void setRequiredTranslations(java.lang.String... translationCodes)
translationCodes
- a comma separated list of language codes.private void validateUserSpecifiedLanguageCodes(java.util.Set<java.lang.String> languageCodes)
languageCodes
- user specified language codes for the check.private static boolean isValidLanguageCode(java.lang.String userSpecifiedLanguageCode)
userSpecifiedLanguageCode
- user specified language code.public void beginProcessing(java.lang.String charset)
FileSetCheck
beginProcessing
in interface FileSetCheck
beginProcessing
in class AbstractFileSetCheck
charset
- the character set used to read the files.protected void processFiltered(java.io.File file, java.util.List<java.lang.String> lines)
AbstractFileSetCheck
processFiltered
in class AbstractFileSetCheck
file
- the file to be processedlines
- an immutable list of the contents of the file.public void finishProcessing()
FileSetCheck
finishProcessing
in interface FileSetCheck
finishProcessing
in class AbstractFileSetCheck
private void checkExistenceOfDefaultTranslation(TranslationCheck.ResourceBundle bundle)
bundle
- resource bundle.private void checkExistenceOfRequiredTranslations(TranslationCheck.ResourceBundle bundle)
bundle
- resource bundle.private static java.util.Optional<java.lang.String> getMissingFileName(TranslationCheck.ResourceBundle bundle, java.lang.String languageCode)
bundle
- resource bundle.languageCode
- language code.private void logMissingTranslation(java.lang.String filePath, java.lang.String fileName)
filePath
- file path.fileName
- file name.private static java.util.Set<TranslationCheck.ResourceBundle> groupFilesIntoBundles(java.util.Set<java.io.File> files, java.util.regex.Pattern baseNameRegexp)
files
- set of files.baseNameRegexp
- base name regexp pattern.private static java.util.Optional<TranslationCheck.ResourceBundle> findBundle(java.util.Set<TranslationCheck.ResourceBundle> bundles, TranslationCheck.ResourceBundle targetBundle)
bundles
- set of resource bundles.targetBundle
- target bundle to search for.private static java.lang.String extractBaseName(java.lang.String fileName)
fileName
- the fully qualified name of the translation file.private static java.lang.String getPath(java.lang.String fileNameWithPath)
fileNameWithPath
- file name which contains the path.private void checkTranslationKeys(TranslationCheck.ResourceBundle bundle)
bundle
- resource bundle.private void checkFilesForConsistencyRegardingTheirKeys(com.google.common.collect.SetMultimap<java.io.File,java.lang.String> fileKeys, java.util.Set<java.lang.String> keysThatMustExist)
fileKeys
- a Map from translation files to their key sets.keysThatMustExist
- the set of keys to compare with.private java.util.Set<java.lang.String> getTranslationKeys(java.io.File file)
file
- translation file.private void logIoException(java.io.IOException exception, java.io.File file)
exception
- the exception that occurredfile
- the file that could not be processed