windows 7 下的 gettext java 项目 returns 'Bad file descriptor'
gettext under windows 7 for java project returns 'Bad file descriptor'
我正在尝试在 java 项目中使用 gettext 来提供不同语言的翻译。
我的工作站运行 Windows 7,所以我希望能够在其上完成整个构建过程(包括密钥生成和翻译更新 - 全部来自 gradle 脚本)。
但是 msgfmt 工具 returns 一个错误:'Bad file descriptor' 没有任何附加信息...
我无法在 Internet 上找到任何有用的信息。
有人遇到了类似的问题,名叫 Daiki Ueno 的人提出了一个补丁,但我想它没有进入官方 gettext 版本,因为问题仍然存在...
参见:https://lists.gnu.org/archive/html/bug-gnulib/2013-09/msg00049.html
步骤
在项目中创建 java 个文件的列表
dir *.java /s/b > files.txt
创建翻译目录
mkdir po
创建一个包含所有本地语言字符串的 pot 文件
xgettext -ktrc -ktr -kmarktr -ktrn:1,2 --from-code=utf-8 -o po\keys.pot -f files.txt
替换 keys.pot 文件中的 CHARSET 以更正编码名称 'utf-8'
...手动步骤...
创建带有内容描述的翻译文件
type nul >> po\pl.po & copy po\pl.po +,,
echo msgid "" >> po\pl.po
echo msgstr "" >> po\pl.po
echo "Content-Type: text/plain; charset=UTF-8\n\" >> po\pl.po
将密钥合并到本地化的 po 文件中
msgmerge -U po\pl.po po\keys.pot
创建默认 ResourceBundle class 文件 << 失败并出现错误(见下文)
set JAVAC=c:\Java\jdk1.8.0_40\bin\javac.exe
set TMPDIR=c:\temp
msgfmt --verbose -java2 -d src\main\java -r com.haso.Messages po\keys.pot
我尝试了以下 gettext 的实现:
- GetGnuWin32-0.6.3
- MinGW-0.18.3
- gettext-tool-windows-0.18.3
- gettext-tool-windows-0.19.4
- gettext-iconv-windows-0.19.4
第一个在 Windows 7 64 位
中崩溃
其余的 msgfmt 给出以下输出:
>msgfmt: c:\Java\jdk1.8.0_40\bin\javac.exe subprocess failed: Bad file descriptor
任何人都可以帮助它工作吗?
由于从 here 下载的 msgfmt 生成了 java 源...
,所以我能够找到一些解决方法
此解决方案需要正确设置以下环境变量:
JAVA_HOME
CYGWIN_HOME
GETTEXT_HOME
我在项目根目录中名为 gettext 的子目录中创建了以下脚本 run_gettext.sh:
#!/bin/bash
cd `$CYGWIN_HOME/bin/pwd.exe`/gettext
set CYGWIN_HOME=%CYGWIN_HOME%
set GETTEXT_HOME=%GETTEXT_HOME%
$CYGWIN_HOME/bin/rm.exe -fv files.txt
$CYGWIN_HOME/bin/find.exe ../src/main/java -name *.java > files.txt
$CYGWIN_HOME/bin/mkdir.exe -pv po
$GETTEXT_HOME/xgettext.exe -ktrc -ktr -kmrktr -ktrn:1,2 --from-code=UTF-8 -o po/keys.pot -f files.txt
$CYGWIN_HOME/bin/sed.exe -i 's/CHARSET/UTF-8/g' po/keys.pot
if [ ! -f po/pl.po ]; then
$CYGWIN_HOME/bin/cp.exe -v template.po po/pl.po
fi
$GETTEXT_HOME/msgmerge.exe -U po/pl.po po/keys.pot
export JAVAC=`$CYGWIN_HOME/bin/pwd.exe`/javac.sh
$CYGWIN_HOME/bin/rm.exe -rfv tmp
$CYGWIN_HOME/bin/mkdir.exe -pv tmp
export TMPDIR=`$CYGWIN_HOME/bin/pwd.exe`/tmp/
$GETTEXT_HOME/msgfmt.exe --verbose --java2 -d tmp -r com.haso.i18n.Messages po/keys.pot
$GETTEXT_HOME/msgfmt.exe --verbose --java2 -d tmp -r com.haso.i18n.Messages -l pl po/pl.po
$CYGWIN_HOME/bin/rm.exe -rfv ../src/main/java/com/haso/i18n
$CYGWIN_HOME/bin/mkdir.exe -pv ../src/main/java/com/haso/i18n
$CYGWIN_HOME/bin/find.exe tmp -name "Messages*.java" | $CYGWIN_HOME/bin/xargs.exe -n 1 $CYGWIN_HOME/bin/cp.exe -vt ../src/main/java/com/haso/i18n/
并使用命令从我的项目根目录执行它:
%CYGWIN_HOME%\bin\bash gettext/run_gettext.sh
其中 javac.sh 是:
#!/bin/bash
#
# A wrapper for calling Javac from Cygwin
# Original Author: Igor Pechtchanski <pechtcha@cs.nyu.edu
# Modified by Florian Gattung <fgattung@gmail.com> for msgfmt compatibility
#
ME="`basename [=13=]`"
JAVAC_EXEC="/cygdrive/%JAVA_HOME%/bin/javac.exe"
ARGS=""
#
while [ -n "" ]; do
arg=""
shift
if [ -d $arg ]; then
arg="`cygpath -p -w "$arg"`"
fi
if [ -f $arg ]; then
arg="`cygpath -p -w "$arg"`"
fi
ARGS="$ARGS '$arg'"
done
eval "set -- $ARGS"
exec "$JAVAC_EXEC" "$@"
创建的 *.java 文件然后由 gradle 在 CI连同项目源码。
文件 template.po 包含:
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
我正在尝试在 java 项目中使用 gettext 来提供不同语言的翻译。
我的工作站运行 Windows 7,所以我希望能够在其上完成整个构建过程(包括密钥生成和翻译更新 - 全部来自 gradle 脚本)。
但是 msgfmt 工具 returns 一个错误:'Bad file descriptor' 没有任何附加信息...
我无法在 Internet 上找到任何有用的信息。 有人遇到了类似的问题,名叫 Daiki Ueno 的人提出了一个补丁,但我想它没有进入官方 gettext 版本,因为问题仍然存在...
参见:https://lists.gnu.org/archive/html/bug-gnulib/2013-09/msg00049.html
步骤
在项目中创建 java 个文件的列表
dir *.java /s/b > files.txt
创建翻译目录
mkdir po
创建一个包含所有本地语言字符串的 pot 文件
xgettext -ktrc -ktr -kmarktr -ktrn:1,2 --from-code=utf-8 -o po\keys.pot -f files.txt
替换 keys.pot 文件中的 CHARSET 以更正编码名称 'utf-8'
...手动步骤...
创建带有内容描述的翻译文件
type nul >> po\pl.po & copy po\pl.po +,,
echo msgid "" >> po\pl.po
echo msgstr "" >> po\pl.po
echo "Content-Type: text/plain; charset=UTF-8\n\" >> po\pl.po
将密钥合并到本地化的 po 文件中
msgmerge -U po\pl.po po\keys.pot
创建默认 ResourceBundle class 文件 << 失败并出现错误(见下文)
set JAVAC=c:\Java\jdk1.8.0_40\bin\javac.exe
set TMPDIR=c:\temp
msgfmt --verbose -java2 -d src\main\java -r com.haso.Messages po\keys.pot
我尝试了以下 gettext 的实现:
- GetGnuWin32-0.6.3
- MinGW-0.18.3
- gettext-tool-windows-0.18.3
- gettext-tool-windows-0.19.4
- gettext-iconv-windows-0.19.4
第一个在 Windows 7 64 位
中崩溃 其余的msgfmt 给出以下输出:
>msgfmt: c:\Java\jdk1.8.0_40\bin\javac.exe subprocess failed: Bad file descriptor
任何人都可以帮助它工作吗?
由于从 here 下载的 msgfmt 生成了 java 源...
,所以我能够找到一些解决方法此解决方案需要正确设置以下环境变量:
JAVA_HOME
CYGWIN_HOME
GETTEXT_HOME
我在项目根目录中名为 gettext 的子目录中创建了以下脚本 run_gettext.sh:
#!/bin/bash
cd `$CYGWIN_HOME/bin/pwd.exe`/gettext
set CYGWIN_HOME=%CYGWIN_HOME%
set GETTEXT_HOME=%GETTEXT_HOME%
$CYGWIN_HOME/bin/rm.exe -fv files.txt
$CYGWIN_HOME/bin/find.exe ../src/main/java -name *.java > files.txt
$CYGWIN_HOME/bin/mkdir.exe -pv po
$GETTEXT_HOME/xgettext.exe -ktrc -ktr -kmrktr -ktrn:1,2 --from-code=UTF-8 -o po/keys.pot -f files.txt
$CYGWIN_HOME/bin/sed.exe -i 's/CHARSET/UTF-8/g' po/keys.pot
if [ ! -f po/pl.po ]; then
$CYGWIN_HOME/bin/cp.exe -v template.po po/pl.po
fi
$GETTEXT_HOME/msgmerge.exe -U po/pl.po po/keys.pot
export JAVAC=`$CYGWIN_HOME/bin/pwd.exe`/javac.sh
$CYGWIN_HOME/bin/rm.exe -rfv tmp
$CYGWIN_HOME/bin/mkdir.exe -pv tmp
export TMPDIR=`$CYGWIN_HOME/bin/pwd.exe`/tmp/
$GETTEXT_HOME/msgfmt.exe --verbose --java2 -d tmp -r com.haso.i18n.Messages po/keys.pot
$GETTEXT_HOME/msgfmt.exe --verbose --java2 -d tmp -r com.haso.i18n.Messages -l pl po/pl.po
$CYGWIN_HOME/bin/rm.exe -rfv ../src/main/java/com/haso/i18n
$CYGWIN_HOME/bin/mkdir.exe -pv ../src/main/java/com/haso/i18n
$CYGWIN_HOME/bin/find.exe tmp -name "Messages*.java" | $CYGWIN_HOME/bin/xargs.exe -n 1 $CYGWIN_HOME/bin/cp.exe -vt ../src/main/java/com/haso/i18n/
并使用命令从我的项目根目录执行它:
%CYGWIN_HOME%\bin\bash gettext/run_gettext.sh
其中 javac.sh 是:
#!/bin/bash
#
# A wrapper for calling Javac from Cygwin
# Original Author: Igor Pechtchanski <pechtcha@cs.nyu.edu
# Modified by Florian Gattung <fgattung@gmail.com> for msgfmt compatibility
#
ME="`basename [=13=]`"
JAVAC_EXEC="/cygdrive/%JAVA_HOME%/bin/javac.exe"
ARGS=""
#
while [ -n "" ]; do
arg=""
shift
if [ -d $arg ]; then
arg="`cygpath -p -w "$arg"`"
fi
if [ -f $arg ]; then
arg="`cygpath -p -w "$arg"`"
fi
ARGS="$ARGS '$arg'"
done
eval "set -- $ARGS"
exec "$JAVAC_EXEC" "$@"
创建的 *.java 文件然后由 gradle 在 CI连同项目源码。
文件 template.po 包含:
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"