草庐IT

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

coder 2024-05-02 原文

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

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

return always en-GB ?

尽管菜单和面包屑正确遵循语言过滤模块中选定的语言。

最佳答案

见AA>

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

一旦你有了语言,你也可以检索语言环境(例如en-US)。乔姆拉!语言可以有多个区域,这样就可以得到一个数组。
$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),可以使用GETAG()。
$lang = JFactory::getLanguage();
echo 'Current language is: ' . $lang->getTag()

乔姆拉!语言文件工作
首先,让我们解释一下joomla中的语言文件是如何工作的!。如果您对此不感兴趣,请向下滚动以获取php代码。基本原理是,对于每种语言,都使用目录语言中的单独子文件夹。例如:
JOOMLA/language/en-GB
JOOMLA/language/de-DE
JOOMLA/language/fr-FR
JOOMLA/language/nl-NL

在这个文件夹里,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的英语文件!-登录模块。但两次重新加载同一语言文件并不是很有用。但代码显示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是很重要的!引导:语言加载程序将加载任何尚未加载的语言文件。因此,如果核心语言文件是在您自己的版本之后加载的,它实际上会将您自己的更改覆盖回默认值。例如,模板代码在调用实际模块之前执行。这意味着您必须在调用自己的语言文件之前手动调用原始语言文件。
例如,如果要重写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

希望这有帮助。

关于php - Joomla 3 PHP脚本中的语言标记错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32326435/

有关php - Joomla 3 PHP脚本中的语言标记错误的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  4. ruby - 确定 ruby​​ 脚本是否已经在运行 - 2

    有没有一种简单的方法可以判断ruby​​脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免

  5. ruby - ruby 脚本可以预编译成二进制文件吗? - 2

    我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby​​2exe项目可以编译在Windows上运行的ruby​​脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://

  6. ruby-on-rails - Ruby 从 bash 脚本执行中捕获 stderr 输出 - 2

    我目前可以将stdout重定向到ruby​​/rails中的字符串变量,只需在bash中运行命令并将结果设置为我的字符串变量,如下所示。val=%x[#{cmd}]其中cmd是表示bash命令的字符串。但是,这仅捕获stdout,因为我想捕获stderr并将其设置为ruby​​中的字符串——有什么想法吗? 最佳答案 简单地重定向它:val=%x[#{cmd}2>&1]如果您只想从stderr捕获输出,请在将其复制到fd2后关闭stdout的文件描述符。val=%x[#{cmd}2>&1>/dev/null]

  7. ruby - 使用 ruby​​ 从文本中删除 url - 2

    给定一个文本,我想删除url部分并保留其他文本。例子:'blablabla...blablabla...http://bit.ly/someuriblablabla...'成为'blablabla...blablabla...blablabla...'是否有任何ruby​​内置方法可以有效地执行此操作? 最佳答案 尝试使用正则表达式:(?:f|ht)tps?:\/[^\s]+ 关于ruby-使用ruby​​从文本中删除url,我们在StackOverflow上找到一个类似的问题:

  8. ruby - 是否可以从 ruby​​ 脚本返回值并在 c 或 shell 脚本中读取该值? - 2

    我们如何从ruby​​脚本返回值?#!/usr/bin/envrubya="test"a我们如何在Ubuntu终端或java或c中访问'a'的值? 最佳答案 在ruby​​/python脚本中打印你的变量,然后可以通过示例从shell脚本中读取它:#!/bin/bashruby_var=$(rubymyrubyscript.rb)python_var=$(pythonmypythonscript.py)echo"$ruby_var"echo"$python_var"注意你的ruby​​/python脚本只打印这个变量(有更多复杂的方

  9. ruby - 从 FaSTLane 将环境变量传递给 shell 脚本 - 2

    我在跑Fastlane(适用于iOS的持续构建工具)以执行用于解密文件的自定义shell脚本。这是命令。sh"./decrypt.shENV['ENCRYPTION_P12']"我想不出将环境变量传递给该脚本的方法。显然,如果我将密码硬编码到脚本中,它就可以正常工作。sh"./decrypt.shmypwd"有什么建议吗? 最佳答案 从直接Shell中扩展假设这里的sh是一个faSTLane命令,它以给定的参数作为脚本文本调用shell命令:#asafastlanedirectivesh'./decrypt.sh"$ENCRYPTI

  10. ruby - 从 ruby​​ 调用时返回 shell 脚本的状态值? - 2

    我希望这些值匹配。当shell脚本由于某些错误条件而退出时(因此返回非零值),它们不匹配。壳$?返回1,ruby$?返回256。>>%x[lskkr]ls:kkr:Nosuchfileordirectory=>"">>puts$?256=>nil>>exitHadoop:~Madcap$lskkrls:kkr:NosuchfileordirectoryHadoop:~Madcap$echo$?1 最佳答案 在Ruby中$?是一个Process::Status实例。打印$?等同于调用$?.to_s,这等同于$?.to_i.to_s(来

随机推荐