Thank you Thiago. I had no idea that I could use @InjectComponent into a Component, and I had no idea that use @InjectComponent of the same element into both a TextField and a Component without conflict, so thank you for the suggestion. It worked! Do you know if either is mentioned in the T5 doco?
@InjectComponent(‘price1”) private TextField price1Field; @InjectComponent(‘price1”) private Component price1Component; Cheers, Geoff > On 4 Nov 2021, at 4:32 am, Thiago H. de Paula Figueiredo <thiag...@gmail.com> > wrote: > > On Tue, Nov 2, 2021 at 12:55 AM JumpStart < > geoff.callender.jumpst...@gmail.com > <mailto:geoff.callender.jumpst...@gmail.com>> wrote: > >> Hi all, >> > > Hello! > > I'd try using one of the methods of FieldTranslatorSource, starting > with createTranslator(ComponentResources componentResources, String > translatorName);. It's exactly the one used by the "translate" binding. The > ComponentResources should be the one of the field (i.e. you'll need > to @InjectComponent private Component price1; and pass > price1.getComponentResources() to FieldTranslatorSource.createTranslator(). > > >> >> 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 >> >> >> >> >> > > -- > Thiago