日本 Samba ユーザ会 (Samba Users Group Japan)
SWATのメッセージ国際化リリースノート
SWATのメッセージ国際化リリースノート
2000年10月6日
河原 亮
目次
テクニカルノート
SWAT (Samba Web 管理ツール)の国際化機能の機能詳細
SWAT国際化に伴う改造点です。
Content Negotiation の仕組み
SWAT国際化機能の解説を行う前に、この機能を支えるContent Negotiation機能について簡単に紹介します。HTTP/1.1にはAccept-Languageというヘッダがあり、Webブラウザがどの言語のデータが欲しいかをサーバに伝えるために送られます。Webサーバはこのヘッダおよび、自身のもつコンテンツを確認し、最終的に送信するデータの言語を決定します。 この機能の詳細はrfc2616で定義されているHTTP/1.1の衷銓緕t 励苡・癆蜿n機能を参照してください。
HTMLページ切り替え機能の詳細
SWATが受けとったヘッダを見て、適切な言語ディレクトリにあるファイルを送信するようにしました。例えばSWATの"smb.conf.5.html"のリンクをクリックした時にブラウザのAccept-LanguageへッダがAccept-Language: ja, esのようになっていたら、次の順でファイルを探します。
- $SWATDIR/swat/ja/help/smb.conf.5.html : jaに対応するファイル
- $SWATDIR/swat/es/help/smb.conf.5.html : esに対応するファイル
- $SWATDIR/swat/help/smb.conf.5.html :デフォルトのファイル
$SWATDIRはSWATのインストール先(/usr/local/samba/swatなど)を表します。 このようにどの言語のファイルも見つからなければデフォルトのファイルが送信されますので、新規言語を追加する場合でも、一部のファイルだけを翻訳し、残りはデフォルト言語のファイルを用いることができるようになっています。
言語の優先順位に関する注意点
Accept-Languageへッダで定義されている重み付けオプション(q= )については無視され、単純に先に記述された言語が優先されます。同様に、すべての言語を表す"*"の表記もサポートされていません。
修正箇所
source/web/neg_lang.c |
- |
source/web/cgi.c |
- |
メッセージカタログ機能
gettextの組み込みによる出力の国際化
もともとSWATの出力メッセージはソースファイルに直接書かれてありましたが、gettextライブラリを使ってメッセージカタログを参照することにより、実行時の$LANGUAGE環境変数の設定によって言語を切替えられるようにしました。ソース中の言語が切り替わる部分は_("hoge")のようなマクロに置き換えられています(実際にはgettext()を呼び出されます)。WEBブラウザから言語を変更するために、SWATは$LANGUAGEを、ブラウザから要求された言語に設定します。
修正箇所
source/po/*.po |
メッセージカタログ |
source/web/swat.c |
- |
source/web/statuspage.c |
- |
source/param/loadparm.c |
- |
HTTP/1.1未対応ブラウザへの対応
ACCEPT-LANGUAGEヘッダを送信できるWEBブラウザにはIE3,4,5, NN4.x, lynx, w3mなどを確認していますが、送信できないwebブラウザは存在すると思います。その場合のためにACCEPT-LANGUAGEを送らなかった場合のデフォルトの言語を--with-swat-def-lang=LANG というconfigureオプションで指定できます。デフォルトはこの値を使用せず、LANGにはjaなどの言語名を一つだけ書きます。
SWATからのマルチバイト文字の書き込みバグ
samba-2.0.6以降ではsmb.confの記述にcoding systemパラメータで指定した文字コードを使用する必要があります(client codepage=932(SJIS)の時)。Samba自体はこれを正常に読みとってくれますが、SWATから書き込んだ場合は化けることがあります。これを修正しました。 Samba内部では文字コードはDOSのコード(この場合SJIS)が使われます。smb.confからパラメータをSamba内部に格納する時unixコード(coding systemの値)からDOSコードに変換されます(lp_do_parameter(), add_a_service()など)。ところがSWATから入力した値もこれらの関数で処理されるため問題がおきていました。またswatからsmb.confへの出力とView Configページの出力にも同じ関数(show_parameter())が使われ、ここでも文字コードの変換がうまくいってないため暫定的に修正しました。
修正箇所
source/lib/kanji.c |
- |
source/param/loadparm.c |
- |
source/web/swat.c |
- |
configure および Makefile の修正
SWATにgettextを組み込むために、configure.inおよびMakefileなどを修正しています。以下、修正点について記述します。
-
source/configure.in 変更したのは最後の方にある2箇所の部分です。
L1942
# gettext support.
# (added by rkawa)
PACKAGE=i18n_swat
AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
AC_SUBST(PACKAGE)
ALL_LINGUAS="en ja"
AM_GNU_GETTEXT
PACKAGEはメッセージカタログファイルの名前に使われています。ALL_LINGUASはメッセージカタログが用意されている言語です。つまりsource/po/のen.po, ja.poメッセージカタログソースが処理されることを意味しています。これらはmake時にmsgfmtコマンドによって.mo(または.gmo)ファイルに変換され、システムにインストールされます。AM_GNU_GETTEXTはsource/aclocal.m4の中で定義されるマクロです。このマクロはGNU gettextライブラリのソースに付属していたものをわずかに変更したものです。source/intl/に付属のGNU gettextライブラリ自身をコンパイルするためのライブラリ、ヘッダの検出などを行ないます。
L1958
AC_OUTPUT(include/stamp-h Makefile intl/Makefile po/Makefile.in)
gettext組み込みのために新たにsource/intl/, source/po/が追加されており、この中はそれぞれメインのMakefileから呼び出された別のMakefileで処理しています。どちらもGNU gettextライブラリのソースに付属のものを少しSambaに合わせて変更してあります。(config.hの場所など)
-
source/intl/Makefile.in このディレクトリにはGNU gettextソースが入っております。
-
source/po/Makefile.in.in: このディレクトリには主に国際化に必要なデータ類が入っており、.poファイルをバイナリのメッセージカタログ.moに変換したり、ソースファイル中の_("hoge")でマークされたところを監視して.poファイルのテンプレートであるi18n_swat.potを更新します。新しく翻訳すべきメッセージが追加されたらi18n_swat.potと*.poをマージ(msgmergeコマンド)することによってメッセージカタログをすぐに最新にすることができます。
-
source/po/POTFILES.in: gettextで翻訳するべきメッセージを持っているソースファイルのリストです。
-
source/Makefile.in
L10
top_builddir=.
LIBS=@LIBS@ @INTLLIBS@# swat i18n with gettext
@INTLLIBS@は先のAM_GNU_GETTEXTマクロによってgettextライブラリ名として設定されます。
L71
I18N_PACKAGE = @PACKAGE@
i18n_localedir = $(prefix)/@DATADIRNAME@/locale
intlsubdirs = po intl
top_srcdir = @top_srcdir@
i18n_localedirはgettextのメッセージカタログがインストールされる場所です。intlsubdirsはgettextの組み込みに必要なディレクトリのリストです。
L600付近
I18N-SUPPORT-ALL:
I18N-SUPPORT-INSTALL:
I18N-SUPPORT-CLEAN:
I18N-SUPPORT-DISTCLEAN:
I18N-SUPPORT-UNINSTALL:
これらはintlsubdirsのMakefileのルールを呼び出すためのものです。
-
source/aclocal.m4:
AC_DEFUN(AM_WITH_NLS,
AC_DEFUN(AM_GNU_GETTEXT,
AC_DEFUN(AM_LC_MESSAGES,
AC_DEFUN(AM_PATH_PROG_WITH_TEST,
これらはGNU gettextソースに付属のaclocal.m4からコピーしたものです。gettextをautoconf対応で使えるようにするため、ライブラリやヘッダの検出を行ないます。
-
source/acconfig.h: ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT, HAVE_LC_MESSAGES, HAVE_STPCPY, PACKAGEこれらの記号定数を癜・竢鈕で使えるようにするために追加されています。GNU gettextライブラリのコンパイルに必要です。
移植性
メッセージ国際化ライブラリにはSun gettext, GNU gettext, XPG categetsなどいくつかのインターフェースと実装があります。またlocaleデータのシステム依存性が当初問題となりました。localeデータを使って言語を切替えようとすると日本語localeの無いサーバに接続する(日本語表示可能な)webブラウザは日本語が使えないという事態になるからです。 そこで最終的に、アーカイブに内蔵したGNU gettextライブラリのみをサポートし言語の切替えにはlocaleを使わず、環境変数で行なうことにしました。このためgettextの利用法としては少し特殊な実装になっています。
参考文献
|