CakePHP 3.6.10转换行为不显示“ defaultLocale”值

时间:2018-08-24 08:36:40

标签: cakephp translate

我添加了“翻译”行为,并且一切正常,可以切换到任何语言,等等。 唯一不起作用的是,当我切换到与在app.php中设置为defaultLocale的语言相同的语言时:

class LoginManagerMock: LoginManagerProtocol {

    var mock_loginWithCredentials: ((String, String) -> Void)?
    func loginWithCredentials(login: String, password: String) {
        mock_loginWithCredentials?(login, password)
    }
}

class LoginViewModelTests: XCTest {

    func test_loginUser_shouldPassCredentials_toLoginManager() {
        // Arrange
        let sampleLogin = "login"
        let samplePassword = "password"

        let loginManagerMock = LoginManagerMock()
        var capturedCredentials: (login: String, password: String)?

        loginManagerMock.mock_loginWithCredentials = { login, password in 
            capturedCredentials = (login, password)
        }

        // Act
        let sut = LoginViewModel(loginManager: loginManagerMock)
        sut.loginUser(with: sampleLogin, password: samplePassword)

        // Assert
        XCTAssertEqual(sampleLogin, capturedCredentials.login)
        XCTAssertEqual(samplePassword, capturedCredentials.password)
    }
}

我没有翻译的字段。

当我删除“ defaultLocale”设置时,它适用于所有语言。

有人可以告诉我这里出了什么问题吗?

@ndm谢谢,这非常有帮助。但是现在我遇到了另一个问题。那是如何制作多语言输入形式的?所以我有4种语言(语言环境):en_US,nl_BE,fr_BE,de_BE和ru_RU。 defaultLocale为en_US。为了添加新记录,我做了:

'App' => [
    ...
    'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
    ...
],

这很好。尽管我不确定这是否是正确的选择?

但是在VIEW中(使用禁用的表单)并编辑defaultLocale字段

// for the defaultLocale
echo $this->Form->control('title');
// for all other languages I iterate over every language except of the defaultLocale
foreach ($supported_locales as $key => $val):
    if ($key !== $default_locale):
        echo $this->Form->control('_translations.' . $key . '.title');
    endif;
endforeach;

显示当时所选语言环境的转换值,而不是保存在源表中的defaultLocale。 F.e.当您那时将语言切换为俄语时,您会看到:

英语:Русскийтитул 荷兰语:Nederlandse titel 法语:Titrefrançais Deutsch:Deutscher Titel 俄语:Русскийтитул

因此,您缺少默认语言环境的值。

我可以忽略一些东西吗,有没有更简便的方法可以使这项工作“开箱即用”?

1 个答案:

答案 0 :(得分:1)

这是设计使然,转换行为期望默认语言环境的内容存在于源表中,而不是转换表中。这类似于使用翻译功能和语言文件,function calls(源表)包含默认的语言环境消息,而language files(翻译表)包含本地化的消息。

从文档中引用:

  

TranslateBehavior的基本原理是,您有一个表示默认语言的实体,并且有多个翻译可以覆盖该实体中的某些字段。 [...]

因此该行为以这种方式工作,以便能够保留非覆盖的字段,例如,如果您的源表具有titlecontent字段,并且{{1 }}字段中的}}字段,那么在查询记录content时,fr_FR将包含未翻译的(默认语言环境)内容。

另请参见