locale for register form

This commit is contained in:
heaven 2026-04-13 22:39:59 +03:00
parent 4539ab5114
commit 96613c7a76
5 changed files with 78 additions and 115 deletions

View file

@ -43,6 +43,24 @@
"register_rate_limited": "Zu viele Versuche. Bitte versuchen Sie es später erneut.", "register_rate_limited": "Zu viele Versuche. Bitte versuchen Sie es später erneut.",
"register_invalid_request": "Ungültige Anfrage. Registrierungsparameter konnten nicht abgerufen werden.", "register_invalid_request": "Ungültige Anfrage. Registrierungsparameter konnten nicht abgerufen werden.",
"register_unsupported": "Diese Anwendung unterstützt keine Registrierung auf diesem Server.", "register_unsupported": "Diese Anwendung unterstützt keine Registrierung auf diesem Server.",
"register_username_label": "Benutzername",
"register_password_label": "Passwort",
"register_confirm_password_label": "Passwort bestätigen",
"register_button": "Registrieren",
"register_token_label": "Registrierungstoken",
"register_token_optional_label": "Registrierungstoken (optional)",
"register_email_label": "E-Mail",
"register_email_optional_label": "E-Mail (optional)",
"register_terms": "Ich akzeptiere die <termsLink>Nutzungsbedingungen</termsLink> des Servers.",
"register_error_user_taken": "Dieser Benutzername ist bereits vergeben.",
"register_error_user_invalid": "Dieser Benutzername enthält ungültige Zeichen.",
"register_error_user_exclusive": "Dieser Benutzername ist reserviert.",
"register_error_password_weak": "Schwaches Passwort. Vom Server abgelehnt, bitte wählen Sie ein stärkeres.",
"register_error_password_short": "Kurzes Passwort. Vom Server abgelehnt, bitte wählen Sie ein längeres.",
"register_error_rate_limited": "Registrierung fehlgeschlagen. Zu viele Anfragen, bitte versuchen Sie es später erneut.",
"register_error_forbidden": "Registrierung fehlgeschlagen. Der Server erlaubt keine Registrierung.",
"register_error_invalid_request": "Registrierung fehlgeschlagen. Ungültige Anfrage.",
"register_error_unknown": "Registrierung fehlgeschlagen. Unbekannter Fehler.",
"reset_description": "Der Homeserver <strong>{{server}}</strong> sendet Ihnen eine E-Mail, um Ihr Passwort zurückzusetzen.", "reset_description": "Der Homeserver <strong>{{server}}</strong> sendet Ihnen eine E-Mail, um Ihr Passwort zurückzusetzen.",
"reset_email_label": "E-Mail", "reset_email_label": "E-Mail",
"reset_new_password": "Neues Passwort", "reset_new_password": "Neues Passwort",

View file

@ -43,6 +43,24 @@
"register_rate_limited": "Too many attempts. Please try again later.", "register_rate_limited": "Too many attempts. Please try again later.",
"register_invalid_request": "Invalid request. Failed to get registration parameters.", "register_invalid_request": "Invalid request. Failed to get registration parameters.",
"register_unsupported": "This application does not support registration on this server.", "register_unsupported": "This application does not support registration on this server.",
"register_username_label": "Username",
"register_password_label": "Password",
"register_confirm_password_label": "Confirm Password",
"register_button": "Register",
"register_token_label": "Registration Token",
"register_token_optional_label": "Registration Token (Optional)",
"register_email_label": "Email",
"register_email_optional_label": "Email (Optional)",
"register_terms": "I accept the server <termsLink>Terms and Conditions</termsLink>.",
"register_error_user_taken": "This username is already taken.",
"register_error_user_invalid": "This username contains invalid characters.",
"register_error_user_exclusive": "This username is reserved.",
"register_error_password_weak": "Weak password. Password rejected by server, please choose a stronger one.",
"register_error_password_short": "Short password. Password rejected by server, please choose a longer one.",
"register_error_rate_limited": "Failed to register. Your request has been rate-limited, please try again later.",
"register_error_forbidden": "Failed to register. The homeserver does not permit registration.",
"register_error_invalid_request": "Failed to register. Invalid request.",
"register_error_unknown": "Failed to register. Unknown reason.",
"reset_description": "Homeserver <strong>{{server}}</strong> will send you an email to let you reset your password.", "reset_description": "Homeserver <strong>{{server}}</strong> will send you an email to let you reset your password.",
"reset_email_label": "Email", "reset_email_label": "Email",
"reset_new_password": "New Password", "reset_new_password": "New Password",

