web-dev-qa-db-ja.com

Ubuntuでgettext(php)が機能しない

次の例は、Apacheを搭載したMac OS Xで機能します。つまり、翻訳された文字列がエコーバックされます。しかし、lighttpdを使用したUbuntuでは、元のテキスト「非アクティブアカウント」が表示されます。私は運が悪かったので、環境変数のあらゆる種類の組み合わせを試しました。 .moファイルの内容をエコーアウトできるため、ファイルのアクセス許可でもありません。

<?php

//$locale = 'sv_SE.UTF-8';
$locale = 'sv_SE';

$dir = dirname(__FILE__);

// File permission is apparantly not a problem as this works...
//echo file_get_contents($dir . '/sv_SE/LC_MESSAGES/flattr.mo');

putenv("LANG=$locale");
putenv("LANGUAGE=$locale");
putenv("LC_ALL=$locale");
putenv("LC_MESSAGES=$locale");
setlocale(LC_ALL, $locale);
setlocale(LC_MESSAGES, $locale);
//setlocale(LANG, $locale);
//setlocale(LANGUAGE, $locale);

bindtextdomain('flattr', $dir);
//bind_textdomain_codeset("flattr", 'UTF-8');
textdomain('flattr');

echo _("Inactive account");

?>

誰かアイデアはありますか?

15
pthulin

私も同じ問題に直面していました。 Ubuntu10.10で修正するために行ったことについて説明します。

1)「gettext」がインストールされていることを確認します。

Sudo apt-get install gettext

または、「gettext」をインストールできない場合は、「php-gettext」をインストールできます。 'gettext'が既にインストールされている場合、パッケージ 'php-gettext'は必要ありません。

2)次に、言語のロケールを生成します。この例では、「sv_SE」を使用します。 '/ usr/share/i18n/SUPPORTED'でサポートされているロケールを検索します。

less /usr/share/i18n/SUPPORTED

'sv_SE'で始まる複数の行があります。

sv_SE.UTF-8 UTF-8
sv_SE ISO-8859-1
sv_SE.ISO-8859-15 ISO-8859-15

これは、sv_SEのロケールを生成するための複数のオプションがあることを意味します。オプションの1つに、名前にピリオド(。)が含まれていません(つまり、sv_SE ISO-8859-1);これは、そのロケールのデフォルトの文字セットです。デフォルトの文字セットのロケールを生成するには、次のコマンドを実行します。

Sudo locale-gen sv_SE

UTF-8文字セット用にそのロケールを生成する場合は、次のコマンドを実行します。

Sudo locale-gen sv_SE.UTF-8

ロケールを生成した後、Apacheを再起動します(そうでなければ、新しく生成されたロケールは見つかりません)、

Sudo service Apache2 restart

3)最後に、生成したロケールに一致するようにPHPスクリプトを更新します。'sv_SE 'のロケールを生成した場合は、

setlocale(LC_ALL、 "sv_SE");

ただし、そのロケールに相当するUTF-8を生成した場合は、、

setlocale(LC_ALL、 "sv_SE.UTF-8");

これですべてが機能するはずです。

35
Serrano

受け入れられた回答に概説されている手順に従いましたが、Ubuntu 14.04LTSで動作させることができませんでした。私は2つの重要なことをしなければなりませんでした:

(1)messages.moファイルを生成する前に、message.poでcharsetのUTF-8を明示的に指定する必要がありました。

msgid   ""
msgstr  "Project-Id-Version: PACKAGE VERSION\n"
        "Report-Msgid-Bugs-To: \n"
        "POT-Creation-Date: 2016-12-19 16:28+0530\n"
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
        "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
        "Language-Team: LANGUAGE <[email protected]>\n"
        "Language: \n"
        "MIME-Version: 1.0\n"
        "Content-Type: text/plain; charset=UTF-8\n"    <---------change here
        "Content-Transfer-Encoding: 8bit\n"

(2)インストールされているロケールと同じフォルダ名を維持する必要がありました。たとえば、Sudo locale-gen kn_INを実行してカンナダ語をインストールしました。これにより、kn_IN.UTF-8が生成されました。 UTF-8の大文字とハイフンに注意してください。 phpスクリプトでロケールを設定するとき、およびmessages.moファイルを配置するフォルダー名にこれと同じ名前を使用しました。

PHPスクリプト:

// I18N support information
$locale = "kn_IN.UTF-8";       <----------change here
putenv("LANG=".$locale); 
putenv("LC_ALL=".$locale);
setlocale(LC_ALL, $locale);

$domain = 'messages';
bindtextdomain($domain, "./Locale");
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain);

フォルダ名:

project_folder
    /Locale
        /kn_IN.UTF-8      <------change here
            /LC_MESSAGES
                /messages.mo

Ubuntuは、フォルダー名とファイル名で大文字と小文字を区別します。したがって、大文字が上記のように維持されていることを確認してください。

1