Use Java mechanisms to read language files and default to UTF-8 (#21755)

Closes #21753
This commit is contained in:
Alexander Schwartz 2023-08-01 11:27:10 +02:00 committed by GitHub
parent 3dc339db11
commit 748c53df7f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
125 changed files with 102 additions and 334 deletions

View file

@ -13,6 +13,9 @@ include::topics/templates/document-attributes.adoc[]
:release_header_latest_link: {releasenotes_link_latest}
include::topics/templates/release-header.adoc[]
== {project_name_full} 23.0.0
include::topics/23_0_0.adoc[leveloffset=2]
== {project_name_full} 22.0.0
include::topics/22_0_0.adoc[leveloffset=2]

View file

@ -0,0 +1,7 @@
= Localization files for themes default to UTF-8 encoding
Message properties files for themes are now read in UTF-8 encoding, with an automatic fallback to ISO-8859-1 encoding.
See the migration guide for more details.

View file

@ -302,14 +302,11 @@ locales=en,no
----
locale_no=Norsk
----
+
By default message properties files should be encoded using ISO-8859-1. It's also possible to specify the encoding using a special header. For example to use UTF-8 encoding:
+
[source]
----
# encoding: UTF-8
usernameOrEmail=....
----
By default, message properties files should be encoded using UTF-8.
Keycloak falls back to ISO-8859-1 handling if it can't read the contents as UTF-8.
Unicode characters can be escaped as described in Java's documentation for https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/PropertyResourceBundle.html[PropertyResourceBundle].
Previous versions of Keycloak supported specifying the encoding in the first line with a comment like `# encoding: UTF-8`, which is no longer supported.
[role="_additional-resources"]
.Additional resources

View file

@ -14,9 +14,19 @@ which can be turned on to prevent adding the `iss` parameter to the authenticati
= Wildcard characters handling
JPA allows wildcards `%` and `_` when searching, while other providers like LDAP allow only `*`.
As `*` is a natural wildcard character in LDAP, it works in all places, while with JPA it only
worked at the beginning and the end of the search string. Starting with this release the only
wildcard character is `*` which work consistently across all providers in all places in the search
string. All special characters in a specific provider like `%` and `_` for JPA are escaped. For exact
JPA allows wildcards `%` and `_` when searching, while other providers like LDAP allow only `*`.
As `*` is a natural wildcard character in LDAP, it works in all places, while with JPA it only
worked at the beginning and the end of the search string. Starting with this release the only
wildcard character is `*` which work consistently across all providers in all places in the search
string. All special characters in a specific provider like `%` and `_` for JPA are escaped. For exact
search, with added quotes e.g. `"w*ord"`, the behavior remains the same as in previous releases.
= Language files for themes default to UTF-8 encoding
This release now follows the standard mechanisms of Java and later, which assumes resource bundle files to be encoded in UTF-8.
Previous versions of Keycloak supported specifying the encoding in the first line with a comment like `# encoding: UTF-8`, which is no longer supported and is ignored.
Message properties files for themes are now read in UTF-8 encoding, with an automatic fallback to ISO-8859-1 encoding.
If you are using a different encoding, convert the files to UTF-8.

View file

@ -22,10 +22,7 @@ import org.keycloak.services.util.LocaleUtil;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;
@ -72,9 +69,8 @@ public class ClassLoaderTheme implements Theme {
URL p = classLoader.getResource(themeRoot + "theme.properties");
if (p != null) {
Charset encoding = PropertiesUtil.detectEncoding(p.openStream());
try (Reader reader = new InputStreamReader(p.openStream(), encoding)) {
properties.load(reader);
try (InputStream stream = p.openStream()) {
PropertiesUtil.readCharsetAware(properties, stream);
}
this.parentName = properties.getProperty("parent");
this.importName = properties.getProperty("import");
@ -143,11 +139,10 @@ public class ClassLoaderTheme implements Theme {
}
Properties m = new Properties();
URL url = classLoader.getResource(this.messageRoot + baseBundlename + "_" + locale.toString() + ".properties");
URL url = classLoader.getResource(this.messageRoot + baseBundlename + "_" + locale + ".properties");
if (url != null) {
Charset encoding = PropertiesUtil.detectEncoding(url.openStream());
try (Reader reader = new InputStreamReader(url.openStream(), encoding)) {
m.load(reader);
try (InputStream stream = url.openStream()) {
PropertiesUtil.readCharsetAware(m, stream);
}
}
return m;

View file

@ -2,10 +2,7 @@ package org.keycloak.theme;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Locale;
import java.util.Properties;
@ -71,10 +68,8 @@ public class ClasspathThemeResourceProviderFactory implements ThemeResourceProvi
protected void loadMessages(Properties messages, URL resource) throws IOException {
if (resource != null) {
Charset encoding = PropertiesUtil.detectEncoding(resource.openStream());
// detectEncoding closes the stream
try (Reader reader = new InputStreamReader(resource.openStream(), encoding)) {
messages.load(reader);
try (InputStream stream = resource.openStream()) {
PropertiesUtil.readCharsetAware(messages, stream);
}
}
}

View file

@ -21,17 +21,15 @@ import org.keycloak.models.RealmModel;
import org.keycloak.services.util.LocaleUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Pattern;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@ -53,10 +51,9 @@ public class FolderTheme implements Theme {
this.properties = new Properties();
File propertiesFile = new File(themeDir, "theme.properties");
if (propertiesFile .isFile()) {
Charset encoding = PropertiesUtil.detectEncoding(new FileInputStream(propertiesFile));
try (Reader reader = new InputStreamReader(new FileInputStream(propertiesFile), encoding)) {
properties.load(reader);
if (propertiesFile.isFile()) {
try (InputStream stream = Files.newInputStream(propertiesFile.toPath())) {
PropertiesUtil.readCharsetAware(properties, stream);
}
parentName = properties.getProperty("parent");
importName = properties.getProperty("import");
@ -110,6 +107,8 @@ public class FolderTheme implements Theme {
return getMessages("messages", locale);
}
private static final Pattern LEGAL_LOCALE = Pattern.compile("[a-zA-Z0-9-_]*");
@Override
public Properties getMessages(String baseBundlename, Locale locale) throws IOException {
if (locale == null){
@ -118,11 +117,16 @@ public class FolderTheme implements Theme {
Properties m = new Properties();
File file = new File(themeDir, "messages" + File.separator + baseBundlename + "_" + locale.toString() + ".properties");
String filename = baseBundlename + "_" + locale;
if (!LEGAL_LOCALE.matcher(filename).matches()) {
throw new RuntimeException("Found illegal characters in locale or bundle name: " + filename);
}
File file = new File(themeDir, "messages" + File.separator + filename + ".properties");
if (file.isFile()) {
Charset encoding = PropertiesUtil.detectEncoding(new FileInputStream(file));
try (Reader reader = new InputStreamReader(new FileInputStream(file), encoding)) {
m.load(reader);
try (InputStream stream = Files.newInputStream(file.toPath())) {
PropertiesUtil.readCharsetAware(m, stream);
}
}
return m;

View file

@ -17,56 +17,36 @@
package org.keycloak.theme;
import org.jboss.logging.Logger;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.Reader;
import java.util.Enumeration;
import java.util.Properties;
import java.util.PropertyResourceBundle;
/**
* @author <a href="mailto:wadahiro@gmail.com">Hiroyuki Wada</a>
*/
public class PropertiesUtil {
private static final Logger logger = Logger.getLogger(PropertiesUtil.class);
public static final Pattern DETECT_ENCODING_PATTERN = Pattern.compile("^#\\s*encoding:\\s*([\\w.:-]+)",
Pattern.CASE_INSENSITIVE);
public static final Charset DEFAULT_ENCODING = Charset.forName("ISO-8859-1");
/**
* <p>
* Detect file encoding from the first line of the property file. If the first line in the file doesn't contain the
* comment with the encoding, it uses ISO-8859-1 as default encoding for backwards compatibility.
* </p>
* <p>
* The specified stream is closed before this method returns.
* </p>
*
* @param in The input stream
* @return Encoding
* @throws IOException
* Read a properties file either UTF-8 or if that doesn't work in ISO-8895-1 format.
* This utilizes the functionality present in JDK 9 to automatically detect the encoding of the resource.
* A user can specify the standard Java system property <code>java.util.PropertyResourceBundle.encoding</code>
* to change this.
* <p />
* Unfortunately the standard {@link Properties#load(Reader)} doesn't support this automatic decoding,
* as it is only been implemented for resource files.
*
* @see PropertyResourceBundle
*/
public static Charset detectEncoding(InputStream in) throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(in, DEFAULT_ENCODING))) {
String firstLine = br.readLine();
if (firstLine != null) {
Matcher matcher = DETECT_ENCODING_PATTERN.matcher(firstLine);
if (matcher.find()) {
String encoding = matcher.group(1);
if (Charset.isSupported(encoding)) {
return Charset.forName(encoding);
} else {
logger.warnv("Unsupported encoding: {0}", encoding);
}
}
}
public static void readCharsetAware(Properties properties, InputStream stream) throws IOException {
PropertyResourceBundle propertyResourceBundle = new PropertyResourceBundle(stream);
Enumeration<String> keys = propertyResourceBundle.getKeys();
while(keys.hasMoreElements()) {
String s = keys.nextElement();
properties.put(s, propertyResourceBundle.getString(s));
}
return DEFAULT_ENCODING;
}
}

View file

@ -20,36 +20,47 @@ package org.keycloak.theme;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Properties;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
/**
* @author <a href="mailto:wadahiro@gmail.com">Hiroyuki Wada</a>
*/
public class PropertiesUtilTest {
@Test
public void testDetectEncoding() throws Exception {
Charset encoding = PropertiesUtil.detectEncoding(new ByteArrayInputStream("# encoding: utf-8\nkey=value".getBytes()));
assertEquals(Charset.forName("utf-8"), encoding);
String valueWithUmlaut = "Umlaut: \u00E4\u00F6\u00FC";
encoding = PropertiesUtil.detectEncoding(new ByteArrayInputStream("# encoding: Shift_JIS\nkey=value".getBytes()));
assertEquals(Charset.forName("Shift_JIS"), encoding);
String key = "key";
String propertyLine = key + "=" + valueWithUmlaut;
@Test
public void testEncodingIso() throws Exception {
testWithEncoding(StandardCharsets.ISO_8859_1);
}
@Test
public void testDefaultEncoding() throws Exception {
Charset encoding = PropertiesUtil.detectEncoding(new ByteArrayInputStream("key=value".getBytes()));
assertEquals(Charset.forName("ISO-8859-1"), encoding);
encoding = PropertiesUtil.detectEncoding(new ByteArrayInputStream("# encoding: unknown\nkey=value".getBytes()));
assertEquals(Charset.forName("ISO-8859-1"), encoding);
encoding = PropertiesUtil.detectEncoding(new ByteArrayInputStream("\n# encoding: utf-8\nkey=value".getBytes()));
assertEquals(Charset.forName("ISO-8859-1"), encoding);
encoding = PropertiesUtil.detectEncoding(new ByteArrayInputStream("".getBytes()));
assertEquals(Charset.forName("ISO-8859-1"), encoding);
public void testEncodingUtf8() throws Exception {
testWithEncoding(StandardCharsets.UTF_8);
}
@Test
public void testIfValueContainsSpecialCharacters() {
assertNotEquals(valueWithUmlaut.getBytes(StandardCharsets.UTF_8), valueWithUmlaut.getBytes(StandardCharsets.ISO_8859_1));
}
private void testWithEncoding(Charset charset) throws IOException {
Properties p = new Properties();
try (InputStream stream = new ByteArrayInputStream(propertyLine.getBytes(charset))) {
PropertiesUtil.readCharsetAware(p, stream);
}
assertEquals(p.get(key), valueWithUmlaut);
}
}

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=حفظ
doCancel=إلغاء
doLogOutAllSessions=تسجيل الخروج لجميع الجلسات

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Desa
doCancel=Cancel·la
doLogOutAllSessions=Desconnecta de totes les sessions

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Uložit
doCancel=Zrušit
doLogOutAllSessions=Odhlásit všechny relace

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Gem
doCancel=Annuller
doLogOutAllSessions=Log alle sessioner ud

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Speichern
doCancel=Abbrechen
doLogOutAllSessions=Alle Sitzungen abmelden

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
role_manage-identity-providers=Διαχείριση παρόχων ταυτότητας
doRemove=Αφαίρεση
doAdd=Προσθήκη

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Guardar
doCancel=Cancelar
doLogOutAllSessions=Desconectar de todas las sesiones

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=ذخیره
doCancel=لغو کنید
doLogOutAllSessions=از تمام جلسات خارج شوید

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Tallenna
doCancel=Peruuta
doLogOutAllSessions=Kirjaudu ulos kaikista sessioista

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Sauvegarder
doCancel=Annuler
doLogOutAllSessions=Déconnexion de toutes les sessions

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Mentés
doCancel=Mégsem
doLogOutAllSessions=Minden munkamenet kiléptetése

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Salva
doCancel=Annulla
doLogOutAllSessions=Effettua il logout da tutte le sessioni

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=保存
doCancel=キャンセル
doLogOutAllSessions=全セッションからログアウト

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Saugoti
doCancel=Atšaukti

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Saglabāt
doCancel=Atcelt
doLogOutAllSessions=Izlogoties no visām sesijām

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Opslaan
doCancel=Annuleer
doLogOutAllSessions=Alle sessies uitloggen

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Lagre
doCancel=Avbryt
doLogOutAllSessions=Logg ut av alle sesjoner

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Zapisz
doCancel=Anuluj
doLogOutAllSessions=Wyloguj wszystkie sesje

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Salvar
doCancel=Cancelar
doLogOutAllSessions=Sair de todas as sessões

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Сохранить
doCancel=Отмена
doLogOutAllSessions=Выйти из всех сессий

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Uložiť
doCancel=Zrušiť
doLogOutAllSessions=Odhlásenie všetkých relácií

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Spara
doCancel=Avbryt
doLogOutAllSessions=Logga ut från samtliga sessioner

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=Kaydet
doCancel=İptal
doLogOutAllSessions=Tüm Oturumları Kapat

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doSave=保存
doCancel=取消
doLogOutAllSessions=登出所有会话

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=كلمة المرور غير صالحة: الحد الأدنى للطول {0}.
invalidPasswordMaxLengthMessage=كلمة المرور غير صالحة: الحد الأقصى للطول {0}.
invalidPasswordMinLowerCaseCharsMessage=كلمة المرور غير صالحة: يجب أن تحتوي على {0} حروف صغيرة على الأقل.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordHistoryMessage=Contrasenya incorrecta: no pot ser igual a cap de les últimes {0} contrasenyes.
invalidPasswordMinDigitsMessage=Contraseña incorrecta: debe contener al menos {0} caracteres numéricos.
invalidPasswordMinLengthMessage=Contrasenya incorrecta: longitud mínima {0}.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=Ungültiges Passwort: muss mindestens {0} Zeichen beinhalten.
invalidPasswordMinLowerCaseCharsMessage=Ungültiges Passwort: muss mindestens {0} Kleinbuchstaben beinhalten.
invalidPasswordMinDigitsMessage=Ungültiges Passwort: muss mindestens {0} Ziffern beinhalten.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
error-invalid-date=Το πεδίο {0} δεν αποτελεί έγκυρη ημερομηνία.
error-invalid-length-too-long=Το πεδίο {0} μπορεί να περιέχει το πολύ {2} χαρακτήρες .
error-person-name-invalid-character=Το {0} περιέχει ένα μη έγκυρο χαρακτήρα.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=Contraseña incorrecta: longitud mínima {0}.
invalidPasswordMinLowerCaseCharsMessage=Contraseña incorrecta: debe contener al menos {0} letras minúsculas.
invalidPasswordMinDigitsMessage=Contraseña incorrecta: debe contener al menos {0} caracteres numéricos.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=رمز عبور نامعتبر: حداقل طول {0}.
invalidPasswordMaxLengthMessage=رمز عبور نامعتبر: حداکثر طول {0}.
invalidPasswordMinLowerCaseCharsMessage=رمز عبور نامعتبر: باید حداقل دارای {0} نویسه کوچک باشد.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=Mot de passe invalide : longueur minimale requise de {0}.
invalidPasswordMinLowerCaseCharsMessage=Mot de passe invalide : doit contenir au moins {0} lettre(s) en minuscule.
invalidPasswordMinDigitsMessage=Mot de passe invalide : doit contenir au moins {0} chiffre(s).

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=無効なパスワード: 最小{0}の長さが必要です。
invalidPasswordMinLowerCaseCharsMessage=無効なパスワード: 少なくとも{0}文字の小文字を含む必要があります。
invalidPasswordMinDigitsMessage=無効なパスワード: 少なくとも{0}文字の数字を含む必要があります。

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=Per trumpas slaptažodis: mažiausias ilgis {0}.
invalidPasswordMinLowerCaseCharsMessage=Neteisingas slaptažodis: privaloma įvesti {0} mažąją raidę.
invalidPasswordMinDigitsMessage=Neteisingas slaptažodis: privaloma įvesti {0} skaitmenį.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=Ongeldig wachtwoord: de minimale lengte is {0} karakters.
invalidPasswordMinLowerCaseCharsMessage=Ongeldig wachtwoord: het moet minstens {0} kleine letters bevatten.
invalidPasswordMinDigitsMessage=Ongeldig wachtwoord: het moet minstens {0} getallen bevatten.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=Ugyldig passord: minimum lengde {0}.
invalidPasswordMinLowerCaseCharsMessage=Ugyldig passord: må inneholde minst {0} små bokstaver.
invalidPasswordMinDigitsMessage=Ugyldig passord: må inneholde minst {0} sifre.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=Senha inválida: deve conter ao menos {0} caracteres.
invalidPasswordMinLowerCaseCharsMessage=Senha inválida: deve conter ao menos {0} caracteres minúsculos.
invalidPasswordMinDigitsMessage=Senha inválida: deve conter ao menos {0} digitos numéricos.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=Некорректный пароль: длина пароля должна быть не менее {0} символов(а).
invalidPasswordMinDigitsMessage=Некорректный пароль: должен содержать не менее {0} цифр(ы).
invalidPasswordMinLowerCaseCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} символов(а) в нижнем регистре.

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
invalidPasswordMinLengthMessage=无效的密码:最短长度 {0}.
invalidPasswordMinLowerCaseCharsMessage=无效的密码:至少包含 {0} 小写字母
invalidPasswordMinDigitsMessage=无效的密码:至少包含 {0} 个数字

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=التحقق من البريد الإلكتروني
emailVerificationBody=قام شخص ما بإنشاء حساب {2} بعنوان البريد الإلكتروني هذا. إذا كان هذا أنت، فانقر على الرابط أدناه للتحقق من عنوان بريدك الإلكتروني\n\n{0}\n\nستنتهي صلاحية هذا الرابط خلال {3}.\n\nإذا لم تكن قد أنشأت هذا الحساب، فقط تجاهل هذه الرسالة.
emailVerificationBodyHtml=<p style="direction: rtl;">قام شخص ما بإنشاء حساب {2} بعنوان البريد الإلكتروني هذا. إذا كان هذا أنت، فانقر على الرابط أدناه للتحقق من عنوان بريدك الإلكتروني</p><p style="direction: rtl;"><a href="{0}">رابط التحقق من البريد الإلكتروني</a></p><p style="direction: rtl;">ستنتهي صلاحية هذا الرابط خلال {3}.</p><p style="direction: rtl;">إذا لم تكن قد أنشأت هذا الحساب، فقط تجاهل هذه الرسالة.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Verificació d''email
emailVerificationBody=Algú ha creat un compte de {2} amb aquesta adreça de correu electrònic. Si has estat tu, fes clic a l''enllaç següent per verificar la teva adreça de correu electrònic.\n\n{0}\n\nAquest enllaç expirarà en {1} minuts.\n\nSi tu no has creat aquest compte, simplement ignora aquest missatge.
emailVerificationBodyHtml=<p>Algú ha creat un compte de {2} amb aquesta adreça de correu electrònic. Si has estat tu, fes clic a l''enllaç següent per verificar la teva adreça de correu electrònic.</p><p><a href=\"{0}\">{0}</a></p><p> Aquest enllaç expirarà en {1} minuts.</p><p> Si tu no has creat aquest compte, simplement ignora aquest missatge.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Ověření e-mailu
emailVerificationBody=Někdo vytvořil účet {2} s touto e-mailovou adresou. Pokud jste to vy, klikněte na níže uvedený odkaz a ověřte svou e-mailovou adresu \n\n{0}\n\nTento odkaz vyprší za {3}.\n\nPokud jste tento účet nevytvořili, tuto zprávu ignorujte.
emailVerificationBodyHtml=<p>Někdo vytvořil účet {2} s touto e-mailovou adresou. Pokud jste to vy, klikněte na níže uvedený odkaz a ověřte svou e-mailovou adresu. </p><p><a href="{0}">Odkaz na ověření e-mailové adresy</a></p><p>Platnost odkazu vyprší za {3}.</p><p>Pokud jste tento účet nevytvořili, tuto zprávu ignorujte.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Verificer email
emailVerificationBody=Nogen har oprettet en {2} konto med denne email adresse. Hvis dette var dig, bedes du trykke på forbindet herunder for at verificere din email adresse \n\n{0}\n\nDette link vil udløbe inden for {3}.\n\nHvis det var dig der har oprettet denne konto, bedes du se bort fra denne mail.
emailVerificationBodyHtml=<p>Nogen har oprettet en {2} konto med denne email adresse. Hvis dette var dig, bedes du trykke på forbindet herunder for at verificere din email adresse</p><p><a href="{0}">Link til email verificering</a></p><p>Dette link vil udløbe inden for {3}.</p><p>Hvis det var dig der har oprettet denne konto, bedes du se bort fra denne mail.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=E-Mail verifizieren
emailVerificationBody=Jemand hat ein {2} Konto mit dieser E-Mail-Adresse erstellt. Falls Sie das waren, dann klicken Sie auf den Link, um die E-Mail-Adresse zu verifizieren.\n\n{0}\n\nDer Link ist {3} gültig.\n\nFalls Sie dieses Konto nicht erstellt haben, dann können sie diese Nachricht ignorieren.
emailVerificationBodyHtml=<p>Jemand hat ein {2} Konto mit dieser E-Mail-Adresse erstellt. Falls Sie das waren, klicken Sie auf den Link, um die E-Mail-Adresse zu verifizieren.</p><p><a href="{0}">Link zur Bestätigung der E-Mail-Adresse</a></p><p>Der Link ist {3} gültig.</p><p>Falls Sie dieses Konto nicht erstellt haben, dann können sie diese Nachricht ignorieren.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
requiredAction.terms_and_conditions=Όροι και Συνθήκες
requiredAction.CONFIGURE_RECOVERY_AUTHN_CODES=Δημιουργία Κωδικών Ανάκτησης
requiredAction.VERIFY_EMAIL=Επιβεβαίωση Email

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Verificación de email
emailVerificationBody=Alguien ha creado una cuenta de {2} con esta dirección de email. Si has sido tú, haz click en el enlace siguiente para verificar tu dirección de email.\n\n{0}\n\nEste enlace expirará en {1} minutos.\n\nSi tú no has creado esta cuenta, simplemente ignora este mensaje.
emailVerificationBodyHtml=<p>Alguien ha creado una cuenta de {2} con esta dirección de email. Si has sido tú, haz click en el enlace siguiente para verificar tu dirección de email.</p><p><a href=\"{0}\">Enlace de verficación de dirección de email</a></p><p>Este enlace expirará en {1} minutos.</p><p>Si tú no has creado esta cuenta, simplemente ignora este mensaje.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=تایید ایمیل
emailVerificationBody=شخصی با این آدرس ایمیل یک حساب {2} ایجاد کرده است. اگر این شما بودید، روی پیوند زیر کلیک کنید تا آدرس ایمیل خود را تأیید کنید\n\n{0}\n\nاین پیوند در {3} منقضی می‌شود.\n\nاگر شما این حساب را ایجاد نکرده‌اید، فقط این پیام را نادیده بگیرید .
emailVerificationBodyHtml=<p>شخصی با این آدرس ایمیل یک حساب {2} ایجاد کرده است. اگر این شما بودید، برای تأیید آدرس ایمیل خود روی پیوند زیر کلیک کنید</p><p><a href="{0}">پیوند به تأیید آدرس ایمیل</a></p><p>این پیوند در {3} منقضی می‌شود.</p><p>اگر شما این حساب را ایجاد نکرده‌اید، فقط این پیام را نادیده بگیرید.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Vahvista sähköposti
emailVerificationBody=Tällä sähköpostiosoitteella on luotu {2}-tili. Jos loit tilin itse, klikkaa alla olevaa linkkiä vahvistaaksesi sähköpostiosoitteesi\n\n{0}\n\nLinkin vanhenemisaika: {3}.\n\nJos et luonut tätä tiliä, jätä viesti huomiotta.
emailVerificationBodyHtml=<p>Tällä sähköpostiosoitteella on luotu {2}-tili. Jos loit tilin itse, klikkaa alla olevaa linkkiä vahvistaaksesi sähköpostiosoitteesi</p><p><a href="{0}">Linkki vahvistamiseen</a></p><p>Linkin vanhenemisaika: {3}.</p><p>Jos et luonut tätä tiliä, jätä viesti huomiotta.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Vérification du courriel
emailVerificationBody=Quelqu''un vient de créer un compte "{2}" avec votre courriel. Si vous êtes à l''origine de cette requête, veuillez cliquer sur le lien ci-dessous afin de vérifier votre adresse de courriel\n\n{0}\n\nCe lien expire dans {3}.\n\nSinon, veuillez ignorer ce message.
emailVerificationBodyHtml=<p>Quelqu''un vient de créer un compte "{2}" avec votre courriel. Si vous êtes à l''origine de cette requête, veuillez cliquer sur le lien ci-dessous afin de vérifier votre adresse de courriel</p><p><a href="{0}">{0}</a></p><p>Ce lien expire dans {3}.</p><p>Sinon, veuillez ignorer ce message.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Email cím megerősítése
emailVerificationBody=Ezzel az email címmel valaki létrehozott egy {2} tartomány felhasználói fiókot. Amennyiben a fiókot Ön hozta létre, kérem kattintson a lenti hivatkozásra, hogy megerősítse fiókját és ezt az email címet.\n\n{0}\n\nA hivatkozás érvényét veszti {3} múlva.\n\nHa nem ön hozta létre a felhasználói fiókot, akkor kérem hagyja figyelmen kívül ezt az üzenetet.
emailVerificationBodyHtml=<p>Ezzel az email címmel valaki létrehozott egy {2} tartomány felhasználói fiókot. Amennyiben a fiókot Ön hozta létre, kérem kattintson a lenti hivatkozásra, hogy megerősítse fiókját és ezt az email címet.</p><p><a href="{0}">Hivatkozás a fiók és az email cím megerősítéséhez</a></p><p>A hivatkozás érvényét veszti {3} múlva.</p><p>Ha nem ön hozta létre a felhasználói fiókot, akkor kérem hagyja figyelmen kívül ezt az üzenetet.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Verifica l''email
emailVerificationBody=Qualcuno ha creato un account {2} con questo indirizzo email. Se sei stato tu, fai clic sul link seguente per verificare il tuo indirizzo email\n\n{0}\n\nQuesto link scadrà in {3}.\n\nSe non sei stato tu a creare questo account, ignora questo messaggio.
emailVerificationBodyHtml=<p>Qualcuno ha creato un account {2} con questo indirizzo email. Se sei stato tu, fai clic sul link seguente per verificare il tuo indirizzo email</p><p><a href="{0}">Link per verificare l''indirizzo email</a></p><p>Questo link scadrà in {3}.</p><p>Se non sei stato tu a creare questo account, ignora questo messaggio.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Eメールの確認
emailVerificationBody=このメールアドレスで{2}アカウントが作成されました。以下のリンクをクリックしてメールアドレスの確認を完了してください。\n\n{0}\n\nこのリンクは{3}だけ有効です。\n\nもしこのアカウントの作成に心当たりがない場合は、このメールを無視してください。
emailVerificationBodyHtml=<p>このメールアドレスで{2}アカウントが作成されました。以下のリンクをクリックしてメールアドレスの確認を完了してください。</p><p><a href="{0}">メールアドレスの確認</a></p><p>このリンクは{3}だけ有効です。</p><p>もしこのアカウントの作成に心当たりがない場合は、このメールを無視してください。</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=El. pašto patvirtinimas
emailVerificationBody=Paskyra {2} sukurta naudojant šį el. pašto adresą. Jei tai buvote Jūs, tuomet paspauskite žemiau esančią nuorodą\n\n{0}\n\nŠi nuoroda galioja {1} min.\n\nJei paskyros nekūrėte, tuomet ignuoruokite šį laišką.
emailVerificationBodyHtml=<p>Paskyra {2} sukurta naudojant šį el. pašto adresą. Jei tao buvote Jūs, tuomet paspauskite žemiau esančią nuorodą</p><p><a href=LT"{0}">{0}</a></p><p>Ši nuoroda galioja {1} min.</p><p>nJei paskyros nekūrėte, tuomet ignuoruokite šį laišką.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Bevestig e-mailadres
emailVerificationBody=Iemand heeft een {2} account aangemaakt met dit e-mailadres. Als u dit was, klikt u op de onderstaande koppeling om uw e-mailadres te bevestigen \n\n{0}\n\nDeze koppeling zal binnen {3} vervallen.\n\nU kunt dit bericht negeren indien u dit account niet heeft aangemaakt.
emailVerificationBodyHtml=<p>Iemand heeft een {2} account aangemaakt met dit e-mailadres. Als u dit was, klikt u op de onderstaande koppeling om uw e-mailadres te bevestigen</p><p><a href="{0}">Koppeling naar e-mailadres bevestiging</a></p><p>Deze koppeling zal binnen {3} vervallen.</p<p>U kunt dit bericht negeren indien u dit account niet heeft aangemaakt.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Bekreft e-postadresse
emailVerificationBody=Noen har opprettet en {2} konto med denne e-postadressen. Hvis dette var deg, klikk på lenken nedenfor for å bekrefte e-postadressen din\n\n{0}\n\nDenne lenken vil utløpe om {1} minutter.\n\nHvis du ikke opprettet denne kontoen, vennligst ignorer denne meldingen.
emailVerificationBodyHtml=<p>Noen har opprettet en {2} konto med denne e-postadressen. Hvis dette var deg, klikk på lenken nedenfor for å bekrefte e-postadressen din</p><p><a href="{0}">{0}</a></p><p>Denne lenken vil utløpe om {1} minutter.</p><p>Hvis du ikke opprettet denne kontoen, vennligst ignorer denne meldingen.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Zweryfikuj email
emailVerificationBody=Ktoś utworzył konto {2} z Twoim adresem e-mail. Jeśli to Ty, kliknij proszę poniższy odnośnik, aby potwierdzić założenie konta \n\n{0}\n\nOdnośnik wygaśnie w ciągu {3}.\n\nJeśli nie utworzyłaś/eś tego konta, po prostu zignoruj niniejszą wiadomość.
emailVerificationBodyHtml=<p>Ktoś utworzył konto {2} z Twoim adresem e-mail. Jeśli to Ty, kliknij proszę <a href="{0}">odnośnik</a>, aby potwierdzić założenie konta</p><p>Odnośnik wygaśnie w ciągu {3}</p><p>Jeśli nie utworzyłaś/eś tego konta, po prostu zignoruj niniejszą wiadomość.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Verificação de endereço de e-mail
emailVerificationBody=Alguém criou uma conta {2} com este endereço de e-mail. Se foi você, clique no link abaixo para verificar o seu endereço de email.\n\n{0}\n\nEste link irá expirar dentro de {3}.\n\nSe não foi você quem criou esta conta, basta ignorar esta mensagem.
emailVerificationBodyHtml=<p>Alguém criou uma conta {2} com este endereço de e-mail. Se foi você, clique no link abaixo para verificar o seu endereço de email.</p><p><a href="{0}">Link para verificação de endereço de e-mail</a></p><p>Este link irá expirar dentro de {3}.</p><p>Se não foi você quem criou esta conta, basta ignorar esta mensagem.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Подтверждение E-mail
emailVerificationBody=Кто-то создал учетную запись {2} с этим E-mail. Если это были Вы, нажмите на следующую ссылку для подтверждения вашего email\n\n{0}\n\nЭта ссылка устареет через {1} минут.\n\nЕсли Вы не создавали учетную запись, просто проигнорируйте это письмо.
emailVerificationBodyHtml=<p>Кто-то создал учетную запись {2} с этим E-mail. Если это были Вы, нажмите по ссылке для подтверждения вашего E-mail</p><p><a href="{0}">{0}</a></p><p>Эта ссылка устареет через {1} минут.</p><p>Если Вы не создавали учетную запись, просто проигнорируйте это письмо.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Overenie e-mailu
emailVerificationBody=Niekto vytvoril účet {2} s touto e-mailovou adresou. Ak ste to vy, kliknite na nižšie uvedený odkaz a overte svoju e-mailovú adresu \n\n{0}\n\nTento odkaz uplynie do {1} minút.\n\nAk ste tento účet nevytvorili, ignorujte túto správu.
emailVerificationBodyHtml=<p>Niekto vytvoril účet {2} s touto e-mailovou adresou. Ak ste to vy, kliknite na nižšie uvedený odkaz na overenie svojej e-mailovej adresy.</p><p><a href="{0}"> Odkaz na overenie e-mailovej adresy </a></p><p>Platnosť odkazu vyprší za {1} minút.</p><p> Ak ste tento účet nevytvorili, ignorujte túto správu.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=Verifiera e-post
emailVerificationBody=Någon har skapat ett {2} konto med den här e-postadressen. Om det var du, klicka då på länken nedan för att verifiera din e-postadress\n\n{0}\n\nDen här länken kommer att upphöra inom {1} minuter.\n\nOm det inte var du som skapade det här kontot, ignorera i så fall det här meddelandet.
emailVerificationBodyHtml=<p>Någon har skapat ett {2} konto med den här e-postadressen. Om det var du, klicka då på länken nedan för att verifiera din e-postadress</p><p><a href="{0}">{0}</a></p><p>Den här länken kommer att upphöra inom {1} minuter.</p><p>Om det inte var du som skapade det här kontot, ignorera i så fall det här meddelandet.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=E-postayı doğrula
emailVerificationBody=Birisi bu e-posta adresiyle bir {2} hesap oluşturdu. Bu sizseniz, e-posta adresinizi doğrulamak için aşağıdaki bağlantıya tıklayın\n\n{0}\n\nBu bağlantı {3} içinde sona erecek.\n\nBu hesabı oluşturmadıysanız, sadece bu iletiyi yoksayınız.
emailVerificationBodyHtml=<p>Birisi bu e-posta adresiyle bir {2} hesap oluşturdu. Bu sizseniz, e-posta adresinizi doğrulamak için aşağıdaki bağlantıyı tıklayın.</p><p><a href="{0}">E-posta adresi doğrulama adresi</a></p><p>Bu bağlantının süresi {3} içerisinde sona erecek.</p><p>Bu hesabı siz oluşturmadıysanız, bu mesajı göz ardı edin.</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
emailVerificationSubject=验证电子邮件
emailVerificationBody=用户使用当前电子邮件注册 {2} 账户。如是本人操作,请点击以下链接完成邮箱验证\n\n{0}\n\n这个链接会在 {1} 分钟后过期.\n\n如果您没有注册用户请忽略这条消息。
emailVerificationBodyHtml=<p>用户使用当前电子邮件注册 {2} 账户。如是本人操作,请点击以下链接完成邮箱验证</p><p><a href="{0}">{0}</a></p><p>这个链接会在 {1} 分钟后过期.</p><p>如果您没有注册用户,请忽略这条消息。</p>

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=تسجيل دخول
doRegister=تسجيل جديد
doCancel=إلغاء

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Inicia sessió
doRegister=Registra''t
doCancel=Cancel·lar

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Přihlásit se
doRegister=Registrovat se
doCancel=Zrušit

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Log ind
doRegister=Registrer
doCancel=Annuller

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Anmelden
doRegister=Registrieren
doCancel=Abbrechen

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Είσοδος
doRegister=Εγγραφή
doCancel=Ακύρωση

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Iniciar sesión
doRegister=Regístrate
doCancel=Cancelar

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=ورود
doRegister=ثبت نام
doCancel=لغو

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Kirjaudu
doRegister=Rekisteröidy
doCancel=Peruuta

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Connexion
doRegister=Enregistrement
doCancel=Annuler

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Belépés
doRegister=Regisztráció
doCancel=Mégsem

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Accedi
doRegister=Registrati
doCancel=Annulla

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=ログイン
doRegister=登録
doCancel=キャンセル

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Prisijungti
doRegister=Registruotis
doCancel=Atšaukti

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Pieslēgties
doRegister=Reģistrēties
doCancel=Atcelt

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Inloggen
doRegister=Registreer
doCancel=Annuleer

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Logg inn
doRegister=Registrer deg
doCancel=Avbryt

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Logowanie
doRegister=Rejestracja
doCancel=Anuluj

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Entrar
doRegister=Cadastre-se
doCancel=Cancelar

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Вход
doRegister=Регистрация
doCancel=Отмена

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Prihlásenie
doRegister=Registrácia
doCancel=Zrušiť

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Logga in
doRegister=Registrera
doCancel=Avbryt

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=Oturum aç
doRegister=Kayıt ol
doCancel=İptal et

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
doLogIn=登录
doRegister=注册
doCancel=取消

View file

@ -1,5 +1,3 @@
# encoding: UTF-8
pageNotFound=الصفحة غير موجودة
forbidden=الوصول ممنوع
needAccessRights=ليس لديك الصلاحيات اللازمة لهذا الطلب. قم بالتواصل مع مسؤول النظام.

View file

@ -1,3 +1 @@
# encoding: UTF-8
fullName={0} {1}

Some files were not shown because too many files have changed in this diff Show more