- 追加された行はこの色です。
- 削除された行はこの色です。
- gettext へ行く。
#author("2019-11-13T13:07:54+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