PHPとMySQLで動的な多言語Webサイトを作成する方法を教えてください。Googleで検索しましたが、良い解決策が見つかりませんでした。
誰かがステップバイステップガイドを提供できますか?可能であれば、多言語Webサイトのデモを作成してください。または、詳細が説明されているリンクを参照してください。
短い答え:考慮するべき変数がたくさんあり、やるべき仕事がたくさんあるので、短い答えはありません。そう...
長答:私はできる限りそれを分解しますが、あなたのような幅広い質問に対する「万人に良い」答えはありません。
まず、手元のタスクの変数:
言語のリスト:あなたのサイトは事前に定義された言語のセットになりますか、それとも多様/異質なものになりますか?たとえば、サイトは2つの明確に定義された言語で完全にバイリンガルです(または、別の例を挙げると、英語/カタロニア語/スペイン語のサイトを運営しています)。または、異なる言語のセットで異なるセクションを利用できます(たとえば、MSのサイトを見てください:それらはほとんど同種ですが、ブログ、KB記事、およびいくつかのドキュメントのようなものは、おそらくサポートされている言語のサブセットで利用可能です)。
翻訳ソース:コンテンツは、あなたや協力者によって、関連する各言語で提供されていますか?または、いくつかのバージョンは、単一の「ベース」言語から翻訳ソフトウェアを介して実行されますか?最初のアプローチでは、コンテンツを作成するために多くの余分な作業が必要になりますが、2番目のアプローチよりも高品質の結果が得られます。
言語自体:1)と2)が回答されたら、どの言語を使用しているかを正確に認識する必要があります。方言を含める場合(例:米国英語+英国英語、またはアルゼンチンスペイン語+スペインスペイン語)、検索エンジンで「重複コンテンツ」の問題が発生する場合がありますが、その詳細はここではあまりにも話題になります(ちょうど言及して潜在的な問題を認識してください)。
抽象的に言語をターゲットにしていますか(たとえば、私のサイトでは、訪問者がどこにいるかを気にせずに3つの言語を提供しています。それとも、異なる地域/国をターゲットにしていますか?後者の場合、言語(タイムゾーン、通貨、日時形式の規則など)以外の他のものに注意する必要があるため、物事は非常に複雑になる可能性がありますが、使用できるという利点が得られます国固有のTLD。
上記の明確な定義ができたら、作業を始めましょう。これらは、処理する必要がある最も顕著なタスクです。
言語の検出:最も合理的なアプローチは、GETパラメーター(URLで?lang = en-usなど)を使用することです。また、言語引数のないURLが要求されたときにフォールバックするために、CookieやIPジオロケーションを使用する場合があります。また、手段がある場合は、URL美化のトピック(よく見えるもの:_example.com/index.php?lang=en-us
_または_example.com/en-us/home
_?)を検討してください。個人的には、.htaccessファイルにModRewriteが付与する権限が大好きですが、それはApacheを搭載したサーバーでのみ機能します。
コンテンツ管理:DBからコンテンツ(記事コンテンツなど)、インクルードファイル(パンくずリスト、メニュー、サイト全体の見出しなどに一般的)、またはその他の手段に関係なく、各バージョンを分離する何らかの方法が必要になりますコンテンツの(言語)。以下に、その方法の例をいくつか示します。
_en
_、__es
_、または__ca
_を追加します。このようにして、_$row["title_$lang"]
_のような式を使用して適切なコンテンツにアクセスできます。.en.php
_、_.ca.htm
_などで終わるファイル名があります。インクルード呼び出しはinclude("some-filename.$lang.php)
のようになります。言語選択:非常に重要です。URL自体のGET引数を微調整する以外に、ユーザーに独自の言語を選択する方法を提供する必要があります。いくつかの言語では、ページが最初はユーザーがまったく知らない言語にフォールバックした場合でも理解できるため、「フラグ」はしばしばうまく機能します。より多くの言語では、ドロップダウンメニューは(ビューポートスペースの点で)より効率的と思われますが、視覚的な(つまり、非テキスト)ヒントを追加する必要があります。一部のサイトでは、入力時に言語を選択せざるを得ず、各言語のホームページへのリンクしかありません。個人的には、私のサイトのメニューの上に3つのフラグが目立っており、それぞれが言語引数を変更しただけで現在のアドレスを指し示しています。このようなコードは非常にうまく機能します:
_function translatedURI($new_lang) {
return str_replace("lang=$lang", "lang=$new_lang", "http://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"];
}
_
まあ、それは私が今のところ出てくることができるすべてです。袖を引き上げて仕事を始めるのに十分なはずだと思います。それから、あなたがあなたの道で何らかの壁にぶつかったならば、特定の質問で戻って来てください、そして、私はあなたがより特定の答えを得ると確信しています。
お役に立てれば。
私が常に使用するソリューションは、すべての可能なメッセージを含むデータベーステーブルを作成することです。メッセージごとに、コード(略称)を使用して検索します。たとえば、次のとおりです。
lang id message
en login Login
en lostpass Lost your password?
de login Anmelden
de lostpass Paswort vergessen?
nl login Aanmelden
nl lostpass Wachtwoord vergeten?
など。通常、MySQLクエリを使用することで翻訳の検索は十分に高速ですが、すべてのメッセージを配列に入れて、スクリプトの読み込み時にメモリに読み込むこともできます。ユーザーは、好みの言語を常に設定できる必要があります。Webブラウザーによって設定された言語ヘッダーに盲目的に依存しないでください。
最も簡単な言語を使用できます PHP Multi Language Class-LangQuery
呼び出すだけでなく、言語データを.iniファイルに保存できます。
include("LangQuery.php");
$L=new LangQuery();
// Write Hello World
echo($L('hello_world'));
// Write Hello World Easier - In-line Echo Feature
// You don't have to write echo. Just add '>'
$L('>hello_world');
// Use in Strings
echo("Hello Universe. {$L('hello_world')} Hello Europe");
// Write my age with parameter
$L(">my_age",25);
// Write my name and age with parameters
$L(">my_name_age","Recep",25);
私は現在、多言語でなければならない非常に小さなCMSを設計しています。
私が最も懸念する機能の1つは、クライアントが自発的に言語の追加または削除を決定できることです。
このため、データベーステーブルにサフィックスを追加する設計を目指していません。テーブル名を変更したり、動的名を使用してアクセスしたり、言語を定義または削除するたびにフィールドを追加または削除することはできません。
データベースが好きで、それらが管理しやすいという理由だけで、ファイルも使用しません。
最後に、2種類の翻訳を考えます。
したがって、私の設計の目的は次のとおりです。
つまり、フィールドが単一言語のシナリオでコンテンツを持つテーブルは、常に翻訳テーブルにあるため、コンテンツが無効になります。
これにより、SQLクエリの複雑さが増しますが、翻訳を簡単に維持するツールを開発できます。また、SQLの複雑さは、ソリューションを実装するときに1回だけ存在します。その実装が適切に設計されていれば、サイトのメンテナンス/拡張性は大きな問題である必要はありません。
編集:
開発者の友人とのいくつかの会話の後、私がここでアプローチしている解決策は、単一のテーブルであまりにも多くの費用がかかると思います。
これから勉強する別のアプローチは、次のように、各「翻訳可能なテーブル」に追加のテーブルを作成することです。
このスキームは、最初のスキームから概念を継承しますが、テーブルごとにコンテンツを分離します。この代替ソリューションは、パフォーマンスを向上させ、問題を(インデックスの問題として)切り分けることができます。
「翻訳可能なテーブル」ごとの追加の変換テーブルは、元のテーブルと同時に作成されます。
SQLクエリについても、複雑さは同じです。最初のアプローチではtranslationsテーブルを検索するためにテーブル名が必要ですが、2番目のアプローチではテーブル名にサフィックス「_translations」を追加するだけです。