我将从我的web应用程序中选择的语言传递到具有keyCloakClient.createLoginUrl({locale: locale})
的keycloak登录ui,它正确地将我重定向到:https://localhost/auth/realms/../protocol/openid-connect/auth?....&ui_locales=it
。这显示了区域设置it
中正确的内容。
对于登录表单中显示的密码重置链接,我还在url中添加了ui_locales=it
,它将我重定向到:https://localhost/auth/realms/../login-actions/reset-credentials?....&ui_locales=it
。这还显示了语言环境it
中的正确内容。
问题:
当我将ui_locales=it
添加到提交重置密码请求的提交url (login-reset-password.ftl
中的${url.loginAction?no_esc}
,生成urlhttps://localhost/auth/realms/../login-actions/reset-credentials?..
)并提交表单时,我降落在:https://localhost/auth/realms/../login-actions/authenticate?execution=...
上。url中突然没有ui_locales
,因此内容不会在区域设置it
中进行翻译。
为了测试是否有神奇的重定向,我在启用了保存日志的情况下记录了网络。点击重置密码请求按钮后,只显示一个新条目:https://localhost/auth/realms/../login-actions/reset-credentials?...&ui_locales=it
。
任何想法?
编辑:
当使用错误的凭据提交登录表单时,添加&ui_locales=it
的操作url (${url.loginAction?no_esc}
)也会发生同样的问题。
似乎区域设置查询参数是错误的,因为一段时间见为什么kc_locale和UI语言开关不工作?根据https://www.keycloak.org/docs/latest/release_notes/,在9.0
中对区域设置进行了更改,并在9.0.1
中恢复。从那时起,区域设置就没有新的变化。我使用12.0.4
.
Cookie的方法:
我用JS在我的React登录GUI上创建了CookieKEYCLOAK_LOCALE
,从URL传递了区域设置值。它只在用户第一次登录之前有效。因为然后,Keycloak以某种方式设置相同的Cookie与httpOnly,这样我就不能再用JS读/写Cookie值了。所以我不能在新登录时覆盖Cookie值,也不能读取Cookie值来与React GUI本地化同步。
- 工作usecase:在App中选择语言->重定向到Keycloak login ->设置
KEYCLOAK_LOCALE
Cookie的值从url (Keycloak &GUI语言现在保持同步)->返回App ->更改App语言->重定向到Keycloak login ->Keycloak语言可以通过js在Cookie上更新,因为Cookie不是httpOnly。 - 不工作用例:在App中选择语言->重定向到Keycloak login ->设置
KEYCLOAK_LOCALE
Cookie的值从url (Keycloak &GUI语言现在保持同步)->登录→Keycloak将Cookie更新为httpOnly ->重定向回应用发生了->注销→更改App语言->重定向到Keycloak login ->Keycloak语言不能通过js更新Cookie,因为Cookie是httpOnly。
我通过在重新加载页面之前手动设置template.ftl
中的cookie来修复它。
如果你需要更多的支持请告诉我。
document.addEventListener("DOMContentLoaded", function() {
let locales = 'ui_locales';
document.getElementById("lang-link").addEventListener("click", function() {
let switchTo = ...
document.cookie = 'KEYCLOAK_LOCALE=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;'
document.cookie = 'KEYCLOAK_LOCALE='+ switchTo;
// change the language
const currentUrl = new URL(window.location.href);
currentUrl.searchParams.set(locales, switchTo);
document.location.href = currentUrl;
});
});
```
我已经将这个片段添加到我的代码中:
<script type="text/javascript">
(function() {
if ('URLSearchParams' in window) {
let parameters = new URLSearchParams(location.search);
let locale = parameters.get('ui_locales');
if (locale != null) {
let [language, country] = locale.split('-');
document.cookie = "KEYCLOAK_LOCALE=" + language + "; path=/;";
}
}
})();
</script>
现在登录页面加载我设置KEYCLOAK_LOCALE
从ui_locales
参数