【问题标题】:How to cache user's preferred language on a multi-language website?如何在多语言网站上缓存用户的首选语言?
【发布时间】:2020-12-21 20:28:21
【问题描述】:

大家好!我目前正在为我的个人网站实施多语言。到目前为止,我已经创建了两个 php 文件,其中包含用于德语和英语翻译的数组,然后使用 require_once("")-方法在我的网站上根据所选语言加载它们。在用户更改语言以使用正确的翻译重新加载内容后,我需要重新加载网站。但是在重新加载页面后,选择当然会被重置。我现在的问题是:如何缓存所选语言?

【问题讨论】:

  • 通常您会查看Accept-Language 请求标头。浏览器基本上告诉服务器它喜欢什么语言,并且这个值在每个请求上都是可用的。或者,如果您想覆盖它,只需将所需的选择存储在 cookie 中。
  • 我不喜欢为我做决定的智能页面,让我别无选择。我使用结构——每种语言都有自己的方向,每个页面上都提供了指向其他语言的链接。用户可以为 www.page/en/something 添加书签,如果他/她想更改语言标志链接,则直接重定向到 www/page/other_language/something。没有会话,没有 cookie,没有垃圾
  • @blackblue 但是您必须创建一个页面的大量副本才能将其部署到具有特定翻译的正确目录中,还是我误解了什么?
  • 你误解了一点,我是一名程序员,要制作新的语言版本,我必须将语言代码(如 en、de、la)添加到一个数组中,(当然至少翻译主要的导航术语)并运行一个功能。要修复或更改现有版本,我只需要 - 修复/更改这一功能并运行它。

标签: php html css caching


【解决方案1】:

您可以使用session(或regular cookie)并存储您的语言代码(或您在选择期间使用的任何标识符)。

$_SESSION['loc'] = 'en-us';

然后您可以检查该会话变量。

if(isset($_SESSION['loc']) && $_SESSION['loc'] === 'en-us'){
    //English
} else { 
//Other language, or language not selected
}

你可能也想获取基于浏览器的语言,你可以像这样缓存它:

$lang = strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2));

$accepting = ['en', 'ge'];
$code = in_array($lang, $accepting) ? $lang : 'en';

$_SESSION['localization'] = $code; //Or a regular cookie

【讨论】:

  • 我想我真的很想在这里混合使用这两种解决方案。当没有会话时,使用浏览器的语言加载页面(如果这是受支持的语言,否则为英语),但如果存在会话,则使用与会话关联的语言加载页面。谢谢!
【解决方案2】:

为此我要做的是在会话中设置用户的语言首选项,并将其保存到 cookie 中以进行长期存储。当用户返回时,我的会话类会查找 cookie 并在新会话中设置语言代码。

这是一个使用 Zend_Session 的例子,并且有语言检测,但是保存和检索语言偏好的部分非常简单,你可以适应任何情况。

<?php
class UserSession extends Zend_Session_Namespace
{
    public function __construct($namespace = 'user')
    {
        Zend_Session::start();

        parent::__construct($namespace);

        $defaultLanguageCode = 'EN-US';

        if (empty($this->languageCode) && isset($_COOKIE['userprefs']))
        {
            //Fail silently if the prefs json is corrupt
            try
            {
                $prefs = Zend_Json::decode($_COOKIE['userprefs']);

                $this->languageCode = $prefs['languageCode'];
            }
            catch (Exception $e)
            {
            }
        }

        //Detect language, and set on session if we support it
        if (!isset($this->languageCode))
        {
            $locale = new Zend_Locale();

            $lang = $locale->getLanguage();

            //Reformat
            $lang = strtoupper(str_replace('_', '-', $lang));

            if (!is_null($lang) && $lang != '')
            {
                $languageCode = $defaultLanguageCode;

                $conditions = array(
                    array('active', '=', 1),
                    array('code', '=', $lang)
                );

                $languageFac = Busobj_Language::objFactory($conditions);
                $language    = $languageFac->getFirst();

                if ($language instanceof Busobj_Language)
                {
                    $languageCode = $language->getCode();
                }
                elseif (strpos($lang, '-') !== false)
                {
                    //If we don't get a hit and there is a region in the code, strip back to the lang and try again
                    $lang       = (substr($lang, strpos($lang, '-')));
                    $conditions = array(
                        array('active', '=', 1),
                        array('code', '=', $lang)
                    );

                    $languageFac = Busobj_Language::objFactory($conditions);
                    $language    = $languageFac->getFirst();

                    if ($language instanceof Busobj_Language)
                    {
                        $languageCode = $language->getCode();
                    }
                }

                $this->setLanguageCode($languageCode);
            }
            else
            {
                $this->setLanguageCode($defaultLanguageCode);
            }
        }
    }

    public function sendPrefsCookie()
    {
        $prefs = array(
            'languageCode' => $this->languageCode
        );

        $prefsJson = Zend_Json::encode($prefs);

        setcookie('userprefs', $prefsJson, time() + (60 * 60 * 24 * 365), '/', FW_DOMAIN);
    }

    public function setLanguageCode($languageCode)
    {
        $this->languageCode = $languageCode;
        $this->sendPrefsCookie();
    }

    public function __sleep()
    {
        return array('languageCode');
    }

    public function __wakeup()
    {
    }
}

【讨论】:

  • 听起来是个很棒的解决方案!不幸的是,我对 PHP 不太熟悉,而且我不喜欢在不了解那里所做的事情的情况下复制粘贴,所以我可能会选择目前在此处评论的其他解决方案。但是我绝对会在将来回顾并考虑在我更熟悉 PHP 时实现您的方法 - 谢谢!
猜你喜欢
  • 2020-03-30
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2014-02-26
相关资源
最近更新 更多