Lokalisierung von Monatsnamen.

Neue Plugins usw. Also alles was kein Problem/Verbesserungsvorschlag ist ;).
Antworten
Anton_D

Lokalisierung von Monatsnamen.

Beitrag von Anton_D »

Noch eine Frage: in Russischen wird bei der Datumsangabe (wann?) der Monatsname nicht im Nominativ, sondern im Akkusativ (glaube ich ;-) ) verwendet. TVB benutzt anscheinend einfach Nominativ, die Java liefert. Kann man das irgendwie korrigieren?

Es ist zwar kein Beinbruch, sieht aber komisch aus. Ich habe zwei Stellen gefunden, wo es zu sehen ist: Programmdetails und Gehe zu Datum.

Ob man einfach noch 12 zu lokalisierende Einträge macht oder irgendwelche kluge Bibliothek dafür einbindet - ist auch so eine Frage.
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Lokalisierung von Monatsnamen.

Beitrag von ds10 »

Man müsste zuerst einmal sämtlich Stellen identifizieren, die den Monatsnamen verwenden und dann könnte man eine Übersetzung hinzufügen. Das würde aber logischerweise sowieso erst ab der nächsten Version möglich werden.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Anton_D

Re: Lokalisierung von Monatsnamen.

Beitrag von Anton_D »

Sorry, war faul heute Morgen, habe aber meine Hausaufgaben jetzt gemacht. ;-)

Es wird von MenuBar.updateDateItems() über createDateMenuItem() dann date.getLongDateString() aufgerufen. Dies wird an 2 weiteren Stellen aufgerufen. Die aus dem Fensterkopftext kenne ich - dieser Text ist auch falsch dekliniert. Der Aufruf aus der PluginTreeNode-Klasse kenne ich nicht. Der Aufruf aus der Programm-Anzeige-Plugin habe ich nicht gefunden.

Auf jeden Fall wird dann im getFormattedString() endgültig formatiert. Und zwar jedes Teil von dem Datum getrennt, und am Ende wird zusammengesetzt. Und das ist auch die Quelle des Problems.

Ich habe nach der guten Erklärung gesucht, und habe dann das hier gefunden. (stackoverflow questions 26642720)
Am besten ist aber die Erklärung aus JavaDoc selbst, das Teil über Monat und Kontext.(Link auf SimpleDateFormat bei JDK 17)

Um das schnell zu zeigen, habe ich folgendes kurze Beispiel geschrieben. Man merkt die Unterschiede am Ende des Monatsnamen, mit und ohne Kontext.

Code: Alles auswählen

import java.util.*;
import java.lang.*;
import java.time.*;
import java.text.SimpleDateFormat;

public class FormateDate  {

   public static void main(String[] args) {
   	for (int loopVar=0; loopVar<12; loopVar++) {
          	Date loopDate = Date.from(LocalDate.now( ).plusMonths( loopVar ).atStartOfDay(ZoneId.systemDefault()).toInstant());
          	System.out.println(new SimpleDateFormat("dd MMMM YYYY",  new Locale("ru")).format(loopDate));
          	System.out.println(new SimpleDateFormat("MMMM",  new Locale("ru")).format(loopDate));
        }
    }
}
Daher habe ich nach der kurzen Überlegung folgendes Vorschlag: Man soll nicht getrennt formatieren und dann zusammensetzten, sondern erst den richtigen Pattern zusammensetzten und dann gemeinsam formatieren. Dann hat man auch den Kontext. Eventuell ist das in einigen Sprachen auch für den Tag der Woche wichtig.

Ich habe die Methode umgeschrieben und ich hoffe, es kann so auch gehen ohne Seiteneffekte.

Code: Alles auswählen

    private String getFormattedString_new(final boolean longDay, final boolean longMonth) {
      Calendar cal = getCalendar();
  
      String day = longDay ? "EEEEEE" : "E";
      String month = longMonth ? "MMMMMM" : "MMM";
  
      String dayOfMonth = "d";
  
      java.util.Date javaDate = new java.util.Date(getCalendar().getTimeInMillis());
  
      return new SimpleDateFormat(LOCALIZER.msg("datePattern", "{0}, {1} {2}", day, month, dayOfMonth)).format(javaDate);
      // return LOCALIZER.msg("datePattern", "{0}, {1} {2}", day.format(javaDate), month.format(javaDate), Integer
      //     .toString(dayOfMonth));
  }
Die andern Stellen, an denen SimpleDateFormat.format() aufgerufen wird, scheinen mir unproblematisch zu sein. Es werden da feste, kurze Formatierung-Pattern benutzt.
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Lokalisierung von Monatsnamen.

Beitrag von ds10 »

Ich habe die Methode angepasst, allerdings scheint es unter Linux mit Java 11 jetzt ein anderes Problem zu geben. Im Deutschen werden auch dann, wenn der Kurzname für den Monat gewünscht ist, vollständige Monatsnamen angezeigt. Ist natürlich nicht so entscheidend, dass der volle Monat zu sehen ist.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Anton_D

Re: Lokalisierung von Monatsnamen.

Beitrag von Anton_D »

Ich habe meine Snippets angepasst und könnte das Problematik nachstellen. Es ist aber auch ein Unterschied, ob man hier ein 'M' Pattern oder ein 'L' Pattern benutzt. Und zwar ist die Reaktion in der RU- und DE-Lokale unterschiedlich, was eigentlich nicht sein darf. Ist das ein Java-Bug? Sollen wir zwischenzeitlich nicht nur gesamten Data-Patern (also die Anordnung), sondern auch die benutzte Teile des Pattern selbst (also ob LLL oder MMM) auch auslagern und lokalisieren?
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Lokalisierung von Monatsnamen.

Beitrag von ds10 »

Ich habe das jetzt näher untersucht und denke es handelt sich dabei nicht um einen Bug, sondern um ein Feature. Immer wenn der Monat in die Kurzform passt, wird der vollständig ausgeschrieben. Ist eigentlich auch sinnvoll, ob man Mär. oder März schreibt ist von der Anzahl der Zeichen identisch, da kann man es auch einfach ausschreiben und den Punkt sparen.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Anton_D

Re: Lokalisierung von Monatsnamen.

Beitrag von Anton_D »

Habe jetzt im Nightly getestet, und es sieht gut aus, Deutsch, Englisch oder Russisch.
Antworten