Прежде всего, я взял систему OpenCart для проекта, в котором я решил вашу проблему, но этот трюк должен работать просто отлично.
Да, вы можете сделать это с помощью .htaccess, однако я не хочу рекомендовать это делать. Возиться с .htaccess может быть боль в определенном месте. Если вы сделаете это, в какой-то момент вы, скорее всего, будете делать что-то не так и что-то портить. Это не единственное решение, и поэтому я не скажу вам, как это сделать с помощью .htaccess.
Решением, которое я бы порекомендовал, является аккуратный небольшой обходной путь / хак, который я только что сделал. Я искал способ сделать это с поддоменами, так как Google предпочитает делать многоязычные версии веб-сайтов (за исключением, конечно, TLD).
Я предложил решение, которое отменяет выбор / обнаружение языка OpenCart по умолчанию.
Прежде всего откройте index.php в корне вашей установки OpenCart.
Найдите строки с этим:
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, которая разбивает его на части (для этого делаем print_r (), чтобы увидеть какие части).
Затем мы перебираем доступные языки (те, которые включены в панели администратора).
В цикле мы проверяем, является ли $language['code'] . '.' . $url_info['host']
== $request->server['HTTP_HOST']
(псевдоним $_SERVER['HTTP_HOST']
). Я добавил break
, чтобы он прекратил тратить ресурсы, если бы он уже нашел подходящий язык для домена.
Я отредактировал оператор if elseif и т. Д. Else, который OpenCart сделал с вышеупомянутым. Что он делает, так это проверяет, установлен ли $ overwrite_language, если это так, то он делает язык, который пользователь "* выбрал *", так как он нажал if
в операторе if elseif и т. Д. любой другой (который затем перезаписал бы эту небольшую работу / хак).
- Бонусный совет -
Если у вас есть доступ к файлу конфигурации php.ini или у вас есть разрешение на использование ini_set (), то вы можете разделить сеанс PHP между поддоменами
ini_set('session.cookie_domain', '.yourdomain.TLD');
(вам может понадобиться уничтожить уже созданный сеанс). Это может быть преимуществом, однако обратите внимание, что он перезапишет язык магазина по умолчанию, но вы можете изменить 2 if
ниже линий, которые вы только что изменили. Хотя валюты должны работать как обычно.
- Завершение -
Так и должно быть, надеюсь, вам понравится и вы сможете его использовать, даже если вы давно задавали этот вопрос, может быть, кто-то другой мог бы использовать его, как я мог несколько часов назад.