View file

@ -43,6 +43,24 @@
"register_rate_limited": "Слишком много попыток. Попробуйте позже.", "register_rate_limited": "Слишком много попыток. Попробуйте позже.",
"register_invalid_request": "Неверный запрос. Не удалось получить параметры регистрации.", "register_invalid_request": "Неверный запрос. Не удалось получить параметры регистрации.",
"register_unsupported": "Это приложение не поддерживает регистрацию на данном сервере.", "register_unsupported": "Это приложение не поддерживает регистрацию на данном сервере.",
"register_username_label": "Имя пользователя",
"register_password_label": "Пароль",
"register_confirm_password_label": "Подтвердите пароль",
"register_button": "Зарегистрироваться",
"register_token_label": "Токен регистрации",
"register_token_optional_label": "Токен регистрации (необязательно)",
"register_email_label": "Email",
"register_email_optional_label": "Email (необязательно)",
"register_terms": "Я принимаю <termsLink>Условия использования</termsLink> сервера.",
"register_error_user_taken": "Это имя пользователя уже занято.",
"register_error_user_invalid": "Имя пользователя содержит недопустимые символы.",
"register_error_user_exclusive": "Это имя пользователя зарезервировано.",
"register_error_password_weak": "Слабый пароль. Сервер отклонил пароль, выберите более надёжный.",
"register_error_password_short": "Короткий пароль. Сервер отклонил пароль, выберите более длинный.",
"register_error_rate_limited": "Не удалось зарегистрироваться. Слишком много попыток, попробуйте позже.",
"register_error_forbidden": "Не удалось зарегистрироваться. Сервер не разрешает регистрацию.",
"register_error_invalid_request": "Не удалось зарегистрироваться. Неверный запрос.",
"register_error_unknown": "Не удалось зарегистрироваться. Неизвестная ошибка.",
"reset_description": "Сервер <strong>{{server}}</strong> отправит вам письмо для сброса пароля.", "reset_description": "Сервер <strong>{{server}}</strong> отправит вам письмо для сброса пароля.",
"reset_email_label": "Email", "reset_email_label": "Email",
"reset_new_password": "Новый пароль", "reset_new_password": "Новый пароль",

View file

@ -1,94 +0,0 @@
import { Avatar, AvatarImage, Box, Button, Text } from 'folds';
import { IIdentityProvider, SSOAction, createClient } from 'matrix-js-sdk';
import React, { useMemo } from 'react';
import { useAutoDiscoveryInfo } from '../../hooks/useAutoDiscoveryInfo';
type SSOLoginProps = {
providers?: IIdentityProvider[];
redirectUrl: string;
action?: SSOAction;
saveScreenSpace?: boolean;
};
export function SSOLogin({ providers, redirectUrl, action, saveScreenSpace }: SSOLoginProps) {
const discovery = useAutoDiscoveryInfo();
const baseUrl = discovery['m.homeserver'].base_url;
const mx = useMemo(() => createClient({ baseUrl }), [baseUrl]);
const getSSOIdUrl = (ssoId?: string): string =>
mx.getSsoLoginUrl(redirectUrl, 'sso', ssoId, action);
const withoutIcon = providers
? providers.find(
(provider) => !provider.icon || !mx.mxcUrlToHttp(provider.icon, 96, 96, 'crop', false)
)
: true;
const renderAsIcons = withoutIcon ? false : saveScreenSpace && providers && providers.length > 2;
return (
<Box justifyContent="Center" gap="600" wrap="Wrap">
{providers ? (
providers.map((provider) => {
const { id, name, icon } = provider;
const iconUrl = icon && mx.mxcUrlToHttp(icon, 96, 96, 'crop', false);
const buttonTitle = `Continue with ${name}`;
if (renderAsIcons) {
return (
<Avatar
style={{ cursor: 'pointer' }}
key={id}
as="a"
href={getSSOIdUrl(id)}
aria-label={buttonTitle}
size="300"
radii="300"
>
<AvatarImage src={iconUrl!} alt={name} title={buttonTitle} />
</Avatar>
);
}
return (
<Button
style={{ width: '100%' }}
key={id}
as="a"
href={getSSOIdUrl(id)}
size="500"
variant="Secondary"
fill="Soft"
outlined
before={
iconUrl && (
<Avatar size="200" radii="300">
<AvatarImage src={iconUrl} alt={name} />
</Avatar>
)
}
>
<Text align="Center" size="B500" truncate>
{buttonTitle}
</Text>
</Button>
);
})
) : (
<Button
style={{ width: '100%' }}
as="a"
href={getSSOIdUrl()}
size="500"
variant="Secondary"
fill="Soft"
outlined
>
<Text align="Center" size="B500" truncate>
Continue with SSO
</Text>
</Button>
)}
</Box>
);
}

