Question

Nous avons eu beaucoup de chaînes qui contenait la même sous-chaîne, de phrases sur la vérification du journal ou comment contacter le support, à des chaînes semblables à l'image de marque contenant le nom de l'entreprise ou d'un produit. La répétition était à l'origine quelques problèmes pour nous-mêmes (principalement fautes de frappe ou d'erreurs de copier / coller), mais elle provoque aussi des problèmes en ce qu'elle augmente la quantité de texte de notre traducteur doit traduire.

La solution que je suis venu avec quelque chose comme ceci:

public class ExpandingResourceBundleControl extends ResourceBundle.Control {
  public static final ResourceBundle.Control EXPANDING =
    new ExpandingResourceBundleControl();

  private ExpandingResourceBundleControl() { }

  @Override
  public ResourceBundle newBundle(String baseName, Locale locale, String format,
                                  ClassLoader loader, boolean reload)
    throws IllegalAccessException, InstantiationException, IOException {

      ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
      return inner == null ? null : new ExpandingResourceBundle(inner, loader);
  }
}

ExpandingResourceBundle délégués au faisceau réel des ressources, mais effectue la conversion de {{this.kind.of.thing}} pour rechercher la clé des ressources.

Chaque fois que vous voulez obtenir un de ceux-ci, vous devez aller:

ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);

Et cela fonctionne très bien -. Pendant un certain temps

Qu'est-ce qui arrive à terme est que certains nouveau code (dans notre cas le code qui a été généré automatiquement craché de Matisse) recherche le même groupe de ressources sans spécifier le contrôle personnalisé. Cela semble être non reproductible si vous écrivez un simple test de l'unité qu'il appelle avec et sans, mais il se produit lorsque l'application est exécutée pour de vrai. D'une certaine façon le cache à l'intérieur ResourceBundle éjecte la bonne valeur et le remplace par le cassé. Je suis encore à comprendre pourquoi et les fichiers jar de Sun ont été compilées sans informations de débogage si le débogage est une corvée.

Mes questions:

  1. Est-il possible de mettre globalement la ResourceBundle.Control par défaut que je ne pourrais pas être au courant? Cela réglerait tout plutôt avec élégance.

  2. Y at-il une autre façon de gérer ce genre de chose avec élégance, peut-être sans altérer les classes ResourceBundle du tout?

Était-ce utile?

La solution

Je pense que cela est une lacune fondamentale de la façon ResourceBundles sont conçus pour fonctionner: principe clés qui font référence à d'autres clés violent automatiquement la SEC (ne pas vous répéter). La façon dont je suis arrivé dans c'était similaire à votre méthode:. Créer une classe ReflectiveResourceBundle qui vous permet de spécifier les clés de ressources dans les messages en utilisant la notation EL

LA MAUVAISE:

my.name.first=Bob
my.name.last=Smith
my.name.full=Bob Smith

LA BONNE VOIE:

my.name.first=Bob
my.name.last=Smith
my.name.full=${my.name.first} ${my.name.last}

J'ai téléchargé le code GitHub pour vous ou quelqu'un d'autre peut télécharger il. De plus, j'ai ajouté quelques exemples de code pour toute personne utilisant le cadre Stripes ( http://www.stripesframework.org/ ) pour vous obtenir rapidement vers le haut et en cours d'exécution.

L'astuce pour obtenir que cela fonctionne avec taglibs fmt standard JSTL était de mettre en place un intercepteur qui a remplacé la ressource du HttpServletRequest avec notre propre. Le code ressemble à ceci:

ResourceBundle bundle = MyStaticResourceHoldingTheBundle.getBundle();
Config.set(request, Config.FMT_LOCALIZATION_CONTEXT, new LocalizationContext(bundle, locale));

Jetez un oeil à l'ensemble de stripes.interceptor dans le lien ci-dessus pour plus de détails.

Autres conseils

Si les répétitions de chaîne sont localisées dans le sens que vous connaissez une certaine chaîne sera répétée mais seulement dans le même projet de sorte que les faisceaux de ressources de partage ne sont pas un cauchemar de conception, alors vous pourriez envisager de casser les chaînes vers le bas en plusieurs Key- les pièces de valeur. Séparer les parties qui se répètent de ceux qui ne le font pas et réutiliser les pièces répétées. Par exemple, permet de dire que vous avez les deux chaînes suivantes vous devez afficher:

  1. « Le Robin capé rouge est un petit indigène d'oiseau passereau en Australie. »
  2. « Le Robin capé rouge se trouve dans les régions sèche dans une grande partie du continent. »

Le groupe de ressources pourrait être la suivante:

robin.name=The Red-capped Robin
robin.native=is a small passerine bird native to Australia.
robin.region=is found in dryer regions across much of the continent.

puis combiner les pièces nécessaires en cas de besoin bundle.getString("robin.name")+bundle.getString(robin.native).

Une chose que vous devez faire attention à bien que les règles de grammaire comme ordre prédicat sujet, etc. pourraient ne pas être la même dans toutes les langues. Donc, vous devez être un peu prudent lors du partage des phrases.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top