[ovirt-devel] Strange issues with com.google.gwt.i18n.client.Messages.AlternateMessage [bz#1358837]

Scott Dickerson sdickers at redhat.com
Thu Jul 28 12:27:44 EDT 2016


On Thu, Jul 28, 2016 at 11:19 AM, Vojtech Szocs <vszocs at redhat.com> wrote:

> Hi Ramesh,
>
> this issue seems to be related with removal of @DefaultMessage annotations,
> moving the default (English) strings into corresponding .properties files.
>

Apparently if both properties file definitions and annotations are
connected to the same message method, the properties version takes
precidence.  I wasn't sure if this applied to alternate messages, but your
problem clearly shows that it does.


> As we generally want default strings to reside in .properties files, I see
> following options to explore, based on our earlier conversation:
>
> 1, try annotating UIMessages interface with:
>    @Generate(format = "com.google.gwt.i18n.server.PropertyCatalogFactory")
>
>    - ref:
> https://github.com/gwtproject/gwt/issues/7032#issuecomment-110858030
>    - this is likely non-feasible, however, since @Generate requests
> generation
>      of translation sources (.properties) from Java code
>
> 2, try removing @AlternateMessage annotation and modify .properties file:
>    recurrenceType=Incorrect enum
>    recurrenceType[UNKNOWN]=None
>    recurrenceType[INTERVAL]=Minute
>    recurrenceType[HOURLY]=Hourly
>    recurrenceType[DAILY]=Daily
>    recurrenceType[WEEKLY]=Weekly
>    recurrenceType[MONTHLY]=Monthly
>
>    - ref:
> http://www.gwtproject.org/doc/latest/DevGuideI18nPluralForms.html
>    - this might not work as it might be @PluralCount-only (not for @Select)
>
>
I just tried this alternate messages in properties file technique and it
will work.

UIMessages.java:
String recurrenceType(@Messages.Select
GlusterVolumeSnapshotScheduleRecurrence recurrence);

UIMessage.properties:
recurrenceType=Incorrect enum
recurrenceType[UNKNOWN]=None
recurrenceType[INTERVAL]=Minute
recurrenceType[HOURLY]=Hourly
recurrenceType[DAILY]=Daily
recurrenceType[WEEKLY]=Weekly
recurrenceType[MONTHLY]=Monthly

The generated code looks like this:
  public java.lang.String
recurrenceType(org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotScheduleRecurrence
arg0) {
    java.lang.String returnVal = null;
    int arg0_ordinal = -1;
    if (arg0 != null) {
      arg0_ordinal = arg0.ordinal();
    }
    switch (arg0_ordinal) {
      case 2:  // DAILY
        returnVal = "Daily";
        break;
      case 1:  // HOURLY
        returnVal = "Hourly";
        break;
      case 0:  // INTERVAL
        returnVal = "Minute";
        break;
      case 4:  // MONTHLY
        returnVal = "Monthly";
        break;
      case 5:  // UNKNOWN
        returnVal = "None";
        break;
      case 3:  // WEEKLY
        returnVal = "Weekly";
        break;
    }
    if (returnVal != null) {
      return returnVal;
    }
    return "Incorrect enum";
  }



> 3, remove @AlternateMessage & handle enum-to-string formatting on our own
>
>    String sizeUnitString(String size, @Messages.Select
> SizeConverter.SizeUnit sizeUnit);
>    becomes
>    String sizeUnitString(String size, String sizeUnitValue);
>
>    String recurrenceType(@Select GlusterVolumeSnapshotScheduleRecurrence
> recurrence);
>    gets removed, because there is no point in having "{0}" message
>
>    getMessages().sizeUnitString(size, sizeUnit);
>    becomes
>    getMessages().sizeUnitString(size, <someUtility>(sizeUnit));
>
>    getMessages().recurrenceType(recurrence);
>    becomes
>    <someUtility>(recurrence);
>
> Personally, I think 3, is the most correct solution. As Alex wrote below,
> we're planning to switch away from GWT i18n mechanism in the long-term;
> relying on @AlternateMessage etc. is therefore an obstacle to that effort.
>

Option 2 is the most expedient and least intrusive.  As a bonus, those
alternate strings will be pushed out to the translators without having to
do additional work/changes.


> Also, we already have infra for localizing enum members: LocalizedEnums
>
> So as part of solution 3, we should add into LocalizedEnums:
>
>   String GlusterVolumeSnapshotScheduleRecurrence___INTERVAL();
>   String GlusterVolumeSnapshotScheduleRecurrence___HOURLY();
>   String GlusterVolumeSnapshotScheduleRecurrence___DAILY();
>   String GlusterVolumeSnapshotScheduleRecurrence___WEEKLY();
>   String GlusterVolumeSnapshotScheduleRecurrence___MONTHLY();
>   String GlusterVolumeSnapshotScheduleRecurrence___UNKNOWN();
>
> plus add corresponding strings in LocalizedEnums.properties file.
>
> This way, we can leverage existing EnumTranslator#translate method.
>
> By doing so, <someUtility> mentioned above === EnumTranslator#translate
>
> Regards,
> Vojtech
>
>
> ----- Original Message -----
> > From: "Alexander Wels" <awels at redhat.com>
> > To: "Ramesh Nachimuthu" <rnachimu at redhat.com>
> > Cc: "devel" <devel at ovirt.org>, "Vojtech Szocs" <vszocs at redhat.com>,
> "Scott Dickerson" <sdickers at redhat.com>
> > Sent: Thursday, July 28, 2016 2:21:23 PM
> > Subject: Re: Strange issues with
> com.google.gwt.i18n.client.Messages.AlternateMessage [bz#1358837]
> >
> > On Thursday, July 28, 2016 05:49:57 AM Ramesh Nachimuthu wrote:
> > > Hi,
> > >
> > >  We have a strange issue with the
> > > com.google.gwt.i18n.client.Messages.AlternateMessage in
> UIMessages.java. We
> > > have defined some alternate messages using @Messages.Select with
> Enums. But
> > > its doesn't work any more.
> > >
> > > We have following messages in the UIMessages.java.
> > >
> > >     @Messages.AlternateMessage(value = { "UNKNOWN" , "None" ,
> "INTERVAL" ,
> > > "Minute" , "HOURLY" , "Hourly" , "DAILY" , "Daily" , "WEEKLY" ,
> "Weekly" ,
> > > "MONTHLY" , "Monthly" }) String recurrenceType(@Messages.Select
> > >     GlusterVolumeSnapshotScheduleRecurrence recurrence);
> > >
> > >     @Messages.AlternateMessage(value = { "BYTES" , "{0} B" , "KiB" ,
> "{0}
> > > KiB" , "MiB" , "{0} MiB" , "GiB" , "{0} GiB" , "TiB" , "{0} TiB" })
> String
> > > sizeUnitString(String size, @Messages.Select
> > >     SizeConverter.SizeUnit sizeUnit);
> > >
> > > But the generated UIMessages_.java doesn't use any of the enum
> conditions.
> > >
> > >   public java.lang.String
> > >
> recurrenceType(org.ovirt.engine.core.common.businessentities.gluster.Gluste
> > > rVolumeSnapshotScheduleRecurrence arg0) { java.lang.String returnVal =
> > > null;
> > >     int arg0_ordinal = -1;
> > >     if (arg0 != null) {
> > >       arg0_ordinal = arg0.ordinal();
> > >     }
> > >     if (returnVal != null) {
> > >       return returnVal;
> > >     }
> > >     return "Incorrect enum";
> > >   }
> > >
> > >   public java.lang.String sizeUnitString(java.lang.String
> > > arg0,org.ovirt.engine.core.common.utils.SizeConverter.SizeUnit arg1) {
> > > java.lang.String returnVal = null;
> > >     int arg1_ordinal = -1;
> > >     if (arg1 != null) {
> > >       arg1_ordinal = arg1.ordinal();
> > >     }
> > >     if (returnVal != null) {
> > >       return returnVal;
> > >     }
> > >     return arg0 + " TiB";
> > >   }
> > >
> > > It used to work earlier. Is there any known issue in the current GWT
> > > Version? or Am I missing something?.
> > >
> > > Regards,
> > > Ramesh
> >
> > We have an active project to remove all the annotations from the Messages
> > interfaces in the project. I am guessing that is probably the cause of
> your
> > problems. I am fairly certain there is an alternative to the annotations
> now,
> > but I don't know of the top of my head. Scott can you give them the
> details?
> >
> > Alexander
> >
> >
>

Regards,
Scott

-- 
Scott Dickerson
Senior Software Engineer
RHEV-M Engineering - UX Team
Red Hat, Inc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ovirt.org/pipermail/devel/attachments/20160728/1bfce011/attachment.html>


More information about the Devel mailing list