Menu

#501 I18N from extension

OJ_2.x
closed-fixed
nobody
None
Windows
5
2021-08-08
2020-08-31
No

Ede, I prefer to document the usage of I18N in Extension in a separate ticket.
Here are two reasons which drove me to use a hack instead of the I18N class (indeed there is a third : I have been too lazy to try to fix the two former reasons) :

  • using categoryPrefixOrPath with properties files in the classpath means files are in a subdirectory named language/jump (generally possible, but no much reason to be constrained like that);
  • the only public method you can use to get a key in this case is getText(final String categoryPrefix, final String key). Currently, getMessage(final Object categoryPrefixOrPathOrI18n,
    final String label, final Object... objects) is private. Not sure if we must make it public or if we must use I18N instances in extensions instead of static methods. A class instance could avoid repeating the categoryPrefixOrPathOrI18n parameter again and again).
  • indeed, we can create an instance of I18 for a particular extension, but we cannot really use it as most methods are static. For example, if I create an instance for myExtension, calling getMessage(final String label, final Object... objects) will not search keys in myExtension but in main openjump properties file

Related

Bugs: #322

Discussion

  • ede

    ede - 2020-08-31

    On 8/31/2020 12:32, michael michaud wrote:

    Ede, I prefer to document the usage of I18N in Extension in a separate ticket.

    ok

    Here are two reasons which drove me to use a hack instead of the I18N class (indeed there is a third : I have been too lazy to try to fix the two former reasons) :
    - using categoryPrefixOrPath with properties files in the classpath means files are in a subdirectory named language/jump (generally possible, but no much reason to be constrained like that);

    i believe that's the the path prefix possibility was added

    • the only public method you can use to get a key in this case is getText(final String categoryPrefix, final String key).

    which i deprecated in favour of the newer more formalized getMessage()

    Currently, getMessage(final Object categoryPrefixOrPathOrI18n,
    final String label, final Object... objects) is private. Not sure if we must make it public or if we must use I18N instances in extensions instead of static methods. A class instance could avoid repeating the categoryPrefixOrPathOrI18n parameter again and again).

    indeed it would. probably why i kept the full getMessage() private too add a way not to be forced to use it over and over. can't tell you anymore. long time ago.

    i see that getMessage(final File path, final String label, final Object... objects) is public already ;)

    • indeed, we can create an instance of I18 for a particular extension, but we cannot really use it as most methods are static. For example, if I create an instance for myExtension, calling getMessage(final String label, final Object... objects) will not search keys in myExtension but in main openjump properties file

    unfortunately we cannot make getMessage() not-static without changing a lot of code. how about just adding instance version just named get(final String label, final Object... objects)? should suffice or?

    ..ede

     
  • ede

    ede - 2020-08-31

    hey Mike,

    ohh fun..
    there is already a static I18N.get(String key) method ;(.. looks like legacy

    i'll add I18N.get(String key, Object ...) instance method for now. and we'll get rid of the static version in OJ2. ok?

    ..ede

     
  • michael michaud

    michael michaud - 2020-08-31

    get(String key) with a single parameter is already used as a static method, so it would be a bit confusing(static get(key) is the most frequently used method of I18N).
    Also the deprecated getText method currently has a static version and a non static version. None of them seem to be used in OpenJUMP.
    Suggestion :
    -keep get and getMessage as static methods only
    -un-deprecate getText(String) instance method
    -add a two parameters getText instance method : getText(String,Object[])
    -remove definitetely the deprecated static getText(String,String) method

    Oh, just see in de.latlon.deejump.wfs.i18n that you can use getMessage(File file,...) to use a properties file located anywhere in your classpath. My first remark about having to name properties file "language/jump.properties" is not true. Nice.
    Also static getMessage(File,String,Object[]) is only used in wfs, and it is used in a derived class in order to remove the first argument. What about removing also this method (replaced by I18N(File).getText() as proposed above ?

    String getText(Syting label)
    String getText(Syting label, Object...objects)
    static String get(Syting label) // legacy
    static String getMessage(Syting label)
    static String getMessage(Syting label, Object...objects)

    must remove :
    static getText(String,String)
    could remove
    static getMessage(File,String,Object...objects)

     
    • ede

      ede - 2020-08-31

      On 8/31/2020 18:19, michael michaud wrote:

      String getText(Syting label)
      String getText(Syting label, Object...objects)
      static String get(Syting label) // legacy
      static String getMessage(Syting label)
      static String getMessage(Syting label, Object...objects)

      must remove :
      static getText(String,String)
      could remove
      static getMessage(File,String,Object...objects)

      don't like getText() vs getMessage(). i suppose that is going to confuse developers, because actually there is no difference between text and Message here.

      we have the rare chance of breaking backward compatibility with OJ2 let's take advantage of it as we will have to touch every extension anyway!

      let me propose something logically more sound, even if it'll be a little bit more work for us

      static (we could hide these, but i don't see why. when first argument is null the default resourcebundles are used)
      get(File,String,Object...objects)
      get(String,String,Object...objects)

      instance
      get(String,Object...objects) //this notation includes get(String) without objects as well

      this'll allow for OJ Core
      I18N.getInstance().get(String)

      for instances
      I18N.getInstance("my.great.extension").get(String)
      or
      I18N i18n = I18N.getInstance("my.great.extension");
      i18n.get(String)
      i18n.get(String, Object, Object)
      i18n.get(String, new Object[]{ o1, o2, o3})

       
  • michael michaud

    michael michaud - 2020-08-31

    Yes, neat, i'm ok with this proposition ;-)
    Does it mean you would also remove getMessage variant ?

     
    • ede

      ede - 2020-08-31

      On 31.08.2020 19:15, michael michaud wrote:

      Yes, neat, i'm ok with this proposition ;-)
      Does it mean you would also remove getMessage variant ?

      absolutely. only the mentioned methods will survive. the milestone is already set to OJ2. let's tackle it then. ..ede

       
  • ede

    ede - 2020-09-13
    • Milestone: undecided --> OJ_2.x
     
  • ede

    ede - 2021-08-08
    • status: open --> closed-fixed
     
  • ede

    ede - 2021-08-08
     

Log in to post a comment.

MongoDB Logo MongoDB