- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2019-11-10T11:12:18+00:00","default:haikikyou","haikikyou")
#author("2019-11-13T13:08:10+00:00","default:haikikyou","haikikyou")
[[moritetuのIT関連技術メモ]]
#contents
* gettext [#j540d429]
国際化と地域化のための開発ライブラリおよびコマンド群のこと。開発元はGnuプロジェクト。
* 翻訳の流れ [#j98cd152]
+ xgettextで、ローカライズ対象のメッセージを抽出
#geshi(bash){{{
xgettext -k"_" -o my.pot get text.c
}}}
+ msginitコマンドにより、翻訳リソースファイル(.poファイル)を作成
#geshi(bash){{{
msginit --locale=ja --input=my.pot --no-translator -o my.po
}}}
+ .poをコンパイルし.mo(バイナリファイルにコンパイル)を作成
#geshi(bash){{{
msgfmt -o my.mo my.po
}}}
** プログラム例 [#ybad844c]
''gettext.c''
#geshi(c){{{
#include <stdio.h>
#include <stdlib.h>
#include <libintl.h>
# include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <langinfo.h>
#define _(String) gettext (String)
#define gettext_noop(String) String
#define N_(String) gettext_noop (String)
#define TEXTDOMAIN "my"
int main(int argc, const char * argv[])
{
pid_t pid;
printf("LC_CTYPE = %s\n", setlocale(LC_CTYPE, NULL));
printf("LC_MESSAGES = %s\n", setlocale(LC_MESSAGES, NULL));
printf("nl_langinfo CODESET = %s\n", nl_langinfo(CODESET));
setlocale(LC_ALL, "");
bindtextdomain(TEXTDOMAIN, "/Users/t-moriyasu/workspace/xcodeworkspace/cstudy/gettext/locale");
textdomain(TEXTDOMAIN);
pid = fork();
if (pid < 0)
{
fprintf(stderr, "Error fork %d\n", errno);
exit(EXIT_FAILURE);
}
else if (pid == 0)
{
bind_textdomain_codeset(TEXTDOMAIN, "utf-8");
printf("Child LC_CTYPE = %s\n", setlocale(LC_CTYPE, NULL));
printf("Child LC_MESSAGES = %s\n", setlocale(LC_MESSAGES, NULL));
printf("Child nl_langinfo CODESET = %s\n", nl_langinfo(CODESET));
printf(_("This is a sample program %s\n"), "child");
_exit(0);
}
else
{
printf("Parent LC_CTYPE = %s\n", setlocale(LC_CTYPE, NULL));
printf("Parent LC_MESSAGES = %s\n", setlocale(LC_MESSAGES, NULL));
printf("Parent nl_langinfo CODESET = %s\n", nl_langinfo(CODESET));
printf(_("This is a sample program %s\n"), "parent");
}
return EXIT_SUCCESS;
}
}}}
''Makefile''
#geshi(make){{{
TEXTDOMAIN = my
CHARSET = utf-8
PROGRAM = gettext
GETTEXT_FILES = gettext-files
CFLAGS = -I/usr/local/opt/gettext/include
LDFLAGS = -L /usr/local/opt/gettext/lib -lintl
.PHONY: all clean install
all: $(PROGRAM) $(TEXTDOMAIN).pot
install: $(TEXTDOMAIN).mo $(PROGRAM)
mkdir -p ./locale/ja/LC_MESSAGES
mv $(TEXTDOMAIN).mo ./locale/ja/LC_MESSAGES/
$(TEXTDOMAIN).mo: $(TEXTDOMAIN).po
msgfmt -o $@ $<
$(TEXTDOMAIN).po: $(TEXTDOMAIN).pot
msginit --locale=ja --input=$< --no-translator -o $@
$(TEXTDOMAIN).pot: gettext-files
xgettext -k"_" -o $@ -f $(GETTEXT_FILES)
sed -e 's/CHARSET/$(CHARSET)/g' $@ > $(TEXTDOMAIN).pot.tmp
mv $(TEXTDOMAIN).pot.tmp $@
gettext-files:
find . -name '*.c' -print | LC_ALL=C sort >$@
clean:
/bin/rm -rf ./locale/ja/LC_MESSAGES/*.mo $(TEXTDOMAIN).{po,mo} $(PROGRAM) gettext-files
}}}
上記は、updateとかは考慮していない。マージを考慮する場合は、msgmergeコマンドを実行する。
#geshi(bash){{{
$ make
# ファイル編集
$ make install
}}}
&label(sample){サンプル}; &ref(gettext.tar.gz);
* 参考リンク [#m3008513]
- GNU gettext
-- https://www.gnu.org/software/gettext/manual/index.html
- GNU gettext tools, version 0.18.3
-- https://ayatakesi.github.io/gettext/0.18.3/gettext.html
- リポジトリ - gettext.git
-- http://git.savannah.gnu.org/cgit/gettext.git
- SETLOCALE man3
-- https://linuxjm.osdn.jp/html/LDP_man-pages/man3/setlocale.3.html
- gettext によるメッセージ処理
-- http://www1.kokusaika.jp/advisory/org/ja/gettext.html