【问题标题】:i18n and Error messages in Kohana 3Kohana 3 中的 i18n 和错误消息
【发布时间】:2011-03-26 16:48:42
【问题描述】:

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

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

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

例如:

  • i18n
    • zh
      • 表格
    • 法国
      • 表格

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

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

谢谢。

【问题讨论】:

  • 还没有在 Kohana 完成 i18n,但我必须尽快完成,所以如果您能再等一会儿,我或许可以帮助您。如果您找到了解决方案,请在此处发布作为答案。谢谢。

标签: php internationalization kohana messages


【解决方案1】:

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

【讨论】:

  • 谢谢,这很好,比我计划做的要好得多!
  • 本打算使用它,但注意到它说“不要在您的消息文件中使用 __(),因为这些文件可以被缓存并且无法正常工作。”在 kohana 文档中:kohanaframework.org/3.2/guide/kohana/files/messages
  • @xylar 同意,这是一个相当古老的答案 :) 虽然在实践中,您可以通过缓存来破坏任何东西,所以这个“解决方案”仍然可以在较小的范围内工作
【解决方案2】:

仅以message files 开头,以编写应用程序的语言编写。

  • 开发人员可以仅使用消息文件编写应用程序,而无需担心以后的翻译。
  • 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',
    ),
);

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

i18n/es.php

<?php

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

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

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');

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 2012-10-13
      相关资源
      最近更新 更多