8000 Convert LinkExpirationFormatterMethod to Java's ChoiceFormat pattern by ahus1 · Pull Request #21888 · keycloak/keycloak · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Convert LinkExpirationFormatterMethod to Java's ChoiceFormat pattern #21888

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/
package org.keycloak.theme.beans;

import java.text.MessageFormat;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
Expand All @@ -13,7 +14,7 @@
import freemarker.template.TemplateModelException;

/**
* Method used to format link expiration time period in emails.
* Method used to format the link expiration time period in emails.
*
* @author Vlastimil Elias (velias at redhat dot com)
*/
Expand Down Expand Up @@ -62,14 +63,6 @@ protected String format(long valueInSeconds) {
}
}

return value + " " + getUnitTextFromMessages(unitKey, value);
return value + " " + MessageFormat.format(messages.getProperty("linkExpirationFormatter.timePeriodUnit." + unitKey), value);
}

protected String getUnitTextFromMessages(String unitKey, long value) {
String msg = messages.getProperty("linkExpirationFormatter.timePeriodUnit." + unitKey + "." + value);
if (msg != null)
return msg;
return messages.getProperty("linkExpirationFormatter.timePeriodUnit." + unitKey);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,22 @@
*/
package org.keycloak.theme.beans;

import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Properties;
import java.util.stream.Collectors;

import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;

import freemarker.template.TemplateModelException;
Expand All @@ -24,15 +33,10 @@ public class LinkExpirationFormatterMethodTest {
protected static final Locale locale = Locale.ENGLISH;
protected static final Properties messages = new Properties();
static {
messages.put("linkExpirationFormatter.timePeriodUnit.seconds.1", "second");
messages.put("linkExpirationFormatter.timePeriodUnit.seconds", "seconds");
messages.put("linkExpirationFormatter.timePeriodUnit.minutes.1", "minute");
messages.put("linkExpirationFormatter.timePeriodUnit.minutes.3", "minutes-3");
messages.put("linkExpirationFormatter.timePeriodUnit.minutes", "minutes");
messages.put("linkExpirationFormatter.timePeriodUnit.hours.1", "hour");
messages.put("linkExpirationFormatter.timePeriodUnit.hours", "hours");
messages.put("linkExpirationFormatter.timePeriodUnit.days.1", "day");
messages.put("linkExpirationFormatter.timePeriodUnit.days", "days");
messages.put("linkExpirationFormatter.timePeriodUnit.seconds", "{0,choice,0#seconds|1#second|1<seconds}");
messages.put( 8000 "linkExpirationFormatter.timePeriodUnit.minutes", "{0,choice,0#minutes|1#minute|2#minutes|3#minutes-3|3<minutes}");
messages.put("linkExpirationFormatter.timePeriodUnit.hours", "{0,choice,0#hours|1#hour|1<hours}");
messages.put("linkExpirationFormatter.timePeriodUnit.days", "{0,choice,0#days|1#day|1<days}");
}

protected List<Object> toList(Object... objects) {
Expand Down Expand Up @@ -68,8 +72,10 @@ public void inputtypes_string_notanumber() throws TemplateModelException{
@Test
public void inputtypes_number() throws TemplateModelException{
LinkExpirationFormatterMethod tested = new LinkExpirationFormatterMethod(messages, locale);
Assert.assertEquals("5 minutes", tested.exec(toList(new Integer(5))));
Assert.assertEquals("5 minutes", tested.exec(toList(new Long(5))));
//noinspection UnnecessaryBoxing
Assert.assertEquals("5 minutes", tested.exec(toList(Integer.valueOf(5))));
//noinspection UnnecessaryBoxing
Assert.assertEquals("5 minutes", tested.exec(toList(Long.valueOf(5))));
}

@Test
Expand Down Expand Up @@ -124,5 +130,73 @@ public void format_day_more() throws TemplateModelException {
Assert.assertEquals("5 days", tested.exec(toList(5 * 24 * 60)));
}

/**
* There are some languages where the choice format is not needed. Test that this still works.
*/
@Test
public void format_simple_no_choice() throws TemplateModelException {
Properties simpleMessages = new Properties();
simpleMessages.put("linkExpirationFormatter.timePeriodUnit.seconds", "seconds-simple");
simpleMessages.put("linkExpirationFormatter.timePeriodUnit.minutes", "minutes-simple");
simpleMessages.put("linkExpirationFormatter.timePeriodUnit.hours", "hours-simple");
simpleMessages.put("linkExpirationFormatter.timePeriodUnit.days", "days-simple");
LinkExpirationFormatterMethod tested = new LinkExpirationFormatterMethod(simpleMessages, locale);
Assert.assertEquals("2 days-simple", tested.exec(toList(2 * 24 * 60)));
Assert.assertEquals("5 days-simple", tested.exec(toList(5 * 24 * 60)));
}

/**
* This ignored test conserves the code to translate the properties from Keycloak 22 and before to the new
* {@link java.text.ChoiceFormat}.
* The code appends the translated properties to the end of the file, and the user can then review the new properties and remove the old.
*/
@Ignore
@Test
public void convert() throws IOException {
String[] units = { "seconds", "minutes", "hours", "days"};
for (Path path : Files.list(Paths.get("../themes/src/main/resources-community/theme/base/email/messages" )).collect(Collectors.toList())) {
Properties p = new Properties();
p.load(Files.newBufferedReader(path, StandardCharsets.UTF_8));
FileWriter fw = new FileWriter(path.toFile(), true);
boolean firstEntry = true;
for (String unit : units) {
StringBuilder choicePattern = new StringBuilder();
String base = "linkExpirationFormatter.timePeriodUnit." + unit;
String defaultValue = p.getProperty(base);
if (defaultValue == null) {
continue;
}
choicePattern.append("{0,choice,0#").append(defaultValue).append("|");
int last = 0;
int entry = 0;
String previous = defaultValue;
for (int i = 0; i < 10; ++i) {
String value = p.getProperty(base + "." + i);
if (value != null) {
last = i;
if (!Objects.equals(value, previous)) {
entry = i;
previous = value;
choicePattern.append(i).append("#").append(value).append("|");
}
}
}
choicePattern.append(last).append("<").append(defaultValue).append("}");
if (entry == 0) {
choicePattern.setLength(0);
choicePattern.append(defaultValue);
}
choicePattern.insert(0, base + "=");
choicePattern.append("\n");
if (firstEntry) {
fw.write("\n");
firstEntry = false;
}
fw.write(choicePattern.toString());
}
fw.close();
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -39,50 +39,10 @@ requiredAction.VERIFY_EMAIL=التحقق من البريد الإلكتروني
requiredAction.CONFIGURE_RECOVERY_AUTHN_CODES=توليد رموز مصادقة الاسترداد

# units for link expiration timeout formatting
linkExpirationFormatter.timePeriodUnit.seconds=ثانية
linkExpirationFormatter.timePeriodUnit.seconds.1=ثانية
linkExpirationFormatter.timePeriodUnit.seconds.2=ثانية
linkExpirationFormatter.timePeriodUnit.seconds.3=ثواني
linkExpirationFormatter.timePeriodUnit.seconds.4=ثواني
linkExpirationFormatter.timePeriodUnit.seconds.5=ثواني
linkExpirationFormatter.timePeriodUnit.seconds.6=ثواني
linkExpirationFormatter.timePeriodUnit.seconds.7=ثواني
linkExpirationFormatter.timePeriodUnit.seconds.8=ثواني
linkExpirationFormatter.timePeriodUnit.seconds.9=ثواني
linkExpirationFormatter.timePeriodUnit.seconds.10=ثواني
linkExpirationFormatter.timePeriodUnit.minutes=دقيقة
linkExpirationFormatter.timePeriodUnit.minutes.1=دقيقة
linkExpirationFormatter.timePeriodUnit.minutes.2=دقيقة
linkExpirationFormatter.timePeriodUnit.minutes.3=دقائق
linkExpirationFormatter.timePeriodUnit.minutes.4=دقائق
linkExpirationFormatter.timePeriodUnit.minutes.5=دقائق
linkExpirationFormatter.timePeriodUnit.minutes.6=دقائق
linkExpirationFormatter.timePeriodUnit.minutes.7=دقائق
linkExpirationFormatter.timePeriodUnit.minutes.8=دقائق
linkExpirationFormatter.timePeriodUnit.minutes.9=دقائق
linkExpirationFormatter.timePeriodUnit.minutes.10=دقائق
linkExpirationFormatter.timePeriodUnit.hours=ساعة
linkExpirationFormatter.timePeriodUnit.hours.1=ساعة
linkExpirationFormatter.timePeriodUnit.hours.2=ساعة
linkExpirationFormatter.timePeriodUnit.hours.3=ساعات
linkExpirationFormatter.timePeriodUnit.hours.4=ساعات
linkExpirationFormatter.timePeriodUnit.hours.5=ساعات
linkExpirationFormatter.timePeriodUnit.hours.6=ساعات
linkExpirationFormatter.timePeriodUnit.hours.7=ساعات
linkExpirationFormatter.timePeriodUnit.hours.8=ساعات
linkExpirationFormatter.timePeriodUnit.hours.9=ساعات
linkExpirationFormatter.timePeriodUnit.hours.10=ساعات
linkExpirationFormatter.timePeriodUnit.days=يوم
linkExpirationFormatter.timePeriodUnit.days.1=يوم
linkExpirationFormatter.timePeriodUnit.days.2=يوم
linkExpirationFormatter.timePeriodUnit.days.3=أيام
linkExpirationFormatter.timePeriodUnit.days.4=أيام
linkExpirationFormatter.timePeriodUnit.days.5=أيام
linkExpirationFormatter.timePeriodUnit.days.6=أيام
linkExpirationFormatter.timePeriodUnit.days.7=أيام
linkExpirationFormatter.timePeriodUnit.days.8=أيام
linkExpirationFormatter.timePeriodUnit.days.9=أيام
linkExpirationFormatter.timePeriodUnit.days.10=أيام
linkExpirationFormatter.timePeriodUnit.seconds={0,choice,0#ثانية|3#ثواني|9<ثانية}
linkExpirationFormatter.timePeriodUnit.minutes={0,choice,0#دقيقة|3#دقائق|9<دقيقة}
linkExpirationFormatter.timePeriodUnit.hours={0,choice,0#ساعة|3#ساعات|9<ساعة}
linkExpirationFormatter.timePeriodUnit.days={0,choice,0#يوم|3#أيام|9<يوم}

emailVerificationBodyCode=يرجى التحقق من عنوان بريدك الإلكتروني عن طريق إدخال الرمز التالي.\n\n{0}\n\n.
emailVerificationBodyCodeHtml=<p style="direction: rtl;">يرجى التحقق من عنوان بريدك الإلكتروني عن طريق إدخال الرمز التالي.</p><p style="direction: rtl;"><b>{0}</b></p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,26 +35,10 @@ requiredAction.UPDATE_PROFILE=Aktualizace profilu
requiredAction.VERIFY_EMAIL=Ověření e-mailu

# units for link expiration timeout formatting
linkExpirationFormatter.timePeriodUnit.seconds=sekund
linkExpirationFormatter.timePeriodUnit.seconds.1=sekunda
linkExpirationFormatter.timePeriodUnit.seconds.2=sekundy
linkExpirationFormatter.timePeriodUnit.seconds.3=sekundy
linkExpirationFormatter.timePeriodUnit.second F438 s.4=sekundy
linkExpirationFormatter.timePeriodUnit.minutes=minut
linkExpirationFormatter.timePeriodUnit.minutes.1=minuta
linkExpirationFormatter.timePeriodUnit.minutes.2=minuty
linkExpirationFormatter.timePeriodUnit.minutes.3=minuty
linkExpirationFormatter.timePeriodUnit.minutes.4=minuty
linkExpirationFormatter.timePeriodUnit.hours=hodin
linkExpirationFormatter.timePeriodUnit.hours.1=hodina
linkExpirationFormatter.timePeriodUnit.hours.2=hodiny
linkExpirationFormatter.timePeriodUnit.hours.3=hodiny
linkExpirationFormatter.timePeriodUnit.hours.4=hodiny
linkExpirationFormatter.timePeriodUnit.days=dní
linkExpirationFormatter.timePeriodUnit.days.1=den
linkExpirationFormatter.timePeriodUnit.days.2=dny
linkExpirationFormatter.timePeriodUnit.days.3=dny
linkExpirationFormatter.timePeriodUnit.days.4=dny
linkExpirationFormatter.timePeriodUnit.seconds={0,choice,0#sekund|1#sekunda|2#sekundy|4<sekund}
linkExpirationFormatter.timePeriodUnit.minutes={0,choice,0#minut|1#minuta|2#minuty|4<minut}
linkExpirationFormatter.timePeriodUnit.hours={0,choice,0#hodin|1#hodina|2#hodiny|4<hodin}
linkExpirationFormatter.timePeriodUnit.days={0,choice,0#dní|1#den|2#dny|4<dní}

emailVerificationBodyCode=Ověřte prosím svou e-mailovou adresu zadáním následujícího kódu.\n\n{0}\n\n.
emailVerificationBodyCodeHtml=<p>Ověřte prosím svou e-mailovou adresu zadáním následujícího kódu.</p><p><b>{0}</b></p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,10 @@ requiredAction.UPDATE_PROFILE=Opdater Profil
requiredAction.VERIFY_EMAIL=Verificer Email

# units for link expiration timeout formatting
linkExpirationFormatter.timePeriodUnit.seconds=sekunder
linkExpirationFormatter.timePeriodUnit.seconds.1=sekund
linkExpirationFormatter.timePeriodUnit.minutes=minutter
linkExpirationFormatter.timePeriodUnit.minutes.1=minut
linkExpirationFormatter.timePeriodUnit.hours=timer
linkExpirationFormatter.timePeriodUnit.hours.1=time
linkExpirationFormatter.timePeriodUnit.days=dage
linkExpirationFormatter.timePeriodUnit.days.1=dag
linkExpirationFormatter.timePeriodUnit.seconds={0,choice,0#sekunder|1#sekund|1<sekunder}
linkExpirationFormatter.timePeriodUnit.minutes={0,choice,0#minutter|1#minut|1<minutter}
linkExpirationFormatter.timePeriodUnit.hours={0,choice,0#timer|1#time|1<timer}
linkExpirationFormatter.timePeriodUnit.days={0,choice,0#dage|1#dag|1<dage}

emailVerificationBodyCode=Verificer din email adresse ved at indtaste følgende kode.\n\n{0}\n\n.
emailVerificationBodyCodeHtml=<p>Verificer din email adresse ved at indtaste følgende kode.</p><p><b>{0}</b></p>
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,10 @@ requiredAction.UPDATE_PROFILE=Profil aktualisieren
requiredAction.VERIFY_EMAIL=E-Mail-Adresse verifizieren

# units for link expiration timeout formatting
linkExpirationFormatter.timePeriodUnit.seconds=Sekunden
linkExpirationFormatter.timePeriodUnit.seconds.1=Sekunde
linkExpirationFormatter.timePeriodUnit.minutes=Minuten
linkExpirationFormatter.timePeriodUnit.minutes.1=Minute
linkExpirationFormatter.timePeriodUnit.hours=Stunden
linkExpirationFormatter.timePeriodUnit.hours.1=Stunde
linkExpirationFormatter.timePeriodUnit.days=Tage
linkExpirationFormatter.timePeriodUnit.days.1=Tag
linkExpirationFormatter.timePeriodUnit.seconds={0,choice,0#Sekunden|1#Sekunde|1<Sekunden}
linkExpirationFormatter.timePeriodUnit.minutes={0,choice,0#Minuten|1#Minute|1<Minuten}
linkExpirationFormatter.timePeriodUnit.hours={0,choice,0#Stunden|1#Stunde|1<Stunden}
linkExpirationFormatter.timePeriodUnit.days={0,choice,0#Tage|1#Tag|1<Tage}

emailVerificationBodyCode=Bitte verifizieren Sie Ihre E-Mail-Adresse, indem Sie den folgenden Code eingeben.\n\n{0}\n\n.
emailVerificationBodyCodeHtml=<p>Bitte verifizieren Sie Ihre E-Mail-Adresse, indem Sie den folgenden Code eingeben.</p><p><b>{0}</b></p>
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,13 @@ emailUpdateConfirmationBodyHtml=<p>Για να ενημερώσετε το λο
emailUpdateConfirmationBody=Για να ενημερώσετε το λογαριασμό σας {2} με διεύθυνση email {1}, πατήστε το σύνδεσμο παρακάτω\n\n{0}\n\nΟ σύνδεσμος θα λήξει σε {3}.\n\nΑν δεν θέλετε να προχωρήσετε με αυτή την αλλαγή, τότε αγνοήστε αυτό το μήνυμα.
emailVerificationBodyCode=Παρακαλώ επιβεβαιώστε τη διεύθυνση email σας, εισάγοντας το παρακάτω κωδικό.\n\n{0}\n\n.
emailVerificationBodyCodeHtml=<p>Παρακαλώ επιβεβαιώστε τη διεύθυνση email σας, εισάγοντας το παρακάτω κωδικό.</p><p><b>{0}</b></p>
linkExpirationFormatter.timePeriodUnit.days.1=μέρα
linkExpirationFormatter.timePeriodUnit.days=μέρες
linkExpirationFormatter.timePeriodUnit.hours.1=ώρα
#for language which have more unit plural forms depending on the value (eg. Czech and other Slavic langs) you can override unit text for some other values like this:
#linkExpirationFormatter.timePeriodUnit.minutes.2=minuty
#linkExpirationFormatter.timePeriodUnit.minutes.3=minuty
#linkExpirationFormatter.timePeriodUnit.minutes.4=minuty
linkExpirationFormatter.timePeriodUnit.hours=ώρες
linkExpirationFormatter.timePeriodUnit.minutes.1=λεπτό
linkExpirationFormatter.timePeriodUnit.minutes=λεπτά
linkExpirationFormatter.timePeriodUnit.seconds.1=δευτερόλεπτο

# units for link expiration timeout formatting
linkExpirationFormatter.timePeriodUnit.seconds=δευτερόλεπτα
linkExpirationFormatter.timePeriodUnit.seconds={0,choice,0#δευτερόλεπτα|1#δευτερόλεπτο|1<δευτερόλεπτα}
linkExpirationFormatter.timePeriodUnit.minutes={0,choice,0#λεπτά|1#λεπτό|1<λεπτά}
linkExpirationFormatter.timePeriodUnit.hours={0,choice,0#ώρες|1#ώρα|1<ώρες}
linkExpirationFormatter.timePeriodUnit.days={0,choice,0#μέρες|1#μέρα|1<μέρες}

eventUpdateTotpBodyHtml=<p>Η πρόσβαση μέσω OTP ενημερώθηκε στο λογαριασμό σας στις {0} από το {1}. Αν δεν είσαστε εσείς, τότε παρακαλώ επικοινωνήστε με ένα διαχειριστή.</p>
eventUpdateTotpBody=Η πρόσβαση μέσω OTP ενημερώθηκε στο λογαριασμό σας στις {0} από το {1}. Αν δεν είσαστε εσείς, τότε παρακαλώ επικοινωνήστε με ένα διαχειριστή.
eventUpdateTotpSubject=Ενημέρωση OTP
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,8 @@ linkExpirationFormatter.timePeriodUnit.days.1=روز
emailVerificationBodyCode=لطفاً آدرس ایمیل خود را با وارد کردن کد زیر تأیید کنید.\n\n{0}\n\n.
emailVerificationBodyCodeHtml=<p>لطفاً آدرس ایمیل خود را با وارد کردن کد زیر تأیید کنید.</p><p><b>{0}</b></p>


linkExpirationFormatter.timePeriodUnit.seconds=ثانیه
linkExpirationFormatter.timePeriodUnit.minutes=دقیقه
linkExpirationFormatter.timePeriodUnit.hours=ساعت
linkExpirationFormatter.timePeriodUnit.days=روز
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,10 @@ requiredAction.UPDATE_PROFILE=Päivitä profiili
requiredAction.VERIFY_EMAIL=Vahvista sähköposti

# units for link expiration timeout formatting
linkExpirationFormatter.timePeriodUnit.seconds=sekuntia
linkExpirationFormatter.timePeriodUnit.seconds.1=sekunti
linkExpirationFormatter.timePeriodUnit.minutes=minuuttia
linkExpirationFormatter.timePeriodUnit.minutes.1=minuutti
linkExpirationFormatter.timePeriodUnit.hours=tuntia
linkExpirationFormatter.timePeriodUnit.hours.1=tunti
linkExpirationFormatter.timePeriodUnit.days=päivää
linkExpirationFormatter.timePeriodUnit.days.1=päivä
linkExpirationFormatter.timePeriodUnit.seconds={0,choice,0#sekuntia|1#sekunti|1<sekuntia}
linkExpirationFormatter.timePeriodUnit.minutes={0,choice,0#minuuttia|1#minuutti|1<minuuttia}
linkExpirationFormatter.timePeriodUnit.hours={0,choice,0#tuntia|1#tunti|1<tuntia}
linkExpirationFormatter.timePeriodUnit.days={0,choice,0#päivää|1#päivä|1<päivää}

emailVerificationBodyCode=Ole hyvä ja vahvista sähköpostiosoitteesi alla olevalla koodilla.\n\n{0}\n\n.
emailVerificationBodyCodeHtml=<p>Ole hyvä ja vahvista sähköpostiosoitteesi alla olevalla koodilla.</p><p><b>{0}</b></p>
Loading
0