sql >> データベース >  >> RDS >> Mysql

ベストプラクティスの多言語Webサイト

    トピックの前提

    多言語サイトには3つの異なる側面があります:

    • インターフェースの翻訳
    • コンテンツ
    • URLルーティング

    それらはすべて異なる方法で相互接続されていますが、CMSの観点からは、異なるUI要素を使用して管理され、異なる方法で保存されます。あなたは最初の2つの実装と理解に自信を持っているようです。質問は後者の側面についてでした-「URL翻訳?これを行うべきかどうか?そしてどのように?」

    URLは何で構成できますか?

    非常に重要なことは、IDN に夢中にならないことです。 。代わりに、音訳 を支持してください (また:転写とローマ字化)。一見IDNは国際URLの実行可能なオプションのように見えますが、実際には2つの理由で宣伝どおりに機能しません。

    • 一部のブラウザは、'ч'のような非ASCII文字を使用します または'ž' '%D1%87'に および'%C5%BE'
    • ユーザーがカスタムテーマを使用している場合、テーマのフォントにはそれらの文字の記号が含まれていない可能性が非常に高くなります

    私は実際に数年前にYiiベースのプロジェクト(恐ろしいフレームワーク、IMHO)でIDNアプローチを試みました。そのソリューションをスクレイピングする前に、上記の両方の問題に遭遇しました。また、攻撃経路の可能性もあると思います。

    利用可能なオプション...私が見ているように。

    基本的に2つの選択肢があり、次のように抽象化できます。

    • http://site.tld/[:query] :ここで[:query] 言語とコンテンツの両方の選択を決定します

    • http://site.tld/[:language]/[:query] :ここで[:language] URLの一部は、言語と[:query]の選択を定義します コンテンツを識別するためにのみ使用されます

    クエリはΑとΩです..

    http://site.tld/[:query]を選択したとします。 。

    その場合、言語の主要なソースが1つあります。それは、[:query]のコンテンツです。 セグメント;および2つの追加ソース:

    • $_COOKIE['lang'] その特定のブラウザ用
    • HTTPAccept-Languageヘッダーの言語のリスト

    まず、クエリを定義済みのルーティングパターンの1つに一致させる必要があります(Laravelを選択した場合は、こちらをお読みください )。パターンの一致が成功したら、言語を見つける必要があります。

    パターンのすべてのセグメントを通過する必要があります。これらすべてのセグメントの潜在的な翻訳を見つけて、使用された言語を特定します。 2つの追加ソース(Cookieとヘッダー)は、ルーティングの競合が発生した場合(「if」ではない場合)に解決するために使用されます。

    例:http://site.tld/blog/novinka

    これは、"блог, новинка"の音訳です。 、それは英語でおよそ"blog", "latest"を意味します 。

    すでにお気づきのように、ロシア語では「блог」は「ブログ」に音訳されます。つまり、[:query]の最初の部分は あなた(ベストケースシナリオ )は['en', 'ru']になります 可能な言語のリスト。次に、次のセグメントである「novinka」を取り上げます。可能性のリストには、['ru']という1つの言語しか含まれていない可能性があります。 。

    リストに1つの項目がある場合、その言語は正常に見つかりました。

    しかし、最終的に2つ(例:ロシア語とウクライナ語)以上の可能性がある場合は、場合によっては0つまたは0の可能性があります。正しいオプションを見つけるには、Cookieやヘッダーを使用する必要があります。

    そして、他のすべてが失敗した場合は、サイトのデフォルト言語を選択します。

    パラメータとしての言語

    別の方法は、http://site.tld/[:language]/[:query]として定義できるURLを使用することです。 。この場合、クエリを翻訳するときに、言語を推測する必要はありません。その時点で、どちらを使用するかがすでにわかっているからです。

    言語の二次情報源もあります:クッキー値。ただし、「コールドスタート」(ユーザーが初めてカスタムクエリでサイトを開いたとき)の場合、考えられる言語の数が不明なため、Accept-Languageヘッダーをいじっても意味がありません。

    代わりに、3つのシンプルで優先順位の高いオプションがあります:

    1. if [:language] セグメントが設定されているので、それを使用します
    2. if $_COOKIE['lang'] 設定されている場合は、それを使用してください
    3. デフォルトの言語を使用する

    言語を知っている場合は、単にクエリを翻訳しようとします。翻訳が失敗した場合は、その特定のセグメントの「デフォルト値」を使用します(ルーティング結果に基づく)。

    ここに3番目のオプションはありませんか?

    はい、技術的には両方のアプローチを組み合わせることができますが、それはプロセスを複雑にし、http://site.tld/en/newsのURLを手動で変更したい人にのみ対応します http://site.tld/de/newsへ ニュースページがドイツ語に変わることを期待してください。

    しかし、この場合でも、Cookie値(以前の言語の選択に関する情報が含まれている)を使用して軽減し、より少ない魔法と希望で実装することができます。

    どのアプローチを使用しますか?

    ご想像のとおり、http://site.tld/[:language]/[:query]をお勧めします。 より賢明な選択肢として。

    また、実際の状況では、URLの3番目の主要部分である「タイトル」があります。オンラインショップの製品名やニュースサイトの記事の見出しのように。

    例:http://site.tld/en/news/article/121415/EU-as-global-reserve-currency

    この場合、'/news/article/121415' クエリであり、'EU-as-global-reserve-currency' タイトルです。純粋にSEOの目的のためです。

    Laravelで実行できますか?

    ちょっとですが、デフォルトではありません。

    私はそれについてあまり詳しくありませんが、私が見たところ、Laravelは単純なパターンベースのルーティングメカニズムを使用しています。多言語URLを実装するには、おそらくコアクラスを拡張する 必要があります。 多言語ルーティングでは、さまざまな形式のストレージ(データベース、キャッシュ、構成ファイル)にアクセスする必要があるためです。

    ルーティングされます。今何?

    すべての結果として、現在の言語と翻訳されたクエリのセグメントという2つの貴重な情報が得られます。これらの値を使用して、結果を生成するクラスにディスパッチできます。

    基本的に、次のURL:http://site.tld/ru/blog/novinka (または'/ru'のないバージョン )は次のようなものになります

    $parameters = [
       'language' => 'ru',
       'classname' => 'blog',
       'method' => 'latest',
    ];
    

    ディスパッチに使用するもの:

    $instance = new {$parameter['classname']};
    $instance->{'get'.$parameters['method']}( $parameters );
    

    ..または特定の実装に応じて、そのバリエーション。



    1. MariaDBでのSPACE()のしくみ

    2. PostgreSQL14の最高の新機能

    3. MariaDB TXとは何ですか?新しいMariaDBMySQLフォークを管理する方法!

    4. 複数のレコードで使用されるMySQLLAST_INSERT_ID()INSERTステートメント