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

@ -20,3 +20,13 @@ worked at the beginning and the end of the search string. Starting with this rel
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>
* 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.
*
* @param in The input stream
* @return Encoding
* @throws IOException
* @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