moritetuのIT関連技術メモ

gettext

国際化と地域化のための開発ライブラリおよびコマンド群のこと。開発元はGnuプロジェクト。

翻訳の流れ

  1. xgettextで、ローカライズ対象のメッセージを抽出
    xgettext -k"_" -o my.pot get text.c
  2. msginitコマンドにより、翻訳リソースファイル(.poファイル)を作成
    msginit --locale=ja --input=my.pot --no-translator -o my.po
  3. .poをコンパイルし.mo(バイナリファイルにコンパイル)を作成
    msgfmt -o my.mo my.po

プログラム例

gettext.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

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コマンドを実行する。

$ make
# ファイル編集
$ make install

サンプル filegettext.tar.gz

参考リンク


添付ファイル: filegettext.tar.gz 43件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP