Hi all,
Does anyone have an example of a variable translate in a TextField? I want to
switch between translators for different currencies because they have different
numbers of decimal places.
<t:textfield t:id="price1" value="paymentAgreement.price1"
t:mixins="touchspin" touchspin.max="999.99"
touchspin.forceStepDivisibility="'none'"
touchspin.decimals="prop:currencyDecimalPlaces"
translate="prop:moneyAmountTranslator”/>
Unfortunately I get error: org.apache.tapestry5.ioc.util.UnknownValueException:
Could not find a coercion from type
com.goxpro.xpro.web.translators.MoneyAmountTranslator to type
org.apache.tapestry5.FieldTranslator.
The background is that class MoneyAmountTranslator implements
Translator<BigDecimal>. It’s contributed to TranslatorAlternatesSource in
AppModule:
@SuppressWarnings("rawtypes")
public static void
contributeTranslatorAlternatesSource(MappedConfiguration<String, Translator>
configuration,
ThreadLocale threadLocale) {
...
configuration.add("moneyamount_0", new
MoneyAmountTranslator("moneyamount_0", 0, threadLocale, false));
configuration.add("moneyamount_2", new
MoneyAmountTranslator("moneyamount_2", 2, threadLocale, false));
configuration.add("moneyamount_3", new
MoneyAmountTranslator("moneyamount_3", 3, threadLocale, false));
}
In the page/component’s Java, I choose the translator...
@Property
private Translator moneyAmountTranslator;
...
Map<String, Translator> translatorAlternates =
translatorAlternatesSource.getTranslatorAlternates();
switch (currencyDecimalPlaces) {
case 0:
moneyAmountTranslator = (MoneyAmountTranslator)
translatorAlternates.get("moneyamount_0");
break;
case 2:
moneyAmountTranslator = (MoneyAmountTranslator)
translatorAlternates.get("moneyamount_2");
break;
case 3:
moneyAmountTranslator = (MoneyAmountTranslator)
translatorAlternates.get("moneyamount_3");
break;
default:
throw new
IllegalStateException(paymentAgreement.toString());
}
But I am having difficulty wrapping it in a FieldTranslator.
Strangely, this works…
<t:textfield t:id="price1" value="paymentAgreement.price1"
t:mixins="touchspin" touchspin.max="999.99"
touchspin.forceStepDivisibility="'none'"
touchspin.decimals="prop:currencyDecimalPlaces"
translate=“moneyamount_0”/>
But this doesn't…
@Property
private String moneyAmountTranslatorStr;
…
moneyAmountTranslatorStr = “moneyamount_0”;
<t:textfield t:id="price1" value="paymentAgreement.price1"
t:mixins="touchspin" touchspin.max="999.99"
touchspin.forceStepDivisibility="'none'"
touchspin.decimals="prop:currencyDecimalPlaces"
translate="prop:moneyAmountTranslatorStr”/>
Cheers,
Geoff