tollmanz
  • 0
Эксперт

Подготовка строки в массиве для локализации

  • 0

Я работаю над плагином для WordPress и хочу убедиться, что весь отображаемый текст подготовлен для локализации. У меня возникли проблемы с локализацией текста, который находится внутри массива.

Например, у меня есть следующий код внутри класса

var $control_type_default = array(
    array(
        'key' => 'automatic',
        'value' => 'Automatic'
    )
);

var $control_types = array(
    array(
        'key' => 'manual',
        'value' => 'Manual'
    )
);

function process_class_vars()
{
    // Add default control type value to beginning of control types array
    $this->control_types = array_merge($this->control_type_default, $this->control_types);

    // Prepare values for localization
    $temp_array = array();
    foreach ($this->control_types as $control_type_array => $values) 
    {
        $temp_array[] = array(
            'key' => $values['key'],
            'value' => __($values['value'], 'my_plugin')
        );
    }
    $this->control_type = $temp_array;
}

Обратите внимание, что функция process_class_vars вызывается конструктором. Как видите, я пытаюсь передать значение в массиве через __() функцию (в качестве примечания я делаю это с помощью функции «process_class_vars», а не при первоначальном создании массивов, потому что я передаю эту функцию, когда я создал массивы изначально выдало ошибку).

Проблема в том, что когда я запускаю это через генератор.po, строки «Автоматически» и «Вручную» полностью пропускаются. Как правильно обработать эти значения?

Share
  1. Вы не можете сделать это, по крайней мере, не из вспомогательного приложения перевода с графическим интерфейсом, потому что они настроены на получение строк из стандартных функций, таких как __() и _e т. д., они не могут читать переменные (включая строковые переменные)

    Вместо этого попробуйте:

    var $control_types = array(
        array(
            'key' => 'manual',
            'value' => __('Manual', 'yourtextdomain')
        )
    );
    

    Но если $control_types это статическая переменная из класса, вы не сможете присвоить возвращаемое значение функции как ее значение. Почему бы не сделать ее обычной переменной внутри метода process_class_vars()? Или просто сделайте это функцией:

    public static function control_types(){
     return
        array(
            'manual' => __('Manual', 'yourtextdomain'),
            ...
        )
    );
    
    ...
    foreach ($this->control_types() as $control_type => $label) 
    {
        // I'm pretty sure you don't need 'key' / and 'value' as key name here either...
        $temp_array[] = array(
            'key' => $control_type,
            'value' => $label,
        );
    }
    
    • 0
    • Итак, я думаю, вы говорите, что я не могу автоматизировать создание файла.po для строк внутри массива. Я должен был бы вручную сделать это? Шаблон программирования разработан по замыслу. Я хотел бы иметь массив как переменную статического класса; однако, когда я делаю то, что вы предлагаете в вашем первом примере кода, я всегда получаю сообщение об ошибке. Затем я не хочу настраивать массив, как вы предлагаете, потому что мне нравится иметь значения по умолчанию как ключ «0». Это облегчает поиск позже в коде. Я согласен, что называть их «ключом» и «значением» немного странно. В тот момент я не мог придумать ничего лучше.

      • 0
    • не для строк — для переменных любого типа, внутри чего угодно, не только массивов. Но вы можете попробовать добавить эти строки в файл.po и скомпилировать его вручную. Должно работать, но как-то некрасиво

      • 0
    • Есть ли лучший способ сделать это тогда? Причина, по которой я собрал значения «автоматически» и «вручную», заключается в том, что я использую их для создания переключателей на странице настроек, а затем для проверки ввода при отправке страницы. Для меня чище собрать эту информацию в одном месте, чем повторять ее снова и снова. Вы бы справились с этим по-другому?

      • 0
    • Вы можете вернуть этот массив из статической функции. Это действительно одно и то же. Или сериализуйте этот массив и определите его как константу. Вероятно, есть много других способов сделать это…

      • 0
    • Спасибо! Я думаю, что это, наконец, щелкнуло. Я заставил его работать, просто определив переменную класса, а затем используя функцию для присвоения массива переменной. Таким образом, я не использую __() оператор foreach внутри, что позволяет мне обернуть каждую метку в функцию и сделать ее доступной для генератора.po. Спасибо!

      • 0

Оставить ответ

You must login to add an answer.