PHPで言語ファイルを行う最も効率的な方法は?
-
06-07-2019 - |
質問
新しい質問を作成する代わりに質問を更新しました...
構築中のソーシャルネットワークサイトで、英語以外のいくつかの代替言語を提供したいのですが、あらゆる種類の言語翻訳を行うのは今回が初めてなので、ご容赦ください。
私は研究しているので、私は耳を傾け、アイデアに開かれています。私はすでに多くの質問を持っています
1)
i18nはどういう意味ですか、SOで言語翻訳を研究するときによく見ますか?
2)
ほとんどの人は、 gettext を使用すると言います。PHPには拡張機能またはサポートがあり、
私はそれを研究してきましたが、このルートに行くには多くの余分な仕事があると言える限り、それについての基本的な理解があります。
つまり、機能を使用するためにサイトをコーディングするということです。 _( 'hello world i'm english for now')または gettext( 'hello world i'm in English for now')はどのルートでも問題ありませんそれが必要になります。
ただし、サーバーにgettextをインストールして動作させる必要があります。
その後、いくつかの特別なエディターを使用して特別なファイルを作成し、それらをコンパイルしますか?
痛みのように聞こえますが、これが最善の方法であると理解されていますが、誰もがそうであると言っているようです。
なぜこれが行くべきルートなのか、誰か教えてもらえますか?
3)
私はこのアプローチのシンプルさが本当に気に入っています。言語配列を作成し、下の例のような関数で必要なフレーズを呼び出すだけです
、適切な言語配列を持つファイルを含めるだけです。
本当に知りたいのは、これはgettextを使用するのに比べて、高トラフィックでかなり大規模なサイトでのパフォーマンスの向上方法ではないでしょうか?もしそうなら、理由を説明できますか?
<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
static $lang = array(
'NO_PHOTO' => 'No photo\'s available',
'NEW_MEMBER' => 'This user is new'
);
return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO'); // No photo's available would show here
?>
*以下のbrianreavisの回答から使用されたいくつかのコード
解決
車輪を再発明しないでください。たとえば、 gettext または Zend_Translate 。
他のヒント
おそらく、言語マッピングを処理する関数を定義するのが最善でしょう。そうすることで、後で動作を変更したい場合、 $ lang [...]
を使用した場合に何百ものスクリプトを探し回る必要がなくなります。それらを別のものに置き換えます。
このようなものは動作し、素晴らしいでしょう&amp;高速:
function lang($phrase){
static $lang = array(
'NO_PHOTO' => 'No photo\'s available',
'NEW_MEMBER' => 'This user is new'
);
return $lang[$phrase];
}
配列が関数内で static
として宣言されているようにし、関数が呼び出されるたびに再割り当てされないようにします。これは、 $ lang
が非常に大きい場合に特に重要です。
使用するには:
echo lang('NO_PHOTO');
複数の言語を処理するには、この関数を複数のファイル( en.php
、 fr.php
など)および require()
ユーザーに適したもの。
これでうまくいくかもしれない:
function _L($phrase){
static これでうまくいくかもしれない:
<?php
function setSessionLanguageToDefault() {
$ip=これでうまくいくかもしれない:
function _L($phrase){
static これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L = array(
'NO_PHOTO' => 'No photo\'s available',
'NEW_MEMBER' => 'This user is new'
);
return (!array_key_exists($phrase,これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L)) ? $phrase : これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L[$phrase];
}
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
SERVER['REMOTE_ADDR'];
$url='http://api.hostip.info/get_html.php?ip='.$ip;
$data=file_get_contents($url);
$s=explode (':',$data);
$s2=explode('(',$s[1]);
$country=str_replace(')','',substr($s2[1], 0, 3));
if ($country=='us') {
$country='en';
}
$country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country ));
これでうまくいくかもしれない:
function _L($phrase){
static これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L = array(
'NO_PHOTO' => 'No photo\'s available',
'NEW_MEMBER' => 'This user is new'
);
return (!array_key_exists($phrase,これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L)) ? $phrase : これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L[$phrase];
}
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
SESSION["_LANGUAGE"]=$country;
}
if (!isset(これでうまくいくかもしれない:
function _L($phrase){
static これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L = array(
'NO_PHOTO' => 'No photo\'s available',
'NEW_MEMBER' => 'This user is new'
);
return (!array_key_exists($phrase,これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L)) ? $phrase : これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L[$phrase];
}
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
SESSION["_LANGUAGE"])) {
setSessionLanguageToDefault();
}
if (file_exists(APP_DIR.'/language/'.これでうまくいくかもしれない:
function _L($phrase){
static これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L = array(
'NO_PHOTO' => 'No photo\'s available',
'NEW_MEMBER' => 'This user is new'
);
return (!array_key_exists($phrase,これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L)) ? $phrase : これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L[$phrase];
}
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
SESSION["_LANGUAGE"].'.php')) {
include(APP_DIR.'/language/'.これでうまくいくかもしれない:
function _L($phrase){
static これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L = array(
'NO_PHOTO' => 'No photo\'s available',
'NEW_MEMBER' => 'This user is new'
);
return (!array_key_exists($phrase,これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L)) ? $phrase : これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L[$phrase];
}
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
SESSION["_LANGUAGE"].'.php');
} else {
include(APP_DIR.'/language/'.DEFAULT_LANG.'.php');
}
?>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L = array(
'NO_PHOTO' => 'No photo\'s available',
'NEW_MEMBER' => 'This user is new'
);
return (!array_key_exists($phrase,これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L)) ? $phrase : これでうまくいくかもしれない:
<*>
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>
まだ完了していませんが、これは大いに役立つと思います。
L[$phrase];
}
今私が使用しているもの。言語が見つからない場合、エラーの代わりにフレーズを返します。
配列には最大65500個のアイテムを含めることができることに注意してください。十分なはずですが、よく言ってください。
ユーザーの言語を確認するために使用するコードを次に示します。
<*>まだ完了していませんが、これは大いに役立つと思います。
他の回答ではすべての質問に実際に答えているわけではないので、答えに加えて賢明な代替案を提供します。
1) I18nは国際化の略で、I-eighteen-nといくつかの類似点があります。
2) 私の正直な意見では、gettextは時間の無駄です。
3) あなたのアプローチはよさそうです。探す必要があるのは言語変数です。 WoltLab Community Framework 2.0 は、双方向言語システムを実装しています。データベースとテンプレート内に保存される言語変数が存在する場合、変数名のみを使用して、現在の言語の変数のコンテンツに置き換えます(使用可能な場合)。システムの2番目の部分は、ユーザーが生成したコンテンツを複数の言語で保存する方法を提供します(複数の言語での入力が必要です)。
基本的に、開発者が定義したインターフェイステキストと、ユーザーが定義したコンテンツがあります。コンテンツの多言語テキストは言語変数に保存され、言語変数の名前は特定のコンテンツテーブルのテキストフィールドの値として使用されます(単一言語のコンテンツも可能です)。
WCFの構造は、フレームワーク外でコードを再利用するのが非常に難しいという点で残念ですが、インスピレーションとして使用できます。システムの範囲は、サイトで何を達成したいかだけに依存します。大きくなる場合は、間違いなくWCFシステムを見てください。小さい場合は、いくつかの専用言語ファイル(de.php、en.phpなど)から現在の言語の正しい言語ファイルが含まれます。
残念ながら gettext はうまく機能せず、異なるOS(WindowsまたはLinux)などのさまざまな状況で問題が発生し、動作させるのは非常に困難です。
さらに、多くの環境変数とドメインを設定する必要があり、これには意味がありません。
開発者が単にテキストの翻訳を取得する場合、.moファイルパスを設定し、translate(&quot; hello&quot;、&quot; en_EN&quot;)のような1つの関数で翻訳を取得するだけです。 gettextではこれは不可能です。
なぜこのように多次元配列として作成しないのですか
<?php
$lang = array(
'EN'=> array(
'NO_PHOTO'=>'No photo\'s avaiable',
'NEW_MEMBER'=>'This user is new',
),
'MY'=> array(
'NO_PHOTO'=>'Tiada gambar',
'NEW_MEMBER'=>'Ini adalah pengguna baru',
)
);
?>
これを行うことができます:
class T {
const language = "English";
const home = "Home";
const blog = "Blog";
const forum = "Forum";
const contact = "Support";
}
言語ごとにこのようなファイルがあります。テキストを使用するには:
There is no place like <?=T::home?>.
欠点は、新しい定数を追加する場合、すべての言語ファイルに対して行う必要があることです。忘れると、その言語のページが壊れます。これは少し厄介ですが、大きな連想配列を作成する必要がなく、値がインライン化される可能性があるため、効率的です。
たとえば、アクセスが改善される可能性があります。例:
class T {
const home = "home";
public static function _ ($name) {
$value = @constant("self::$name");
return $value ? $value : $name;
}
// Or maybe through an instance:
public function __get ($name) {
$value = @constant("self::$name");
return $value ? $value : $name;
}
}
echo "There is no " . T::_("place") . " like " . T::_("home");
$T = new T();
echo "There is no " . $T->place . " like " . $T->home;
私たちはまだ配列を避け、検索を行うために定数に依存しています、定数を直接使用するよりも高価だと思います。欠点は、キーが見つからないときにルックアップがフォールバックを使用できることです。