PHP脚本中的Joomla 3错误语言标记

时间:2015-09-01 07:58:38

标签: php joomla

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

<li class="progtrckr-todo" style="content: '\2716'">Two</li>

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

2 个答案:

答案 0 :(得分:2)

请参阅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);

此代码将在当前目录(您的template-directory?)中查找具有以下名称的文件夹,具体取决于当前语言。如果文件不存在,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

希望这会有所帮助。

答案 1 :(得分:0)

我认为如果您尝试访问应用程序之外的语言类,它将无法工作(它将始终返回默认语言)。您可能必须实例化该应用程序。有关更多信息,请参阅此问题:https://joomla.stackexchange.com/questions/5036/function-getlanguage-does-not-return-current-language