i18:合并来自多个依赖项的本地化文件

时间:2018-02-22 09:00:16

标签: java spring localization dependencies

在我的Spring项目中,我有一个需要本地化的资源。该项目由base包和多个附加包组成,这些包可以相互构建。最后,我有一个主项目,它只是声明所有必需的依赖项(base模块是必需的。)

需要翻译的资源是日记活动ID。每个模块都依赖于自己定义日志事件。这意味着每个模块最终都会有journal_messages个翻译属性。

main
|_ dependencies
    |
    |-moduleA
    |     |_`journal_messages_de.properties`
    |     |_`journal_messages_en.properties`
    |
    |-moduleB
          |_`journal_messages_de.properties`
          |_`journal_messages_en.properties`

在主项目中,我终于需要访问所有这些文件。 当我与Spring合作时,我尝试了以下方法:

我的base模块创建了ResourceBundleMessageSource bean:

@Bean
public ResourceBundleMessageSource journalMessageSource() {
    ResourceBundleMessageSource source = new ResourceBundleMessageSource();
    source.setBasename("classpath:com/project/base/i18/journal/journal_messages");
    source.setUseCodeAsDefaultMessage(true);
    return source;
}

并在main\resources\com\project\base\i18\journal

中拥有自己的文件

在我的其他模块中,我创建了一个配置文件来添加该模块的特定基本名称。

@Autowired
public void addResources(ResourceBundleMessageSource journalMessageSource) {
    journalMessageSource.addBasenames("classpath:com/project/moduleA/i18/journal/journal_messages");
}

main\resources\com\project\moduleA\i18\journal

中拥有自己的文件

通过这种方式,我预计每个模块都会将自己的本地化文件加载到共享的ResourceBundleMessageSource bean。 Altought导致

ResourceBundle [com/project/moduleA/i18/journal/journal_messages] not found for MessageSource

如何访问/使用分割为多个依赖项的本地化文件?

1 个答案:

答案 0 :(得分:0)

我现在找到了以下解决方案:

我实际上是从上面的配置。我使用main

修复了maven-dependency-plugin项目中的问题
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.0.2</version>
    <executions>
        <!-- unpacks i18 resources to be used by the main project -->
        <execution>
            <id>unpack-backend-resources</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>com.project</groupId>
                        <artifactId>moduleA</artifactId>
                    </artifactItem>
                </artifactItems>              
                <overWrite>true</overWrite>
                <outputDirectory>${project.build.directory}/classes</outputDirectory>
                <excludes>**/*.class</excludes>
                <includes>**/i18n/**/*.properties</includes>
            </configuration>
        </execution>
    </executions>
</plugin>

这不是很方便,因为我需要将每个模块声明为artefactItem,但它有效。它会将每个依赖项的翻译文件复制到main项目。在找到更好的解决方案之前,我们必须这样做。