まず、問題を解決したプロジェクトの OpenCart システムを取り出しましたが、このトリックは問題なく動作するはずです。
はい、.htaccess で実行できますが、お勧めしません。.htaccess をいじるのは、特定の場所で苦痛になる可能性があります。それを行うと、ある時点で何か間違ったことをしたり、何かを破損したりする可能性が高くなります。これが唯一の解決策ではないため、.htaccess を使用した方法については説明しません。
私がお勧めする解決策は、私が作成したちょっとした回避策/ハックです。サブドメインを使用してそれを行う方法を探しています。これは、Web サイトの多言語バージョンを実行するという Google の優先選択であるためです (もちろん TLD を除く)。
デフォルトの OpenCart 言語の選択/検出を覆す解決策を思いつきました。
まず、OpenCart インストールのルートにある index.php を開きます。
これで行を見つけに行きます:
if (isset($session->data['language']) && array_key_exists($session->data['language'], $languages) && $languages[$session->data['language']]['status']){
$code = $session->data['language'];
} elseif (isset($request->cookie['language']) && array_key_exists($request->cookie['language'], $languages) && $languages[$request->cookie['language']]['status']) {
$code = $request->cookie['language'];
} elseif ($detect) {
$code = $detect;
} else {
$code = $config->get('config_language');
}
次に、これらの行を次のように置き換えます。
$url_info = parse_url(str_replace('&', '&', $config->get('config_url')));
foreach ($languages as $language)
{
if ($language['code'] . '.' . $url_info['host'] == $request->server['HTTP_HOST'])
{
$overwrite_language = $language;
break;
}
}
if (isset($overwrite_language)) {
$code = $overwrite_language['code'];
} elseif (isset($session->data['language']) && array_key_exists($session->data['language'], $languages) && $languages[$session->data['language']]['status']) {
$code = $session->data['language'];
} elseif (isset($request->cookie['language']) && array_key_exists($request->cookie['language'], $languages) && $languages[$request->cookie['language']]['status']) {
$code = $request->cookie['language'];
} elseif ($detect) {
$code = $detect;
} else {
$code = $config->get('config_language');
}
これが何をするか (注: OpenCart は数行前にデータベースから利用可能な言語をロードしました):
データベースから URL を取得し (key = 'config_url' の「設定テーブル」)、PHP 関数 parse_url を使用して URL を分割します (print_r() を実行して、どの部分かを確認します)。
次に、使用可能な言語 (管理パネルで有効になっている言語) をループします。
ループでは、$language['code'] . '.' . $url_info['host']
== $request->server['HTTP_HOST']
(のエイリアス$_SERVER['HTTP_HOST']
) かどうかを確認します。break
ドメインに一致する言語が既に見つかっている場合は、リソースを浪費しないようにを入れました。
OpenCart が上記のステートメントで作成した if elseif etc etc else ステートメントを編集しました。それが行うことは、$overwrite_language が設定されているかどうかをチェックすることです。設定されている場合は、ユーザーが " * 選択した * " 言語を作成しますif
。他のもの(この小さな回避策/ハックを上書きします)。
-- おまけのヒント --
php.ini 設定ファイルにアクセスできる場合、または ini_set() を使用する権限がある場合は、サブドメイン間で PHP セッションを共有できます。
ini_set('session.cookie_domain', '.yourdomain.TLD');
(作成済みのセッションを破棄する必要がある場合があります)。これは利点かもしれませんが、デフォルトのショップ言語を上書きすることに注意してください。ただし、変更したif
ばかりの行の下にある 2 は変更できます。ただし、通貨は通常どおり機能するはずです。
- 仕上げ -
あなたがこの質問をしたのは長い間でしたが、あなたがそれを気に入って使ってくれることを願っています.