2

Java プロジェクトでgettextを使用して、さまざまな言語の翻訳を提供しようとしています。

私のワークステーションは Windows 7 を実行しているので、ビルド プロセス全体を実行できるようにしたいと考えています (キーの生成と翻訳の更新を含む - すべて gradle スクリプトから)。

ただし、 msgfmtツールはエラーを返します:追加情報なしで「不正なファイル記述子」 ...

インターネットで役立つ情報を見つけることができませんでした。誰かが同様の問題を抱えており、上野大樹という男がパッチを提案しましたが、問題がまだ存在するため、公式の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

create default ResourceBundle class file << エラーで失敗します (以下を参照)

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 64bit でクラッシュします

残りのmsgfmtは、次の出力を提供します。

>msgfmt: c:\Java\jdk1.8.0_40\bin\javac.exe subprocess failed: Bad file descriptor

誰でもそれを機能させるのを手伝ってもらえますか?

4

1 に答える 1

0

ここからダウンロードされた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 $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ファイルは、プロジェクトのソース コードと一緒にCI上でgradleによってコンパイルされます。

ファイルtemplate.poには以下が含まれます。

msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
于 2015-07-13T12:54:07.200 に答える