web-dev-qa-db-ja.com

多言語ウェブサイトの作り方

PHPとMySQLで動的な多言語Webサイトを作成する方法を教えてください。Googleで検索しましたが、良い解決策が見つかりませんでした。

誰かがステップバイステップガイドを提供できますか?可能であれば、多言語Webサイトのデモを作成してください。または、詳細が説明されているリンクを参照してください。

28
user295239

短い答え:考慮するべき変数がたくさんあり、やるべき仕事がたくさんあるので、短い答えはありません。そう...

長答:私はできる限りそれを分解しますが、あなたのような幅広い質問に対する「万人に良い」答えはありません。

まず、手元のタスクの変数:

  1. 言語のリスト:あなたのサイトは事前に定義された言語のセットになりますか、それとも多様/異質なものになりますか?たとえば、サイトは2つの明確に定義された言語で完全にバイリンガルです(または、別の例を挙げると、英語/カタロニア語/スペイン語のサイトを運営しています)。または、異なる言語のセットで異なるセクションを利用できます(たとえば、MSのサイトを見てください:それらはほとんど同種ですが、ブログ、KB記事、およびいくつかのドキュメントのようなものは、おそらくサポートされている言語のサブセットで利用可能です)。

  2. 翻訳ソース:コンテンツは、あなたや協力者によって、関連する各言語で提供されていますか?または、いくつかのバージョンは、単一の「ベース」言語から翻訳ソフトウェアを介して実行されますか?最初のアプローチでは、コンテンツを作成するために多くの余分な作業が必要になりますが、2番目のアプローチよりも高品質の結果が得られます。

  3. 言語自体:1)と2)が回答されたら、どの言語を使用しているかを正確に認識する必要があります。方言を含める場合(例:米国英語+英国英語、またはアルゼンチンスペイン語+スペインスペイン語)、検索エンジンで「重複コンテンツ」の問題が発生する場合がありますが、その詳細はここではあまりにも話題になります(ちょうど言及して潜在的な問題を認識してください)。

  4. 抽象的に言語をターゲットにしていますか(たとえば、私のサイトでは、訪問者がどこにいるかを気にせずに3つの言語を提供しています。それとも、異なる地域/国をターゲットにしていますか?後者の場合、言語(タイムゾーン、通貨、日時形式の規則など)以外の他のものに注意する必要があるため、物事は非常に複雑になる可能性がありますが、使用できるという利点が得られます国固有のTLD。

上記の明確な定義ができたら、作業を始めましょう。これらは、処理する必要がある最も顕著なタスクです。

  1. 言語の検出:最も合理的なアプローチは、GETパラメーター(URLで?lang = en-usなど)を使用することです。また、言語引数のないURLが要求されたときにフォールバックするために、CookieやIPジオロケーションを使用する場合があります。また、手段がある場合は、URL美化のトピック(よく見えるもの:_example.com/index.php?lang=en-us_または_example.com/en-us/home_?)を検討してください。個人的には、.htaccessファイルにModRewriteが付与する権限が大好きですが、それはApacheを搭載したサーバーでのみ機能します。

  2. コンテンツ管理:DBからコンテンツ(記事コンテンツなど)、インクルードファイル(パンくずリスト、メニュー、サイト全体の見出しなどに一般的)、またはその他の手段に関係なく、各バージョンを分離する何らかの方法が必要になりますコンテンツの(言語)。以下に、その方法の例をいくつか示します。

    • DBコンテンツについては、堅実なフィールド命名パターンを考え出し、それに固執することをお勧めします。たとえば、DBのすべての言語依存フィールドに__en_、__es_、または__ca_を追加します。このようにして、_$row["title_$lang"]_のような式を使用して適切なコンテンツにアクセスできます。
    • インクルードファイルの場合も、ファイルの命名規則が最も賢明なアプローチです。私の場合、_.en.php_、_.ca.htm_などで終わるファイル名があります。インクルード呼び出しはinclude("some-filename.$lang.php)のようになります。
    • 時々、PHPコードから直接小さなテキストの塊を吐き出します(たとえば、テーブルの見出しにラベルを付けるとき)。言語定義ごとにインクルードファイルを使用できます。同じキーを持つ「チャンク」配列、またはGeertが提案したDBテーブル。前者のアプローチは開発にかかる労力が少なく、後者は保守にかかる労力が少ないはずです(特に一人で作業していない場合)。
  3. 言語選択:非常に重要です。URL自体のGET引数を微調整する以外に、ユーザーに独自の言語を選択する方法を提供する必要があります。いくつかの言語では、ページが最初はユーザーがまったく知らない言語にフォールバックした場合でも理解できるため、「フラグ」はしばしばうまく機能します。より多くの言語では、ドロップダウンメニューは(ビューポートスペースの点で)より効率的と思われますが、視覚的な(つまり、非テキスト)ヒントを追加する必要があります。一部のサイトでは、入力時に言語を選択せざるを得ず、各言語のホームページへのリンクしかありません。個人的には、私のサイトのメニューの上に3つのフラグが目立っており、それぞれが言語引数を変更しただけで現在のアドレスを指し示しています。このようなコードは非常にうまく機能します:


_function translatedURI($new_lang) {
    return str_replace("lang=$lang", "lang=$new_lang", "http://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"];
}
_

  1. CMSの調整:サイト(またはその一部)が何らかのCMSやディスカッションボードなどを使用している場合、事態は非常に煩雑になります。私自身の経験から言えば、私のサイトにはphpBBフォーラムがあり、3つの主要なカテゴリ(言語ごとに1つ)に分かれています。これらは3つの独立したフォーラムのように見えます(ただし、すべての言語が実際に同じボードの単なるカテゴリであるため、すべての言語にアクセスできます)。これをスムーズに機能させるために調整しなければならなかったことが、私が今も保持している最後の健全性の残骸を脅かしました:S。これらの場合、使用している特定のソフトウェアのドキュメントとサポート機能を調べることをお勧めします。

まあ、それは私が今のところ出てくることができるすべてです。袖を引き上げて仕事を始めるのに十分なはずだと思います。それから、あなたがあなたの道で何らかの壁にぶつかったならば、特定の質問で戻って来てください、そして、私はあなたがより特定の答えを得ると確信しています。

お役に立てれば。

71
Edurne Pascual

私が常に使用するソリューションは、すべての可能なメッセージを含むデータベーステーブルを作成することです。メッセージごとに、コード(略称)を使用して検索します。たとえば、次のとおりです。

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ブラウザーによって設定された言語ヘッダーに盲目的に依存しないでください。

7
Geert

最も簡単な言語を使用できます 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);
3
rturkek

私は現在、多言語でなければならない非常に小さなCMSを設計しています。

私が最も懸念する機能の1つは、クライアントが自発的に言語の追加または削除を決定できることです。

このため、データベーステーブルにサフィックスを追加する設計を目指していません。テーブル名を変更したり、動的名を使用してアクセスしたり、言語を定義または削除するたびにフィールドを追加または削除することはできません。

データベースが好きで、それらが管理しやすいという理由だけで、ファイルも使用しません。

最後に、2種類の翻訳を考えます。

  1. Webテキスト。
  2. コンテンツテキスト。

したがって、私の設計の目的は次のとおりです。

  • languajes言語が定義されたテーブル。
  • translations次のように、すべてのメッセージを含む単一のテーブル:
    • [pk] table_nameコンテンツが翻訳されるテーブルの名前。
    • [pk] field_nameコンテンツが翻訳されるフィールドの名前。
    • [pk] row_id翻訳されるアイテムの行識別子。
    • [pk] 言語テキストが翻訳される言語。
    • text翻訳されたテキスト。

つまり、フィールドが単一言語のシナリオでコンテンツを持つテーブルは、常に翻訳テーブルにあるため、コンテンツが無効になります。

これにより、SQLクエリの複雑さが増しますが、翻訳を簡単に維持するツールを開発できます。また、SQLの複雑さは、ソリューションを実装するときに1回だけ存在します。その実装が適切に設計されていれば、サイトのメンテナンス/拡張性は大きな問題である必要はありません。

編集

開発者の友人とのいくつかの会話の後、私がここでアプローチしている解決策は、単一のテーブルであまりにも多くの費用がかかると思います。

これから勉強する別のアプローチは、次のように、各「翻訳可能なテーブル」に追加のテーブルを作成することです。

  • any_translatable_table:そのフィールドのいずれかを翻訳する必要があるテーブル
  • any_translatable_table_translations:翻訳が保存されるテーブル。
    • [pk] field_nameコンテンツが翻訳されるフィールドの名前。
    • [pk] row_id翻訳されるアイテムの行識別子。
    • [pk] 言語テキストが翻訳される言語。
    • text翻訳されたテキスト。

このスキームは、最初のスキームから概念を継承しますが、テーブルごとにコンテンツを分離します。この代替ソリューションは、パフォーマンスを向上させ、問題を(インデックスの問題として)切り分けることができます。

「翻訳可能なテーブル」ごとの追加の変換テーブルは、元のテーブルと同時に作成されます。

SQLクエリについても、複雑さは同じです。最初のアプローチではtranslationsテーブルを検索するためにテーブル名が必要ですが、2番目のアプローチではテーブル名にサフィックス「_translations」を追加するだけです。

1
JoanComasFdz