我遇到了以下代码,替换了语言文件中的一个变量,但是我希望它可以做多个例如%1,%2,%3等......而不只是一个%s。我尝试调整它来计算行中的每个变量,但是有些不能让它起作用
我的_helper
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
if ( ! function_exists('line_with_arguments'))
{
function line_with_arguments($line, $swap)
{
return str_replace('%s', $swap, $line);
}
}
我的控制器
<?php
class Home extends CI_Controller
{
public function index()
{
$this->lang->load('test', 'english');
$this->load->helper('i18n');
echo line_with_arguments($this->lang->line('test'), 'Matt');
}
}
我的郎文件:
<?php $lang['test'] = 'Hello %s';
答案 0 :(得分:7)
使用vsprintf()
尝试这样的事情:
// Method 1: pass an array
function my_lang($line, $args = array())
{
$CI =& get_instance();
$lang = $CI->lang->line($line);
// $lang = '%s %s were %s';// this would be the language line
return vsprintf($lang, $args);
}
// Outputs "3 users were deleted"
echo my_lang('users.delete_user', array(3, 'users', 'deleted'));
// Method 2: read the arguments
function my_lang2()
{
$CI =& get_instance();
$args = func_get_args();
$line = array_shift($args);
$lang = $CI->lang->line($line);
// $lang = '%s %s were %s';// this would be the language line
return vsprintf($lang, $args);
}
// Outputs "3 users were deleted"
echo my_lang2('users.delete_user', 3, 'users', 'deleted');
使用函数的第一个参数传递行索引,从CI获取正确的行,并将数组作为第二个参数(method1)或其余参数作为每个变量(method2)传递。有关格式化的信息,请参阅sprintf()
上的文档:http://www.php.net/manual/en/function.sprintf.php
CI的原生lang()
函数使用第二个参数传递HTML表单元素id
,并将创建一个<label>
标记 - 如果您问我,请不要使用此函数。如果您不使用标签功能,最好创建一个my_language_helper.php
并覆盖lang()
函数来本地执行此操作,而不是编写新函数。
这是我的实际lang()
函数的样子,我不需要<label>
选项,所以我覆盖了第二个参数来接受字符串或变量数组:
// application/helpers/my_language_helper.php
function lang($line, $vars = array())
{
$CI =& get_instance();
$line = $CI->lang->line($line);
if ($vars)
{
$line = vsprintf($line, (array) $vars);
}
return $line;
}
这样一个小的,容易改变的好处,我希望它是默认的 - 我从不使用lang()
输出<label>
标签,但需要经常将变量传递给它。