i18n и сообщения об ошибках в Kohana 3

Я разрабатываю приложение для администрирования с помощью Kohana 3 и, очевидно, работаю с множеством форм.

Приложение должно быть многоязычным, и я очень не понимаю, как управлять своими файлами сообщений и особенно как получить к ним доступ.

Поддерживает ли i18n разные папки и файлы внутри языковой папки?

E.g:

  • i18n
    • en
      • form
    • fr
      • form

Или он поддерживает массивы в языковом файле?

i18n/fr.php

<?php defined('SYSPATH') or die('No direct script access.');

return array
(
   'common_form' => array(
                     'error_type' => 'Error message in French.',
                     'error_type_2' => 'Other error message.',
                    )


)

И если вы можете это сделать, как бы вы получили доступ к этим полям / файлам при переводе сообщения?

Еще я не понимаю, как я могу каким-то образом связать свои переводы с сообщениями об ошибках, которые находятся в папке messages.

Это меня действительно сбивает с толку. Кроме того, как вы обрабатываете ошибки, у которых нет полей (ошибки, которые не проверяются классом Validate)?

Спасибо.


person LBridge    schedule 07.08.2010    source источник
comment
Никогда еще не делал i18n в Кохане, но мне нужно скоро, так что, если вы подождете еще немного, я, возможно, смогу вам помочь. Если вы нашли решение, опубликуйте его здесь в качестве ответа. Спасибо.   -  person alex    schedule 10.08.2010


Ответы (3)


сообщения / validate.php:

return array
(
'upload::not_empty' => __('validate.upload_empty'),
);

i18n / en.php:

return array
(
'validate.upload_empty' => 'Upload must not be empty',
);

i18n / ba.php:

return array
(
'validate.upload_empty' => 'Upload ne moze biti prazan',
);

и т.д. (вы определяете столько правил, сколько хотите).

По крайней мере, это моя практика, я впервые использую i18n, и он хорошо работает.

person Kemo    schedule 10.08.2010
comment
Спасибо, это работает отлично и намного лучше, чем то, что я планировал сделать! - person LBridge; 11.08.2010
comment
Собирался использовать это, но заметил, что он говорит: Не используйте __ () в файлах сообщений, так как эти файлы могут быть кэшированы и не будут работать должным образом. в документации по кохане: kohanaframework.org/3.2/guide/kohana/files/messages - person xylar; 09.05.2012
comment
@xylar согласился, это довольно старый ответ :) хотя на практике вы можете сломать что угодно с помощью кеширования, поэтому это `` решение '' все равно будет работать в меньшем масштабе - person Kemo; 10.05.2012

Начните только с файлов сообщений, написанных на языке, на котором написано приложение.

  • Разработчик может написать приложение, используя только файлы сообщений, и позаботиться о переводах позже.
  • Файлы I18n содержат текст для перевода слева и переводы справа в одном файле.
  • Файлы I18n можно анализировать и редактировать с помощью таких модулей, как бэкэнды для переводчиков.

messages / forms.php

<?php

return array(
    'user' => array(
        'label' => 'Email',
        'title' => 'Enter your email address.',
    ),
    'pass' => array(
        'label' => 'Password',
        'title' => '8 characters or more',
    ),
    'login' => array(
        'label' => 'Log On',
),
    'submit' => array(
        'label' => 'Submit',
    ),
);

После того, как все сообщения настроены, добавьте переводы:

i18n / es.php

<?php

return array(
    'Email' => 'Email',
    'Password' => 'Contraseña',
    'Log On' => 'Acceder',
 );

При вызове Kohana::message() оберните его в _ 4_, чтобы при установке языка оно пыталось использовать переведенное сообщение:

APPPATH / views / Auth / login.php

<label for="user_field"><?php echo __(Kohana::message('forms', 'user.label')); ?></label>
<input type="text" id="user_field" name="user" value="" title="<?php echo __(Kohana::message('forms', 'user.title'); ?>">
<br />
<label for="pass_field"><?php echo __(Kohana::message('forms', 'pass.label')); ?></label>
<input type="password" id="pass_field" name="user" value="" title="<?php echo __(Kohana::message('forms', 'pass.title'); ?>">

Чтобы установить язык, используйте I18n::lang():

I18n::lang('es');

Конечно, установка языка вручную не очень полезна. Его можно установить с помощью:

  • раскрывающийся список
  • язык браузера
person None    schedule 30.05.2014

Нет хорошей документации о том, как переводить сообщения. Класс Message ищет полную строку в классе I18n.

Вот пример того, как перевести системные проверки на немецкий язык. Внутри любого файла /i18n/de.php добавьте:

':field must contain only letters' => ':field darf nur Buchstaben verwenden',
':field must contain only numbers, letters and dashes' => ':field darf nur Zahlen, Buchstaben und Schrägstriche verwenden',
':field must contain only letters and numbers' => ':field darf nur Zahlen und Buchstaben verwenden',
':field must be a color' => ':field muss eine Farbe sein',
':field must be a credit card number' => ':field muss eine Kreditkartennummer sein',
':field must be a date' => ':field muss ein Datum sein',
':field must be a decimal with :param2 places' => ':field muss eine Dezimalzahl mit :param2 Nachkommastellen',
':field must be a digit' => ':field muss eine Zahl sein',
':field must be an email address' => ':field muss eine Email-Adresse sein',
':field must contain a valid email domain' => ':field muss eine korrekte Email Domain beinhalten',
':field must equal :param2' => ':field muss :param2 sein',
':field must be exactly :param2 characters long' => ':field muss genau :param2 Zeichen lang sein',
':field must be one of the available options' => ':field muss eine der verfügbaren Optionen sein',
':field must be an ip address' => ':field muss eine IP-Addresse sein',
':field must be the same as :param3' => ':field muss das gleiche wie :param3 sein',
':field must be at least :param2 characters long' => ':field muss mindestens :param2 Zeichen lang sein',
':field must not exceed :param2 characters long' => ':field darf nicht länger als :param2 Zeichen lang sein',
':field must not be empty' => ':field darf nicht leer sein',
':field must be numeric' => ':field muss eine Zahl sein',
':field must be a phone number' => ':field muss eine Telefonnummer sein',
':field must be within the range of :param2 to :param3' => ':field muss zwischen :param2 und :param3 sein',
':field does not match the required format' => ':field passt nicht zum geforderten Format',
':field must be a url' => ':field muss eine URL sein',

Это не позволяет вам использовать функцию __ () внутри файлов сообщений, потому что она не разрешена для кеширования.

person Matthias Lill    schedule 14.02.2014