我添加了“翻译”行为,并且一切正常,可以切换到任何语言,等等。 唯一不起作用的是,当我切换到与在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 俄语:Русскийтитул
因此,您缺少默认语言环境的值。
我可以忽略一些东西吗,有没有更简便的方法可以使这项工作“开箱即用”?
答案 0 :(得分:1)
这是设计使然,转换行为期望默认语言环境的内容存在于源表中,而不是转换表中。这类似于使用翻译功能和语言文件,function calls(源表)包含默认的语言环境消息,而language files(翻译表)包含本地化的消息。
从文档中引用:
TranslateBehavior的基本原理是,您有一个表示默认语言的实体,并且有多个翻译可以覆盖该实体中的某些字段。 [...]
因此该行为以这种方式工作,以便能够保留非覆盖的字段,例如,如果您的源表具有title
和content
字段,并且{{1 }}字段中的}}字段,那么在查询记录content
时,fr_FR
将包含未翻译的(默认语言环境)内容。
另请参见