View file

@ -11,6 +11,7 @@ import {
color, color,
} from 'folds'; } from 'folds';
import React, { ChangeEventHandler, useCallback, useMemo, useState } from 'react'; import React, { ChangeEventHandler, useCallback, useMemo, useState } from 'react';
import { Trans, useTranslation } from 'react-i18next';
import { import {
AuthDict, AuthDict,
AuthType, AuthType,
@ -184,6 +185,7 @@ export function PasswordRegisterForm({
defaultEmail, defaultEmail,
defaultRegisterToken, defaultRegisterToken,
}: PasswordRegisterFormProps) { }: PasswordRegisterFormProps) {
const { t } = useTranslation();
const serverDiscovery = useAutoDiscoveryInfo(); const serverDiscovery = useAutoDiscoveryInfo();
const baseUrl = serverDiscovery['m.homeserver'].base_url; const baseUrl = serverDiscovery['m.homeserver'].base_url;
const mx = useMemo(() => createClient({ baseUrl }), [baseUrl]); const mx = useMemo(() => createClient({ baseUrl }), [baseUrl]);
@ -259,7 +261,7 @@ export function PasswordRegisterForm({
<Box as="form" onSubmit={handleSubmit} direction="Inherit" gap="400"> <Box as="form" onSubmit={handleSubmit} direction="Inherit" gap="400">
<Box direction="Column" gap="100"> <Box direction="Column" gap="100">
<Text as="label" size="L400" priority="300"> <Text as="label" size="L400" priority="300">
Username {t('Auth.register_username_label')}
</Text> </Text>
<Input <Input
variant="Background" variant="Background"
@ -270,13 +272,13 @@ export function PasswordRegisterForm({
required required
/> />
{registerError?.errcode === RegisterError.UserTaken && ( {registerError?.errcode === RegisterError.UserTaken && (
<FieldError message="This username is already taken." /> <FieldError message={t('Auth.register_error_user_taken')} />
)} )}
{registerError?.errcode === RegisterError.UserInvalid && ( {registerError?.errcode === RegisterError.UserInvalid && (
<FieldError message="This username contains invalid characters." /> <FieldError message={t('Auth.register_error_user_invalid')} />
)} )}
{registerError?.errcode === RegisterError.UserExclusive && ( {registerError?.errcode === RegisterError.UserExclusive && (
<FieldError message="This username is reserved." /> <FieldError message={t('Auth.register_error_user_exclusive')} />
)} )}
</Box> </Box>
<ConfirmPasswordMatch initialValue> <ConfirmPasswordMatch initialValue>
@ -284,7 +286,7 @@ export function PasswordRegisterForm({
<> <>
<Box direction="Column" gap="100"> <Box direction="Column" gap="100">
<Text as="label" size="L400" priority="300"> <Text as="label" size="L400" priority="300">
Password {t('Auth.register_password_label')}
</Text> </Text>
<PasswordInput <PasswordInput
ref={passRef} ref={passRef}
@ -299,7 +301,7 @@ export function PasswordRegisterForm({
<FieldError <FieldError
message={ message={
registerError.data.error ?? registerError.data.error ??
'Weak Password. Password rejected by server please choosing more strong Password.' t('Auth.register_error_password_weak')
} }
/> />
)} )}
@ -307,14 +309,14 @@ export function PasswordRegisterForm({
<FieldError <FieldError
message={ message={
registerError.data.error ?? registerError.data.error ??
'Short Password. Password rejected by server please choosing more long Password.' t('Auth.register_error_password_short')
} }
/> />
)} )}
</Box> </Box>
<Box direction="Column" gap="100"> <Box direction="Column" gap="100">
<Text as="label" size="L400" priority="300"> <Text as="label" size="L400" priority="300">
Confirm Password {t('Auth.register_confirm_password_label')}
</Text> </Text>
<PasswordInput <PasswordInput
ref={confPassRef} ref={confPassRef}
@ -334,8 +336,8 @@ export function PasswordRegisterForm({
<Box direction="Column" gap="100"> <Box direction="Column" gap="100">
<Text as="label" size="L400" priority="300"> <Text as="label" size="L400" priority="300">
{requiredStageInFlows(uiaFlows, AuthType.RegistrationToken) {requiredStageInFlows(uiaFlows, AuthType.RegistrationToken)
? 'Registration Token' ? t('Auth.register_token_label')
: 'Registration Token (Optional)'} : t('Auth.register_token_optional_label')}
</Text> </Text>
<Input <Input
variant="Background" variant="Background"
@ -350,7 +352,9 @@ export function PasswordRegisterForm({
{hasStageInFlows(uiaFlows, AuthType.Email) && ( {hasStageInFlows(uiaFlows, AuthType.Email) && (
<Box direction="Column" gap="100"> <Box direction="Column" gap="100">
<Text as="label" size="L400" priority="300"> <Text as="label" size="L400" priority="300">
{requiredStageInFlows(uiaFlows, AuthType.Email) ? 'Email' : 'Email (Optional)'} {requiredStageInFlows(uiaFlows, AuthType.Email)
? t('Auth.register_email_label')
: t('Auth.register_email_optional_label')}
</Text> </Text>
<Input <Input
variant="Background" variant="Background"
@ -368,30 +372,29 @@ export function PasswordRegisterForm({
<Box alignItems="Center" gap="200"> <Box alignItems="Center" gap="200">
<Checkbox name="termsInput" size="300" variant="Primary" required /> <Checkbox name="termsInput" size="300" variant="Primary" required />
<Text size="T300"> <Text size="T300">
I accept server{' '} <Trans
<a href={termUrl} target="_blank" rel="noreferrer"> i18nKey="Auth.register_terms"
Terms and Conditions components={{ termsLink: <a href={termUrl} target="_blank" rel="noreferrer" /> }}
</a> />
.
</Text> </Text>
</Box> </Box>
)} )}
{registerError?.errcode === RegisterError.RateLimited && ( {registerError?.errcode === RegisterError.RateLimited && (
<FieldError message="Failed to register. Your register request has been rate-limited by server, Please try after some time." /> <FieldError message={t('Auth.register_error_rate_limited')} />
)} )}
{registerError?.errcode === RegisterError.Forbidden && ( {registerError?.errcode === RegisterError.Forbidden && (
<FieldError message="Failed to register. The homeserver does not permit registration." /> <FieldError message={t('Auth.register_error_forbidden')} />
)} )}
{registerError?.errcode === RegisterError.InvalidRequest && ( {registerError?.errcode === RegisterError.InvalidRequest && (
<FieldError message="Failed to register. Invalid request." /> <FieldError message={t('Auth.register_error_invalid_request')} />
)} )}
{registerError?.errcode === RegisterError.Unknown && ( {registerError?.errcode === RegisterError.Unknown && (
<FieldError message={registerError.data.error ?? 'Failed to register. Unknown Reason.'} /> <FieldError message={registerError.data.error ?? t('Auth.register_error_unknown')} />
)} )}
<span data-spacing-node /> <span data-spacing-node />
<Button variant="Primary" size="500" type="submit"> <Button variant="Primary" size="500" type="submit">
<Text as="span" size="B500"> <Text as="span" size="B500">
Register {t('Auth.register_button')}
</Text> </Text>
</Button> </Button>
</Box> </Box>