首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java项目的windows 7下的gettext返回“坏文件描述符”

java项目的windows 7下的gettext返回“坏文件描述符”
EN

Stack Overflow用户
提问于 2015-07-10 12:49:34
回答 1查看 547关注 0票数 2

我试图在java项目中使用gettext为不同语言提供翻译。

我的工作站运行Windows 7,因此我希望能够在其上完成整个构建过程(包括键生成和翻译更新--所有这些都来自gradle脚本)。

但是msgfmt工具返回一个错误:‘坏文件描述符’,没有任何其他信息.

我在网上找不到任何有用的信息。有人有类似的问题,他的名字叫Daiki提出了一个补丁,但我想它没有进入官方的gettext版本,因为这个问题仍然存在.

请参阅:https://lists.gnu.org/archive/html/bug-gnulib/2013-09/msg00049.html

步骤

在项目中创建java文件列表

代码语言:javascript
复制
dir *.java /s/b > files.txt

创建翻译目录

代码语言:javascript
复制
mkdir po

创建包含本机语言中所有字符串的pot文件。

代码语言:javascript
复制
xgettext -ktrc -ktr -kmarktr -ktrn:1,2 --from-code=utf-8 -o po\keys.pot -f files.txt

替换keys.pot文件中的字符集以更正编码名“utf-8”

...manual步骤..。

创建包含内容描述的翻译文件

代码语言:javascript
复制
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文件中

代码语言:javascript
复制
msgmerge -U po\pl.po po\keys.pot

创建默认的ResourceBundle类文件<<出错(见下文)

代码语言:javascript
复制
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提供以下输出:

代码语言:javascript
复制
>msgfmt: c:\Java\jdk1.8.0_40\bin\javac.exe subprocess failed: Bad file descriptor

有人能帮忙让它起作用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-13 12:54:07

我找到了一些解决问题的方法,因为msgfmt是从这里生成的java源代码下载的.

此解决方案要求正确设置下列环境变量:

代码语言:javascript
复制
JAVA_HOME
CYGWIN_HOME
GETTEXT_HOME

我在项目根dir中名为run_gettext.sh的子目录gettext中创建了以下脚本:

代码语言:javascript
复制
#!/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/

并使用命令从我的项目根目录执行它:

代码语言:javascript
复制
%CYGWIN_HOME%\bin\bash gettext/run_gettext.sh

javac.sh所在的地方:

代码语言:javascript
复制
#!/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 $0`"
JAVAC_EXEC="/cygdrive/%JAVA_HOME%/bin/javac.exe"
ARGS=""
#
while [ -n "$1" ]; do
   arg="$1"
   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 on CI与项目源代码一起编译。

文件template.po包含:

代码语言:javascript
复制
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31341226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档