Kohana 3中的i18n和错误消息

时间:2010-08-07 10:51:58

标签: php internationalization kohana messages

我正在开发Kohana 3的管理应用程序,我显然正在使用很多表单。

应用程序需要多语言,我对如何管理我的消息文件以及如何访问它们感到非常困惑。

i18n是否支持语言文件夹中的不同文件夹和文件?

E.g:

  • I18N
      • 形式
    • FR
      • 形式

或者它是否支持语言文件中的数组?

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类未检查的错误)?

谢谢。

3 个答案:

答案 0 :(得分:5)

消息/ 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并且效果很好。

答案 1 :(得分:1)

仅使用编写应用程序语言的message files开始。

  • 开发人员只能使用消息文件编写应用程序,并且稍后会担心翻译。
  • I18n文件在左侧翻译文本,在单个文件中翻译右侧的翻译。
  • I18n文件可以通过翻译后端等模块进行解析和编辑。

讯息/ 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',
    ),
);

设置完所有消息后,添加translations

<强> I18N / es.php

<?php

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

当调用Kohana::message()将其包装在__()中时,如果设置了语言,它将尝试使用已翻译的消息:

<强> APPPATH /视图/认证/ 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');

当然手动设置语言并不是很有用。它可以使用:

设置
  • 一个下拉框
  • 浏览器语言

答案 2 :(得分:0)

没有关于如何翻译邮件的良好文档。 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',

这会阻止您在消息文件中使用__()函数,因为它不允许进行缓存。