Localizable.java

  1. /*
  2.  * Licensed to the Apache Software Foundation (ASF) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * The ASF licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *      https://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */

  17. /*
  18.  * This is not the original file distributed by the Apache Software Foundation
  19.  * It has been modified by the Hipparchus project
  20.  */
  21. package org.hipparchus.exception;

  22. import java.io.Serializable;
  23. import java.util.Locale;
  24. import java.util.MissingResourceException;
  25. import java.util.ResourceBundle;

  26. /**
  27.  * Interface for localizable strings.
  28.  *
  29.  */
  30. public interface Localizable extends Serializable {
  31.     /**
  32.      * Gets the source (non-localized) string.
  33.      *
  34.      * @return the source string.
  35.      */
  36.     String getSourceString();

  37.     /**
  38.      * Gets the localized string.
  39.      *
  40.      * @param locale locale into which to get the string.
  41.      * @return the localized string or the source string if no
  42.      * localized version is available.
  43.      */
  44.     String getLocalizedString(Locale locale);

  45.     /**
  46.      * Gets the localized string.
  47.      *
  48.      * @param baseName base name of the resource bundle
  49.      * @param key key of the item in the bundle
  50.      * @param locale locale into which to get the string.
  51.      * @return the localized string or the source string if no
  52.      * localized version is available.
  53.      */
  54.     default String getLocalizedString(final String baseName, final String key, final Locale locale) {

  55.         try {
  56.             final ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale, new UTF8Control());
  57.             if (bundle.getLocale().getLanguage().equals(locale.getLanguage()))
  58.             {
  59.                 final String translated = bundle.getString(key);
  60.                 if (!(translated.isEmpty() || translated.toLowerCase(locale).contains("missing translation")))
  61.                 {
  62.                     // the value of the resource is the translated format
  63.                     return translated;
  64.                 }
  65.             }
  66.         } catch (MissingResourceException mre) { // NOPMD
  67.             // do nothing here
  68.         }

  69.         // either the locale is not supported or the resource is not translated, or
  70.         // it is unknown: don't translate and fall back to using the source format
  71.         return getSourceString();

  72.     }

  73. }