Как поместить несколько переменных в языковой файл Codeigniter - PullRequest
3 голосов
/ 26 августа 2011

Я наткнулся на следующий код с заменой одной переменной в языковом файле, однако я хотел бы, чтобы он мог выполнять несколько операций, например % 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';

1 Ответ

7 голосов
/ 26 августа 2011

Попробуйте что-то подобное, используя 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>, но мне нужно часто передавать ему переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...