【问题标题】:Joomla 3 wrong language tag in PHP scriptPHP脚本中的Joomla 3错误的语言标签
【发布时间】:2015-09-01 07:58:37
【问题描述】:

我有一个 Joomla 多语言网站 (FR/EN),所有菜单和内容都适用于这两种语言。但是,在我的 PHP 脚本中始终选择 en-GB:

$lang = JFactory::getLanguage();
 $language_tag = $lang->getTag();
 echo($language_tag);

return always en-GB ?

虽然菜单和面包屑正确地遵循语言过滤器模块中选择的语言。

【问题讨论】:

    标签: php joomla


    【解决方案1】:

    getLanguage in JFactory:

    $lang = JFactory::getLanguage();
    echo 'Current language is: ' . $lang->getName();
    

    获得语言后,您还可以检索区域设置/语言代码(例如en-US)。 Joomla!语言可以有多个语言环境,所以你会得到一个数组。

    $lang = JFactory::getLanguage();
    foreach($lang->getLocale()  as  $locale) {
        echo 'This language supports the locale: ' . $locale;
    }
    

    如果出于某种原因,您只对第一个语言环境感兴趣,您可以简单地获取第一个元素。您可能需要一个数组,如下所示:

    $lang = JFactory::getLanguage();
    $locales = $lang->getLocale();
    echo 'This language\'s first locale is: ' . $locales[0];
    

    如果您只想获取选定的语言标签(例如 pt-PT),您可以使用 getTag()

    $lang = JFactory::getLanguage();
    echo 'Current language is: ' . $lang->getTag()
    

    Joomla!语言文件工作

    首先,让我们解释一下语言文件在 Joomla! 中是如何工作的。如果您对此不感兴趣,只需向下滚动查看 PHP 代码。基本原理是,对于每种语言,都使用目录语言中的单独子文件夹。例如:

    JOOMLA/language/en-GB
    JOOMLA/language/de-DE
    JOOMLA/language/fr-FR
    JOOMLA/language/nl-NL
    

    在这个文件夹中,Joomla!核心本身可以翻译,但也可以翻译第三方扩展(组件、模块、插件和模板)。默认情况下,Joomla!附带一个首先加载的核心文件。

    JOOMLA/language/en-GB/en-GB.ini
    

    在此之后,属于其他扩展的语言文件被加载。因此,如果您想对某些翻译进行更改,编辑核心文件是没有意义的,因为它可能会被其他扩展覆盖。此外,编辑核心文件是一种核心技巧,您的所有更改都将被下一个 Joomla 覆盖!升级。

    使用模板覆盖语言字符串

    现在的诀窍是所有扩展(组件、模块、插件、模板)实际上最终加载了模板代码。因此,如果您为特定模板创建语言文件,该语言文件将有机会覆盖以前加载的扩展中的任何语言字符串。

    JOOMLA/language/en-GB/en-GB.tpl_mytheme.ini
    

    重载语言文件

    尽管如此,language/en-GB 文件夹是核心的一部分,在那个文件夹中乱七八糟不是我们想要的。相反,我们使用我们的模板来创建基于 MVC 的组件或模块的模板覆盖。那么为什么不创建一个语言文件的模板覆盖呢?

    这可以通过使用以下代码加载语言文件来实现。此代码可以放在模板的 index.php 文件中的某个位置 - 在本例中,是一个名为 mytheme 的模板。

    $language =& JFactory::getLanguage();
    $extension = 'mod_login';
    $base_dir = JPATH_SITE;
    $language_tag = 'en-GB';
    $language->load($extension, $base_dir, $language_tag, true);
    

    或者这个的简写版本是:

    JFactory::getLanguage()->load('mod_login', JPATH_SITE, 'en-GB', true);
    

    此示例重新加载 Joomla!-login 模块的英语语言文件。但是两次重新加载相同的语言文件并不是很有用。但是代码显示 load() 函数的第二个参数是 Joomla! 所在的基目录。将查找语言文件。

    现在,如果我们创建一个具有以下位置的文件并将 $base_dir 更改为我们自己的模板目录,这将有效地覆盖以前的语言文件:

    $language =& JFactory::getLanguage();
    $extension = 'mod_login';
    $base_dir = dirname(__FILE__);
    $language_tag = $language->getTag(); // loads the current language-tag
    $language->load($extension, $base_dir, $language_tag, true);
    

    文件将是:

    JOOMLA/templates/mytheme/language/en-GB/en-GB.mod_login.ini
    

    添加您自己的自定义语言文件

    但乐趣不止于此。如果您手动加载语言文件,它可以覆盖系统中的任何语言字符串。那么为什么不创建我们自己的自定义语言文件呢?

    $language =& JFactory::getLanguage();
    $language->load('custom' , dirname(__FILE__), $language->getTag(), true);
    

    此代码将在当前目录(您的模板目录?)中查找具有以下名称的文件夹,具体取决于当前语言。如果文件不存在,Joomla!将跳过该文件。

    JOOMLA/templates/mytheme/language/en-GB/en-GB.custom.ini
    JOOMLA/templates/mytheme/language/fr-FR/fr-FR.custom.ini
    JOOMLA/templates/mytheme/language/de-DE/de-DE.custom.ini
    

    这使得可以对语言字符串进行任何更改,而无需进行任何核心破解。很不错。

    了解引导

    重载语言文件时,了解 Joomla! 很重要! bootstrap:语言加载器将加载任何尚未加载的语言文件。因此,如果在您自己的版本之后加载核心语言文件,它实际上会将您自己的更改覆盖回默认值。例如,模板代码在调用实际模块之前执行。这意味着您必须在调用自己的语言文件之前手动调用原始语言文件。

    例如,如果我们要覆盖 mod_poll 的语言文件,使用的代码如下:

    $language =& JFactory::getLanguage();
    $language->load('mod_poll'); // this loads the original
    $language->load('mod_poll', dirname(__FILE__), $language->getTag(), true); // this loads our own version
    

    希望这会有所帮助。

    【讨论】:

    • 问题是,当我想获取所选语言时,它总是返回 en-GB 。``
    【解决方案2】:

    我认为如果你尝试在应用程序之外访问语言类,它是行不通的(它总是会返回默认语言)。您可能必须实例化应用程序。有关更多信息,请参阅此问题:https://joomla.stackexchange.com/questions/5036/function-getlanguage-does-not-return-current-language

    【讨论】:

    • 嗨西蒙,我提出了这个问题,但添加了 $app = JFactory::getApplication('site'); $app->initialise();没有改变任何东西
    • 我的默认语言是FR
    • 这里提供了另一种解决方案:joomla.stackexchange.com/a/7204/5798 似乎 Joomla 3 中外部脚本中的语言检测很痛苦!
    • 我尝试通过使用 JURI 解析 url 以捕获 url 中的 /en/ 或 /fr/ 来尝试类似的操作,但我从未使用 JURI 获取此字符串,即使它返回“简化的 url”是否启用了 SEO。
    • 艾琳。我把 fr 作为元键放在调用我的 php 脚本的菜单中,但是阅读活动菜单的元键什么也没有!我认为 Joomla 3 在外部 php 脚本方面存在一些问题。
    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 2013-11-22
    • 2010-12-07
    • 2011-01-30
    • 1970-01-01
    • 2013-06-26
    • 2013-10-14
    • 2017-12-01
    相关资源
    最近更新 更多