找不到 gettext-commons 资源包
gettext-commons Resource bundle not found
我正在翻译我的桌面 java 应用程序(在 windows 10 OS 上),所以我使用 http://code.google.com/p/gettext-commons[= 中的 gettext-common 16=]
我已经按照 gettext-common 提供的教程进行操作:https://code.google.com/archive/p/gettext-commons/wikis/Tutorial.wiki
按照所有步骤我创建 Messages_fr.class
,Messages_en.class
问题出在 gettext-common 他们有 Messages_en.properties 而不是 .class,当我创建 Messages_en.properties(手动)有效!而且我不能手动完成它会花很长时间(我有 700 多个句子)
JAVA代码:
static I18n i18n = I18nFactory.getI18n(ParserTest.class,
"resources.messages");
public static void main(String args[]) {
for (int i = 0; i < 2; i++) {
if (i == 0) {
print("First run");
} else {
print("Second run");
i18n.setLocale(Locale.FRANCE);
}
print("Current locale: " + i18n.getLocale());
print(i18n
.tr("This text is marked for translation and is translated"));
String mark = i18n
.marktr("This text is marked for translation but not translated");
print(mark);
print(i18n.tr(mark));
mark = i18n.tr("This is the {0}. text to be translated",
"chat (noun)");
print(mark);
mark = i18n.tr("This is the {0}. text to be translated",
"chat (verb)");
print(mark);
print(i18n.tr("chat (noun)"));
print(i18n.tr("chat (verb)"));
print("");
}
}
private static void print(String text) {
System.out.println(text);
}
我对此有疑问:
问题 1:我的消息文件位于 resources/Messages
目录下。它只包含 2 个文件:messages_en.class 和 messages_fr.class 而不是 messages_fr.properties 和 messages_en.properties.
如果我尝试 运行 上面的代码,我会收到警告:“ResourceBundle [messages],这是因为没有 .properties 文件
对于java ResourceBundle,存在两种不同的实现:
- *.properties 文件的 PropertyResourceBundle,众所周知,延迟部分加载
- ListResourceBundle,纯 java 代码,*.class,带数组,快速,完全加载(初始化时间,内存使用)。
从您的描述来看,gettext 桥似乎使用了 ListResourceBundle 或其自己的 ResourceBundle 实现。没关系。
如图所示msgfmt 从 gettext 文件 (.po) 创建一个 .class 资源文件。
gettext 进程从所有语言的模板、.pot 开始,然后是每种语言的 .po 文件。
他们关于使用 maven 的建议可能确实值得。
说了这么多,也许就是用Locale.FRENCH
我还看到了 Properties~ 和 ListResourceBundles 之间的区别:可以尝试 "resources/messages"
或注意正确的大小写(大写 M)"resources.Messages"
我决定使用 PropertyResourceBundle,所以我遵循了所有步骤,然后使用 --properties-output
选项跳转 msgfmt ( I'm not going to create .class
) so I use msgcat 以创建 .properties 而不是 .class
推荐:
msgcat --properties-output msgs/fr.po -o src/com/i18n/Messages_fr.properties
或创建 shell 脚本 po2pr.sh (./po2pr.sh fr )
if [ -z "" ]; then
echo "Please specify which language_country suffix(es) you want"
exit 1
fi
for lang in $*
do
echo "Creating .properties template file for $lang"
msgcat --properties-output msgs/${lang}.po -o src/com/i18n/Messages_${lang}.properties
msgs/messages.pot
done
java代码:
public class I {
private static I18n getI18n() {
I18n getI18n = I18nFactory.getI18n(I.class, "i18n.Messages");
Locale Locale = new Locale("fr");
getI18n.setLocale(Locale);
return getI18n;
}
public static String tr(String str) {
return getI18n().tr(str);
}
public static String tr(String text, Object o1) {
return getI18n().tr(text, o1);
}
public static String tr(String text, Object o1, Object o2) {
return getI18n().tr(text, o1, o2);
}
public static String tr(String text, Object o1, Object o2, Object o3) {
return getI18n().tr(text, o1, o2, o3);
}
public static String tr(String text, Object o1, Object o2, Object o3,
Object o4) {
return getI18n().tr(text, o1, o2, o3, o4);
}
public static String tr(String text, Object[] objects) {
return getI18n().tr(text, objects);
}
}
注:
1-您必须创建 Messages_fr.properties
2- 确保您在色调级别 src.com.i18n.Messages
中创建资源包
我正在翻译我的桌面 java 应用程序(在 windows 10 OS 上),所以我使用 http://code.google.com/p/gettext-commons[= 中的 gettext-common 16=]
我已经按照 gettext-common 提供的教程进行操作:https://code.google.com/archive/p/gettext-commons/wikis/Tutorial.wiki
按照所有步骤我创建 Messages_fr.class
,Messages_en.class
问题出在 gettext-common 他们有 Messages_en.properties 而不是 .class,当我创建 Messages_en.properties(手动)有效!而且我不能手动完成它会花很长时间(我有 700 多个句子)
JAVA代码:
static I18n i18n = I18nFactory.getI18n(ParserTest.class,
"resources.messages");
public static void main(String args[]) {
for (int i = 0; i < 2; i++) {
if (i == 0) {
print("First run");
} else {
print("Second run");
i18n.setLocale(Locale.FRANCE);
}
print("Current locale: " + i18n.getLocale());
print(i18n
.tr("This text is marked for translation and is translated"));
String mark = i18n
.marktr("This text is marked for translation but not translated");
print(mark);
print(i18n.tr(mark));
mark = i18n.tr("This is the {0}. text to be translated",
"chat (noun)");
print(mark);
mark = i18n.tr("This is the {0}. text to be translated",
"chat (verb)");
print(mark);
print(i18n.tr("chat (noun)"));
print(i18n.tr("chat (verb)"));
print("");
}
}
private static void print(String text) {
System.out.println(text);
}
我对此有疑问:
问题 1:我的消息文件位于 resources/Messages
目录下。它只包含 2 个文件:messages_en.class 和 messages_fr.class 而不是 messages_fr.properties 和 messages_en.properties.
如果我尝试 运行 上面的代码,我会收到警告:“ResourceBundle [messages],这是因为没有 .properties 文件
对于java ResourceBundle,存在两种不同的实现:
- *.properties 文件的 PropertyResourceBundle,众所周知,延迟部分加载
- ListResourceBundle,纯 java 代码,*.class,带数组,快速,完全加载(初始化时间,内存使用)。
从您的描述来看,gettext 桥似乎使用了 ListResourceBundle 或其自己的 ResourceBundle 实现。没关系。
如图所示msgfmt 从 gettext 文件 (.po) 创建一个 .class 资源文件。
gettext 进程从所有语言的模板、.pot 开始,然后是每种语言的 .po 文件。
他们关于使用 maven 的建议可能确实值得。
说了这么多,也许就是用Locale.FRENCH
我还看到了 Properties~ 和 ListResourceBundles 之间的区别:可以尝试 "resources/messages"
或注意正确的大小写(大写 M)"resources.Messages"
我决定使用 PropertyResourceBundle,所以我遵循了所有步骤,然后使用 --properties-output
选项跳转 msgfmt ( I'm not going to create .class
) so I use msgcat 以创建 .properties 而不是 .class
推荐:
msgcat --properties-output msgs/fr.po -o src/com/i18n/Messages_fr.properties
或创建 shell 脚本 po2pr.sh (./po2pr.sh fr )
if [ -z "" ]; then
echo "Please specify which language_country suffix(es) you want"
exit 1
fi
for lang in $*
do
echo "Creating .properties template file for $lang"
msgcat --properties-output msgs/${lang}.po -o src/com/i18n/Messages_${lang}.properties
msgs/messages.pot
done
java代码:
public class I {
private static I18n getI18n() {
I18n getI18n = I18nFactory.getI18n(I.class, "i18n.Messages");
Locale Locale = new Locale("fr");
getI18n.setLocale(Locale);
return getI18n;
}
public static String tr(String str) {
return getI18n().tr(str);
}
public static String tr(String text, Object o1) {
return getI18n().tr(text, o1);
}
public static String tr(String text, Object o1, Object o2) {
return getI18n().tr(text, o1, o2);
}
public static String tr(String text, Object o1, Object o2, Object o3) {
return getI18n().tr(text, o1, o2, o3);
}
public static String tr(String text, Object o1, Object o2, Object o3,
Object o4) {
return getI18n().tr(text, o1, o2, o3, o4);
}
public static String tr(String text, Object[] objects) {
return getI18n().tr(text, objects);
}
}
注:
1-您必须创建 Messages_fr.properties
2- 确保您在色调级别 src.com.i18n.Messages