* Patches: Timezone in %c and POT file @ 2015-12-30 10:56 Markus Wichmann 2015-12-30 15:58 ` Rich Felker 0 siblings, 1 reply; 3+ messages in thread From: Markus Wichmann @ 2015-12-30 10:56 UTC (permalink / raw) To: musl [-- Attachment #1: Type: text/plain, Size: 2795 bytes --] Hi all, Now I have subscribed, so CC'ing me is no longer necessary. Today I worked on two things: Firstly, I put the timezone into strftime's %c output. The reason is that glibc's strftime() does the same. That means, that an application dev currently can't depend on either behavior (so strftime("%c %Z") will give me the timezone twice on glibc, but only once on musl, and my app won't be able to tell without inspecting the resulting string). No biggie, changing that one is easy. Of course, a heated argument can be had over whether or not we want it one way or the other. And it'll come down to personal taste, because as far as I'm aware, POSIX isn't mandating anything about this. Then I noticed, that for quite some time now, musl has been supporting .mo files, but no infrastructure is in place for them (i.e. no POT file nor any PO file is shipped). I tried searching around for POT or PO file, but I couldn't find any. So I added a handwritten POT file and a German PO file (I'm not proficient enough in any languages besides English and German to want to create that file for any other languages. And an English PO file would be kind of redundant.) I filled the POT file with all the strings I could find, that would ever be plugged into __lctrans(). That gives me strerror(), strsignal(), gai_strerror(), hstrerror(), and __getopt_msg() strings. Unfortunately this design is running into some problems: At the moment several strings are empty in the C locale (which is fine), but they could translate to something else in some other locale (nl_langinfo()'s ERA* and THOUSEP come to mind). Some strings in the C locale are the exact same and might translate to something else in some language (the long and short forms of "May" for instance). I think glibc solves that problem with another file format for libc's locales, which is a headache I don't want to think about this year anymore. The second patch might be applicable to musl without the first by accident: I left the format for ERA_D_T_FMT untouched, so looking up the unchanged D_T_FMT would give that as a result. (Though I did translate ERA_D_T_FMT.) To make it clear to people who don't like locale: I changed nothing about the build system. Locale MOs still aren't built and installed automatically. That wouldn't even be possible without mandating a default value for MUSL_LOCPATH. However, I tried it out (installed it somewhere, put that location into MUSL_LOCPATH and called strftime("%c")) and that seems to work. If we got this far, then that means the file is found and can be mapped and the lookup works. So the only thing that might be broken now is bad translations or typos in the PO file. (Well, or anything unforseen, as usual.) Also, as usual, criticisms and comments are welcome. Ciao, Markus [-- Attachment #2: 0001-Add-timezone-to-strftime-s-c.patch --] [-- Type: text/x-diff, Size: 833 bytes --] From 2371b3107a3cb39fdd53222021a0853bd05341cf Mon Sep 17 00:00:00 2001 From: Markus Wichmann <nullplan@gmx.net> Date: Wed, 30 Dec 2015 08:53:27 +0100 Subject: [PATCH 1/2] Add timezone to strftime's %c. glibc has the timezone there as well. I wanted to equalize it. POSIX says nothing on the matter, so either behavior is correct. --- src/locale/langinfo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locale/langinfo.c b/src/locale/langinfo.c index b2c8569..7bfc9da 100644 --- a/src/locale/langinfo.c +++ b/src/locale/langinfo.c @@ -13,7 +13,7 @@ static const char c_time[] = "May\0" "June\0" "July\0" "August\0" "September\0" "October\0" "November\0" "December\0" "AM\0" "PM\0" - "%a %b %e %T %Y\0" + "%a %b %e %T %Y %Z\0" "%m/%d/%y\0" "%H:%M:%S\0" "%I:%M:%S %p\0" -- 2.1.4 [-- Attachment #3: 0002-Add-musl-PO-template-and-German-PO-file.patch --] [-- Type: text/x-diff, Size: 22363 bytes --] From 42e9680f840646b0cebc4d1d42a661b5783e5535 Mon Sep 17 00:00:00 2001 From: Markus Wichmann <nullplan@gmx.net> Date: Wed, 30 Dec 2015 11:17:49 +0100 Subject: [PATCH 2/2] Add musl PO template and German PO file. No change to build system -- if you want locale, you have to work for it. --- po/de.po | 593 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ po/musl.pot | 582 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1175 insertions(+) create mode 100644 po/de.po create mode 100644 po/musl.pot diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..29cf025 --- /dev/null +++ b/po/de.po @@ -0,0 +1,593 @@ +msgid "" +msgstr "" +"Project-Id-Version: musl-git\n" +"PO-Revision-Date: 2015-12-30 10:34+0100\n" +"Last-Translator: Markus Wichmann <nullplan@gmx.net>\n" +"Language-Team: German\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Illegal byte sequence" +msgstr "Ungültige Bytesequenz" + +msgid "Domain error" +msgstr "Wertebereichsfehler" + +msgid "Result not representable" +msgstr "Ergebnis nicht darstellbar" + +msgid "Not a tty" +msgstr "Kein Terminal" + +msgid "Permission denied" +msgstr "Zugriff verweigert" + +msgid "Operation not permitted" +msgstr "Operation nicht erlaubt" + +msgid "No such file or directory" +msgstr "Datei oder Verzeichnis nicht gefunden" + +msgid "No such process" +msgstr "Prozess nicht gefunden" + +msgid "File exists" +msgstr "Datei existiert bereits" + +msgid "Value too large for data type" +msgstr "Wert zu groß für Datentyp" + +msgid "No space left on device" +msgstr "Kein Platz mehr auf dem Gerät" + +msgid "Resource busy" +msgstr "Ressource beschäftigt" + +msgid "Interrupted system call" +msgstr "Systemaufruf unterbrochen" + +msgid "Resource temporarily unavailable" +msgstr "Ressource derzeit nicht verfügbar" + +msgid "Invalid seek" +msgstr "Ungültige seek-Operation" + +msgid "Cross-device link" +msgstr "Verknüpfung über Gerätegrenzen hinweg" + +msgid "Read-only file system" +msgstr "Dateisystem steht auf Nur-Lesen" + +msgid "Directory not empty" +msgstr "Verzeichnis ist nicht leer" + +msgid "Connection reset by peer" +msgstr "Verbindung von Partner zurückgesetzt" + +msgid "Operation timed out" +msgstr "Zeit für Operation abgelaufen" + +msgid "Connection refused" +msgstr "Verbindung abgelehnt" + +msgid "Host is down" +msgstr "Host antwortet nicht" + +msgid "Host is unreachable" +msgstr "Host ist nicht erreichbar" + +msgid "Address in use" +msgstr "Adresse in Benutzung" + +msgid "Broken pipe" +msgstr "Pipe kaputt" + +msgid "I/O error" +msgstr "E/A-Fehler" + +msgid "No such device or address" +msgstr "Gerät oder Adresse nicht gefunden" + +msgid "Block device required" +msgstr "Block-Gerät nötig" + +msgid "No such device" +msgstr "Gerät nicht gefunden" + +msgid "Not a directory" +msgstr "Kein Verzeichnis" + +msgid "Is a directory" +msgstr "Ist ein Verzeichnis" + +msgid "Text file busy" +msgstr "Programmdatei in Benutzung" + +msgid "Exec format error" +msgstr "Programmformatfehler" + +msgid "Invalid argument" +msgstr "Ungültiger Parameter" + +msgid "Argument list too long" +msgstr "Parameterliste zu lang" + +msgid "Symbolic link loop" +msgstr "Schleife aus symbolischen Verknüpfungen" + +msgid "Filename too long" +msgstr "Dateiname zu lang" + +msgid "Too many open files in system" +msgstr "Zu viele Dateien im System offen" + +msgid "No file descriptors available" +msgstr "Keine Dateideskriptoren verfügbar" + +msgid "Bad file descriptor" +msgstr "Kein Dateideskriptor" + +msgid "No child process" +msgstr "Kein Kindprozess" + +msgid "Bad address" +msgstr "Schlechte Adresse" + +msgid "File too large" +msgstr "Datei zu groß" + +msgid "Too many links" +msgstr "Zu viele Verknüpfungen" + +msgid "No locks available" +msgstr "Keine Locks verfügbar" + +msgid "Resource deadlock would occur" +msgstr "Deadlock-Fehler" + +msgid "State not recoverable" +msgstr "Zustand nicht regenerierbar" + +msgid "Previous owner died" +msgstr "Vorheriger Besitzer gestorben" + +msgid "Operation canceled" +msgstr "Operation abgebrochen" + +msgid "Function not implemented" +msgstr "Funktion nicht implementiert" + +msgid "No message of desired type" +msgstr "Keine Nachricht des gewünschten Typs" + +msgid "Identifier removed" +msgstr "Identifikator entfernt" + +msgid "Device not a stream" +msgstr "Gerät ist kein Datenstrom" + +msgid "No data available" +msgstr "Keine Daten verfügbar" + +msgid "Device timeout" +msgstr "Zeitüberschreitung des Geräts" + +msgid "Out of streams resources" +msgstr "Keine Datenströme verfügbar" + +msgid "Link has been severed" +msgstr "Verbindung getrennt" + +msgid "Protocol error" +msgstr "Protokollfehler" + +msgid "Bad message" +msgstr "Kaputte Nachricht" + +msgid "File descriptor in bad state" +msgstr "Dateideskriptor in falschem Zustand" + +msgid "Not a socket" +msgstr "Kein Socket" + +msgid "Destination address required" +msgstr "Zieladresse nötig" + +msgid "Message too large" +msgstr "Nachricht zu groß" + +msgid "Protocol wrong type for socket" +msgstr "Protokolltyp falsch für diesen Socket" + +msgid "Protocol not available" +msgstr "Protokoll nicht verfügbar" + +msgid "Protocol not supported" +msgstr "Protokoll nicht unterstützt" + +msgid "Socket type not supported" +msgstr "Socket-Typ nicht unterstützt" + +msgid "Not supported" +msgstr "Nicht unterstützt" + +msgid "Protocol family not supported" +msgstr "Protokollfamilie nicht unterstützt" + +msgid "Address family not supported by protocol" +msgstr "Adressfamilie vom Protokoll nicht unterstützt" + +msgid "Address not available" +msgstr "Adresse nicht verfügbar" + +msgid "Network is down" +msgstr "Netzwerk nicht verfügbar" + +msgid "Network unreachable" +msgstr "Netzwerk nicht erreichbar" + +msgid "Connection reset by network" +msgstr "Verbindung durch Netzwerk zurückgesetzt" + +msgid "Connection aborted" +msgstr "Verbindung abgebrochen" + +msgid "No buffer space available" +msgstr "Kein Pufferspeicher verfügbar" + +msgid "Socket is connected" +msgstr "Socket ist verbunden" + +msgid "Socket not connected" +msgstr "Socket ist nicht verbunden" + +msgid "Cannot send after socket shutdown" +msgstr "Kann nach Socket-Abschaltung nicht mehr senden" + +msgid "Operation already in progress" +msgstr "Operation läuft bereits" + +msgid "Operation in progress" +msgstr "Operation läuft" + +msgid "Stale file handle" +msgstr "Datei-Handle ist veraltet" + +msgid "Remote I/O error" +msgstr "Entfernter E/A-Fehler" + +msgid "Quota exceeded" +msgstr "Quote überschritten" + +msgid "No medium found" +msgstr "Kein Medium gefunden" + +msgid "Wrong medium type" +msgstr "Falscher Medientyp" + +msgid "No error information" +msgstr "Keine Fehlerinformation" + +msgid "Sun" +msgstr "So" + +msgid "Mon" +msgstr "Mo" + +msgid "Tue" +msgstr "Di" + +msgid "Wed" +msgstr "Mi" + +msgid "Thu" +msgstr "Do" + +msgid "Fri" +msgstr "Fr" + +msgid "Sat" +msgstr "Sa" + +msgid "Sunday" +msgstr "Sonntag" + +msgid "Monday" +msgstr "Montag" + +msgid "Tuesday" +msgstr "Dienstag" + +msgid "Wednesday" +msgstr "Mittwoch" + +msgid "Thursday" +msgstr "Donnerstag" + +msgid "Friday" +msgstr "Freitag" + +msgid "Saturday" +msgstr "Samstag" + +msgid "Jan" +msgstr "Jan" + +msgid "Feb" +msgstr "Feb" + +msgid "Mar" +msgstr "Mär" + +msgid "Apr" +msgstr "Apr" + +msgid "May" +msgstr "Mai" + +msgid "Jun" +msgstr "Jun" + +msgid "Jul" +msgstr "Jul" + +msgid "Aug" +msgstr "Aug" + +msgid "Sep" +msgstr "Sep" + +msgid "Oct" +msgstr "Okt" + +msgid "Nov" +msgstr "Nov" + +msgid "Dec" +msgstr "Dez" + +msgid "January" +msgstr "Januar" + +msgid "February" +msgstr "Februar" + +msgid "March" +msgstr "März" + +msgid "April" +msgstr "April" + +msgid "June" +msgstr "Juni" + +msgid "July" +msgstr "Juli" + +msgid "August" +msgstr "August" + +msgid "September" +msgstr "September" + +msgid "October" +msgstr "Oktober" + +msgid "November" +msgstr "November" + +msgid "December" +msgstr "Dezember" + +msgid "AM" +msgstr "" + +msgid "PM" +msgstr "" + +msgid "%a %b %e %T %Y %Z" +msgstr "%a %e %b %Y %T %Z" + +msgid "%m/%d/%y" +msgstr "%d.%m.%y" + +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +msgid "%I:%M:%S %p" +msgstr "%H:%M:%S" + +msgid "0123456789" +msgstr "0123456789" + +msgid "%a %b %e %T %Y" +msgstr "%a %e %b %Y %T" + +msgid "^[yY]" +msgstr "^[jJ]" + +msgid "^[nN]" +msgstr "^[nN]" + +msgid "yes" +msgstr "ja" + +msgid "no" +msgstr "nein" + +msgid "." +msgstr "," + +msgid "Invalid flags" +msgstr "Ungülige Flags" + +msgid "Name does not resolve" +msgstr "Name kann nicht aufgelöst werden" + +msgid "Try again" +msgstr "Versuche es erneut" + +msgid "Non-recoverable error" +msgstr "Nicht behebbarer Fehler" + +msgid "Unknown error" +msgstr "Unbekannter Fehler" + +msgid "Unrecognized address family or invalid length" +msgstr "Unbekannte Adressfamilie oder ungültige Länge" + +msgid "Unrecognized socket type" +msgstr "Unbekannter Socket-Typ" + +msgid "Unrecognized service" +msgstr "Unbekannter Dienst" + +msgid "System error" +msgstr "Systemfehler" + +msgid "Overflow" +msgstr "Überlauf" + +msgid "Host not found" +msgstr "Host nicht gefunden" + +msgid "No error" +msgstr "Kein Fehler" + +msgid "No match" +msgstr "Kein Treffer" + +msgid "Invalid regexp" +msgstr "Ungültiger Regex" + +msgid "Unknown collating element" +msgstr "Unbekanntes Kollationselement" + +msgid "Unknown character class name" +msgstr "Unbekannter Zeichenklassenname" + +msgid "Trailing backslash" +msgstr "Backslash am Ende" + +msgid "Invalid back reference" +msgstr "Ungültige Rück-Referenz" + +msgid "Missing ']'" +msgstr "Fehlendes ']'" + +msgid "Missing ')'" +msgstr "Fehlendes ')'" + +msgid "Missing '}'" +msgstr "Fehlendes '}'" + +msgid "Invalid contents of {}" +msgstr "Ungültiger Inhalt von {}" + +msgid "Invalid character range" +msgstr "Ungültige Zeichenklasse" + +msgid "Repetition not preceded by valid expression" +msgstr "Vor Wiederholung steht kein gültiger Ausdruck" + +msgid "Unknown signal" +msgstr "Unbekanntes Signal" + +msgid "Hangup" +msgstr "Aufgehängt" + +msgid "Interrupt" +msgstr "Unterbrechung" + +msgid "Quit" +msgstr "Abbruch" + +msgid "Illegal instruction" +msgstr "Ungültige Anweisung" + +msgid "Trace/breakpoint trap" +msgstr "Breakpoint getroffen" + +msgid "Aborted" +msgstr "Abgebrochen" + +msgid "Bus error" +msgstr "Busfehler" + +msgid "Arithmetic exception" +msgstr "Arithmetischer Fehler" + +msgid "Killed" +msgstr "Getötet" + +msgid "User defined signal 1" +msgstr "Benutzerdefiniertes Signal 1" + +msgid "Segmentation fault" +msgstr "Segmentierungsfehler" + +msgid "User defined signal 2" +msgstr "Benutzerdefiniertes Signal 2" + +msgid "Alarm clock" +msgstr "Wecker hat geklingelt" + +msgid "Terminated" +msgstr "Terminiert" + +msgid "Stack fault" +msgstr "Stackfehler" + +msgid "Child process status" +msgstr "Kindprozessstatus geändert" + +msgid "Continued" +msgstr "Fortgesetzt" + +msgid "Stopped (signal)" +msgstr "Gestoppt (Signal)" + +msgid "Stopped" +msgstr "Gestoppt" + +msgid "Stopped (tty input)" +msgstr "Gestoppt (Terminal-Eingabe)" + +msgid "Stopped (tty output)" +msgstr "Gestoppt (Terminal-Ausgabe)" + +msgid "Urgent I/O condition" +msgstr "Dringende E/A-Situation" + +msgid "CPU time limit exceeded" +msgstr "CPU-Zeitbegrenzung überschritten" + +msgid "File size limit exceeded" +msgstr "Dateigrößenbeschränkung überschritten" + +msgid "Virtual timer expired" +msgstr "Virtueller Timer abgelaufen" + +msgid "Profiling timer expired" +msgstr "Timer zum Profilen abgelaufen" + +msgid "Window changed" +msgstr "Fenstergröße geändert" + +msgid "I/O possible" +msgstr "E/A möglich" + +msgid "Power failure" +msgstr "Stromausfall" + +msgid "Bad system call" +msgstr "Unbekannter Systemaufruf" + +msgid ": unrecognized option: " +msgstr ": Unbekannte Option: " + +msgid ": option requires an argument: " +msgstr ": Option benötigt einen Parameter: " diff --git a/po/musl.pot b/po/musl.pot new file mode 100644 index 0000000..699e8f5 --- /dev/null +++ b/po/musl.pot @@ -0,0 +1,582 @@ +msgid "Illegal byte sequence" +msgstr "Illegal byte sequence" + +msgid "Domain error" +msgstr "Domain error" + +msgid "Result not representable" +msgstr "Result not representable" + +msgid "Not a tty" +msgstr "Not a tty" + +msgid "Permission denied" +msgstr "Permission denied" + +msgid "Operation not permitted" +msgstr "Operation not permitted" + +msgid "No such file or directory" +msgstr "No such file or directory" + +msgid "No such process" +msgstr "No such process" + +msgid "File exists" +msgstr "File exists" + +msgid "Value too large for data type" +msgstr "Value too large for data type" + +msgid "No space left on device" +msgstr "No space left on device" + +msgid "Resource busy" +msgstr "Resource busy" + +msgid "Interrupted system call" +msgstr "Interrupted system call" + +msgid "Resource temporarily unavailable" +msgstr "Resource temporarily unavailable" + +msgid "Invalid seek" +msgstr "Invalid seek" + +msgid "Cross-device link" +msgstr "Cross-device link" + +msgid "Read-only file system" +msgstr "Read-only file system" + +msgid "Directory not empty" +msgstr "Directory not empty" + +msgid "Connection reset by peer" +msgstr "Connection reset by peer" + +msgid "Operation timed out" +msgstr "Operation timed out" + +msgid "Connection refused" +msgstr "Connection refused" + +msgid "Host is down" +msgstr "Host is down" + +msgid "Host is unreachable" +msgstr "Host is unreachable" + +msgid "Address in use" +msgstr "Address in use" + +msgid "Broken pipe" +msgstr "Broken pipe" + +msgid "I/O error" +msgstr "I/O error" + +msgid "No such device or address" +msgstr "No such device or address" + +msgid "Block device required" +msgstr "Block device required" + +msgid "No such device" +msgstr "No such device" + +msgid "Not a directory" +msgstr "Not a directory" + +msgid "Is a directory" +msgstr "Is a directory" + +msgid "Text file busy" +msgstr "Text file busy" + +msgid "Exec format error" +msgstr "Exec format error" + +msgid "Invalid argument" +msgstr "Invalid argument" + +msgid "Argument list too long" +msgstr "Argument list too long" + +msgid "Symbolic link loop" +msgstr "Symbolic link loop" + +msgid "Filename too long" +msgstr "Filename too long" + +msgid "Too many open files in system" +msgstr "Too many open files in system" + +msgid "No file descriptors available" +msgstr "No file descriptors available" + +msgid "Bad file descriptor" +msgstr "Bad file descriptor" + +msgid "No child process" +msgstr "No child process" + +msgid "Bad address" +msgstr "Bad address" + +msgid "File too large" +msgstr "File too large" + +msgid "Too many links" +msgstr "Too many links" + +msgid "No locks available" +msgstr "No locks available" + +msgid "Resource deadlock would occur" +msgstr "Resource deadlock would occur" + +msgid "State not recoverable" +msgstr "State not recoverable" + +msgid "Previous owner died" +msgstr "Previous owner died" + +msgid "Operation canceled" +msgstr "Operation canceled" + +msgid "Function not implemented" +msgstr "Function not implemented" + +msgid "No message of desired type" +msgstr "No message of desired type" + +msgid "Identifier removed" +msgstr "Identifier removed" + +msgid "Device not a stream" +msgstr "Device not a stream" + +msgid "No data available" +msgstr "No data available" + +msgid "Device timeout" +msgstr "Device timeout" + +msgid "Out of streams resources" +msgstr "Out of streams resources" + +msgid "Link has been severed" +msgstr "Link has been severed" + +msgid "Protocol error" +msgstr "Protocol error" + +msgid "Bad message" +msgstr "Bad message" + +msgid "File descriptor in bad state" +msgstr "File descriptor in bad state" + +msgid "Not a socket" +msgstr "Not a socket" + +msgid "Destination address required" +msgstr "Destination address required" + +msgid "Message too large" +msgstr "Message too large" + +msgid "Protocol wrong type for socket" +msgstr "Protocol wrong type for socket" + +msgid "Protocol not available" +msgstr "Protocol not available" + +msgid "Protocol not supported" +msgstr "Protocol not supported" + +msgid "Socket type not supported" +msgstr "Socket type not supported" + +msgid "Not supported" +msgstr "Not supported" + +msgid "Protocol family not supported" +msgstr "Protocol family not supported" + +msgid "Address family not supported by protocol" +msgstr "Address family not supported by protocol" + +msgid "Address not available" +msgstr "Address not available" + +msgid "Network is down" +msgstr "Network is down" + +msgid "Network unreachable" +msgstr "Network unreachable" + +msgid "Connection reset by network" +msgstr "Connection reset by network" + +msgid "Connection aborted" +msgstr "Connection aborted" + +msgid "No buffer space available" +msgstr "No buffer space available" + +msgid "Socket is connected" +msgstr "Socket is connected" + +msgid "Socket not connected" +msgstr "Socket not connected" + +msgid "Cannot send after socket shutdown" +msgstr "Cannot send after socket shutdown" + +msgid "Operation already in progress" +msgstr "Operation already in progress" + +msgid "Operation in progress" +msgstr "Operation in progress" + +msgid "Stale file handle" +msgstr "Stale file handle" + +msgid "Remote I/O error" +msgstr "Remote I/O error" + +msgid "Quota exceeded" +msgstr "Quota exceeded" + +msgid "No medium found" +msgstr "No medium found" + +msgid "Wrong medium type" +msgstr "Wrong medium type" + +msgid "No error information" +msgstr "No error information" + + +msgid "Sun" +msgstr "Sun" + +msgid "Mon" +msgstr "Mon" + +msgid "Tue" +msgstr "Tue" + +msgid "Wed" +msgstr "Wed" + +msgid "Thu" +msgstr "Thu" + +msgid "Fri" +msgstr "Fri" + +msgid "Sat" +msgstr "Sat" + +msgid "Sunday" +msgstr "Sunday" + +msgid "Monday" +msgstr "Monday" + +msgid "Tuesday" +msgstr "Tuesday" + +msgid "Wednesday" +msgstr "Wednesday" + +msgid "Thursday" +msgstr "Thursday" + +msgid "Friday" +msgstr "Friday" + +msgid "Saturday" +msgstr "Saturday" + +msgid "Jan" +msgstr "Jan" + +msgid "Feb" +msgstr "Feb" + +msgid "Mar" +msgstr "Mar" + +msgid "Apr" +msgstr "Apr" + +msgid "May" +msgstr "May" + +msgid "Jun" +msgstr "Jun" + +msgid "Jul" +msgstr "Jul" + +msgid "Aug" +msgstr "Aug" + +msgid "Sep" +msgstr "Sep" + +msgid "Oct" +msgstr "Oct" + +msgid "Nov" +msgstr "Nov" + +msgid "Dec" +msgstr "Dec" + +msgid "January" +msgstr "January" + +msgid "February" +msgstr "February" + +msgid "March" +msgstr "March" + +msgid "April" +msgstr "April" + +msgid "June" +msgstr "June" + +msgid "July" +msgstr "July" + +msgid "August" +msgstr "August" + +msgid "September" +msgstr "September" + +msgid "October" +msgstr "October" + +msgid "November" +msgstr "November" + +msgid "December" +msgstr "December" + +msgid "AM" +msgstr "AM" + +msgid "PM" +msgstr "PM" + +msgid "%a %b %e %T %Y %Z" +msgstr "%a %b %e %T %Y %Z" + +msgid "%m/%d/%y" +msgstr "%m/%d/%y" + +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +msgid "0123456789" +msgstr "0123456789" + +msgid "%a %b %e %T %Y" +msgstr "%a %b %e %T %Y" + +msgid "^[yY]" +msgstr "^[yY]" + +msgid "^[nN]" +msgstr "^[nN]" + +msgid "yes" +msgstr "yes" + +msgid "no" +msgstr "no" + +msgid "." +msgstr "." + +msgid "Invalid flags" +msgstr "Invalid flags" + +msgid "Name does not resolve" +msgstr "Name does not resolve" + +msgid "Try again" +msgstr "Try again" + +msgid "Non-recoverable error" +msgstr "Non-recoverable error" + +msgid "Unknown error" +msgstr "Unknown error" + +msgid "Unrecognized address family or invalid length" +msgstr "Unrecognized address family or invalid length" + +msgid "Unrecognized socket type" +msgstr "Unrecognized socket type" + +msgid "Unrecognized service" +msgstr "Unrecognized service" + +msgid "System error" +msgstr "System error" + +msgid "Overflow" +msgstr "Overflow" + +msgid "Host not found" +msgstr "Host not found" + +msgid "No error" +msgstr "No error" + +msgid "No match" +msgstr "No match" + +msgid "Invalid regexp" +msgstr "Invalid regexp" + +msgid "Unknown collating element" +msgstr "Unknown collating element" + +msgid "Unknown character class name" +msgstr "Unknown character class name" + +msgid "Trailing backslash" +msgstr "Trailing backslash" + +msgid "Invalid back reference" +msgstr "Invalid back reference" + +msgid "Missing ']'" +msgstr "Missing ']'" + +msgid "Missing ')'" +msgstr "Missing ')'" + +msgid "Missing '}'" +msgstr "Missing '}'" + +msgid "Invalid contents of {}" +msgstr "Invalid contents of {}" + +msgid "Invalid character range" +msgstr "Invalid character range" + +msgid "Repetition not preceded by valid expression" +msgstr "Repetition not preceded by valid expression" + +msgid "Unknown signal" +msgstr "Unknown signal" + +msgid "Hangup" +msgstr "Hangup" + +msgid "Interrupt" +msgstr "Interrupt" + +msgid "Quit" +msgstr "Quit" + +msgid "Illegal instruction" +msgstr "Illegal instruction" + +msgid "Trace/breakpoint trap" +msgstr "Trace/breakpoint trap" + +msgid "Aborted" +msgstr "Aborted" + +msgid "Bus error" +msgstr "Bus error" + +msgid "Arithmetic exception" +msgstr "Arithmetic exception" + +msgid "Killed" +msgstr "Killed" + +msgid "User defined signal 1" +msgstr "User defined signal 1" + +msgid "Segmentation fault" +msgstr "Segmentation fault" + +msgid "User defined signal 2" +msgstr "User defined signal 2" + +msgid "Alarm clock" +msgstr "Alarm clock" + +msgid "Terminated" +msgstr "Terminated" + +msgid "Stack fault" +msgstr "Stack fault" + +msgid "Child process status" +msgstr "Child process status" + +msgid "Continued" +msgstr "Continued" + +msgid "Stopped (signal)" +msgstr "Stopped (signal)" + +msgid "Stopped" +msgstr "Stopped" + +msgid "Stopped (tty input)" +msgstr "Stopped (tty input)" + +msgid "Stopped (tty output)" +msgstr "Stopped (tty output)" + +msgid "Urgent I/O condition" +msgstr "Urgent I/O condition" + +msgid "CPU time limit exceeded" +msgstr "CPU time limit exceeded" + +msgid "File size limit exceeded" +msgstr "File size limit exceeded" + +msgid "Virtual timer expired" +msgstr "Virtual timer expired" + +msgid "Profiling timer expired" +msgstr "Profiling timer expired" + +msgid "Window changed" +msgstr "Window changed" + +msgid "I/O possible" +msgstr "I/O possible" + +msgid "Power failure" +msgstr "Power failure" + +msgid "Bad system call" +msgstr "Bad system call" + +msgid ": unrecognized option: " +msgstr ": unrecognized option: " + +msgid ": option requires an argument: " +msgstr ": option requires an argument: " -- 2.1.4 ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Patches: Timezone in %c and POT file 2015-12-30 10:56 Patches: Timezone in %c and POT file Markus Wichmann @ 2015-12-30 15:58 ` Rich Felker 2015-12-31 9:37 ` Markus Wichmann 0 siblings, 1 reply; 3+ messages in thread From: Rich Felker @ 2015-12-30 15:58 UTC (permalink / raw) To: musl On Wed, Dec 30, 2015 at 11:56:33AM +0100, Markus Wichmann wrote: > Hi all, > > Now I have subscribed, so CC'ing me is no longer necessary. > > Today I worked on two things: Firstly, I put the timezone into > strftime's %c output. The reason is that glibc's strftime() does the > same. That means, that an application dev currently can't depend on > either behavior (so strftime("%c %Z") will give me the timezone twice on > glibc, but only once on musl, and my app won't be able to tell without > inspecting the resulting string). > > No biggie, changing that one is easy. Of course, a heated argument can > be had over whether or not we want it one way or the other. And it'll > come down to personal taste, because as far as I'm aware, POSIX isn't > mandating anything about this. The format for %c in the C locale is strictly specified by ISO C as "%a %b %e %T %Y"; see 7.27.3.5 ¶ 7. If glibc does not match this it's a bug in glibc. POSIX is of course aligned with ISO C and says the same thing. In other locales it's permitted to differ. > Then I noticed, that for quite some time now, musl has been supporting > ..mo files, but no infrastructure is in place for them (i.e. no POT file > nor any PO file is shipped). I tried searching around for POT or PO > file, but I couldn't find any. So I added a handwritten POT file and a > German PO file (I'm not proficient enough in any languages besides > English and German to want to create that file for any other languages. > And an English PO file would be kind of redundant.) > > I filled the POT file with all the strings I could find, that would ever > be plugged into __lctrans(). That gives me strerror(), strsignal(), > gai_strerror(), hstrerror(), and __getopt_msg() strings. Have you read the thread "Call for locales maintainer & contributors" from when locale support launched? Here's a link to the start of it: http://www.openwall.com/lists/musl/2014/07/24/14 It might have some useful ideas. The main one I'd like to point out is the idea to develop and maintain locales as a separate repo outside of the source repo. Unlike glibc, we don't have a lot of messages that should be expected to change frequently, so I think the issues with keeping sync are minimal, while there are several advantages: - Not having translation progress stalled-by/tied-to code release cycles. - Saving users who don't want locales from having to download them. - No need to have locale patches go through me. > Unfortunately this design is running into some problems: At the moment > several strings are empty in the C locale (which is fine), but they > could translate to something else in some other locale (nl_langinfo()'s > ERA* and THOUSEP come to mind). Yes. Those are unsupported right now, along with a lot of related functionality. There's also no way to set the fields of localeconv(), which come mostly (entirely, I think) from LC_MONETARY and LC_NUMERIC. Depending on how we end up representing that data in the locale file, it might make sense to use some sort of preprocessing script to generate this part of the .po file, but I'd like to have the format just be simple and natural to do in .po if that doesn't impose heavy code or runtime overhead. > Some strings in the C locale are the > exact same and might translate to something else in some language (the > long and short forms of "May" for instance). I think glibc solves that > problem with another file format for libc's locales, which is a headache > I don't want to think about this year anymore. "May" is a good example. Yes, I've never much liked the gettext model of keying by untranslated/English string, but for translation it's the only one that's translator-friendly, and for musl it was the only choice that saved us from having to develop a new file format and code to handle it. The easiest solution I've come up with is prefixing and doing something like __lctrans("<prefix>string")+prefixlen, ideally with a prefixlen of 1, e.g. __lctrans("\5May")+1. This would just add 1 byte to each string in the built-in C locale data and one inc/add instruction, not a significant cost. Do you have any other good ideas? BTW "\5" was for "month 5" but I'm not sure there's any usefulness to such a convention. All that's really needed is a way to identify it as the abbreviated name or the full name. > The second patch might be applicable to musl without the first by > accident: I left the format for ERA_D_T_FMT untouched, so looking up the > unchanged D_T_FMT would give that as a result. (Though I did translate > ERA_D_T_FMT.) > > To make it clear to people who don't like locale: I changed nothing > about the build system. Locale MOs still aren't built and installed > automatically. That wouldn't even be possible without mandating a > default value for MUSL_LOCPATH. > > However, I tried it out (installed it somewhere, put that location into > MUSL_LOCPATH and called strftime("%c")) and that seems to work. If we > got this far, then that means the file is found and can be mapped and > the lookup works. So the only thing that might be broken now is bad > translations or typos in the PO file. (Well, or anything unforseen, as > usual.) Thanks for your work on this! I'm glad to see some interest in making use of the locale support code. Indeed, I got it to work initially with some dummy translation data, but didn't go far with it. > Also, as usual, criticisms and comments are welcome. One more below in the patch itself: > [...] > + > +msgid "." > +msgstr "," musl explicitly does not support changing the radix point; there's an old thread on this topic I can dig up if you'd like to read it. It looks to me like nl_langinfo(RADIXCHAR) will return a replacement if the locale file defines one, but then you get inconsistent results since it won't be used (e.g. by printf or strtod). Probably nl_langinfo should avoid passing the "." to __lctrans at all so that this inconsistency can't arise. This would also allow us to support "mon_decimal_point" (which would otherwise be a duplicate untranslated string) if desired, I think. Rich ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Patches: Timezone in %c and POT file 2015-12-30 15:58 ` Rich Felker @ 2015-12-31 9:37 ` Markus Wichmann 0 siblings, 0 replies; 3+ messages in thread From: Markus Wichmann @ 2015-12-31 9:37 UTC (permalink / raw) To: musl [-- Attachment #1: Type: text/plain, Size: 8102 bytes --] On Wed, Dec 30, 2015 at 10:58:48AM -0500, Rich Felker wrote: > On Wed, Dec 30, 2015 at 11:56:33AM +0100, Markus Wichmann wrote: > > Hi all, > > > > Now I have subscribed, so CC'ing me is no longer necessary. > > > > Today I worked on two things: Firstly, I put the timezone into > > strftime's %c output. The reason is that glibc's strftime() does the > > same. That means, that an application dev currently can't depend on > > either behavior (so strftime("%c %Z") will give me the timezone twice on > > glibc, but only once on musl, and my app won't be able to tell without > > inspecting the resulting string). > > > > No biggie, changing that one is easy. Of course, a heated argument can > > be had over whether or not we want it one way or the other. And it'll > > come down to personal taste, because as far as I'm aware, POSIX isn't > > mandating anything about this. > > The format for %c in the C locale is strictly specified by ISO C as > "%a %b %e %T %Y"; see 7.27.3.5 ¶ 7. If glibc does not match this it's > a bug in glibc. POSIX is of course aligned with ISO C and says the > same thing. In other locales it's permitted to differ. > Ah, sorry, I didn't check the C locale. And I didn't look up strftime() in the C standard. I did look up D_T_FMT in POSIX, though. Ah well, it happens. Attached are two new patches, the first reverting this one, the second updating the POT and the PO to reflect that change. > > Then I noticed, that for quite some time now, musl has been supporting > > ..mo files, but no infrastructure is in place for them (i.e. no POT file > > nor any PO file is shipped). I tried searching around for POT or PO > > file, but I couldn't find any. So I added a handwritten POT file and a > > German PO file (I'm not proficient enough in any languages besides > > English and German to want to create that file for any other languages. > > And an English PO file would be kind of redundant.) > > > > I filled the POT file with all the strings I could find, that would ever > > be plugged into __lctrans(). That gives me strerror(), strsignal(), > > gai_strerror(), hstrerror(), and __getopt_msg() strings. > > Have you read the thread "Call for locales maintainer & contributors" > from when locale support launched? Here's a link to the start of it: > > http://www.openwall.com/lists/musl/2014/07/24/14 > No, I haven't. I'm looking into it now. I did search for a musl locale repository and couldn't find any, so that's why I sent these patches. > It might have some useful ideas. The main one I'd like to point out is > the idea to develop and maintain locales as a separate repo outside of > the source repo. Unlike glibc, we don't have a lot of messages that > should be expected to change frequently, so I think the issues with > keeping sync are minimal, while there are several advantages: > > - Not having translation progress stalled-by/tied-to code release > cycles. > > - Saving users who don't want locales from having to download them. > > - No need to have locale patches go through me. > Since we're going with gettext's MO files, the separate repo might work, but I think you should at least keep an up-to-date POT file in the musl repo. That way the locale repo just has to check whether the POT file is still up to date, and if not, what changed, to be able to update all the language POs. Also, keeping at least a POT file around allows people interested in translation work to get into it way more quickly, even without the need for a repo. After the POT file was done, the German PO was a matter half an hour at the most, and incidentally, German is the only translation I was interested in. Since locale is still very much a DIY thing, that wouldn't be so bad. But then we probably should annotate the weirder entries (the nl_langinfo() stuff). > > Unfortunately this design is running into some problems: At the moment > > several strings are empty in the C locale (which is fine), but they > > could translate to something else in some other locale (nl_langinfo()'s > > ERA* and THOUSEP come to mind). > > Yes. Those are unsupported right now, along with a lot of related > functionality. There's also no way to set the fields of localeconv(), > which come mostly (entirely, I think) from LC_MONETARY and LC_NUMERIC. > Depending on how we end up representing that data in the locale file, > it might make sense to use some sort of preprocessing script to > generate this part of the .po file, but I'd like to have the format > just be simple and natural to do in .po if that doesn't impose heavy > code or runtime overhead. > > > Some strings in the C locale are the > > exact same and might translate to something else in some language (the > > long and short forms of "May" for instance). I think glibc solves that > > problem with another file format for libc's locales, which is a headache > > I don't want to think about this year anymore. > > "May" is a good example. Yes, I've never much liked the gettext model > of keying by untranslated/English string, but for translation it's the > only one that's translator-friendly, and for musl it was the only > choice that saved us from having to develop a new file format and code > to handle it. > > The easiest solution I've come up with is prefixing and doing > something like __lctrans("<prefix>string")+prefixlen, ideally with a > prefixlen of 1, e.g. __lctrans("\5May")+1. This would just add 1 byte > to each string in the built-in C locale data and one inc/add > instruction, not a significant cost. Do you have any other good ideas? > Well, the prefix idea is good, but it requires changes to all the interfaces calling __lctrans() and to POT and PO file. And all of that for a potential problem we don't even have right now. (BTW: Despite all my searching, I couldn't find out what POSIX means by "era".) Alternatively we could go the other route and map those string lists into memory from locale files. I'm thinking of a file that contains a string like c_time or c_messages, or better yet: All of them. Then we prefix that file with offsets to where the strings start... Loading would just be mmap() and setting a couple pointers, and using it would be just loading str from a different source in nl_langinfo()... Oh no, that would be the "custom file format" route. Viable, but also a lot of work. To create those files we'd need tools and before long we'd be reinventing MO files. No, as it stands, I'd go with "Let's cross that bridge when we come to it". musl doesn't support a lot of things that would be necessary for full locale support (and I don't particularly want it to. Sure, it's annoying to have to cut long numbers up into groups of three digits manually, but the code to support it in the POSIX way would just be insane). > > [...] > > + > > +msgid "." > > +msgstr "," > > musl explicitly does not support changing the radix point; there's an > old thread on this topic I can dig up if you'd like to read it. It > looks to me like nl_langinfo(RADIXCHAR) will return a replacement if > the locale file defines one, but then you get inconsistent results > since it won't be used (e.g. by printf or strtod). Probably > nl_langinfo should avoid passing the "." to __lctrans at all so that > this inconsistency can't arise. This would also allow us to support > "mon_decimal_point" (which would otherwise be a duplicate untranslated > string) if desired, I think. > Oh yes, I remember reading that. Well, we could remove that string from the PO file. And the POT file. I haven't yet done that in the appended patches, but you can do that after applying them (then I don't get a merge conflict), but yeah, printing numbers in the local way is also something even glibc tries to avoid. Also I doubt it is necessary. Since few libcs offer local number support, programs that try to offer local number I/O have to work around that, anyway (changing commas to dots before passing it to strtod(), filtering out thousands separators, etc.) so few if any applications need that. I only put it there for completeness' sake. Ciao, Markus [-- Attachment #2: 0001-Revert-Add-timezone-to-strftime-s-c.patch --] [-- Type: text/x-diff, Size: 776 bytes --] From effa6db773e84f6a2369843e79a8b0e645930a41 Mon Sep 17 00:00:00 2001 From: Markus Wichmann <nullplan@gmx.net> Date: Thu, 31 Dec 2015 09:33:12 +0100 Subject: [PATCH 1/2] Revert "Add timezone to strftime's %c." This reverts commit 2371b3107a3cb39fdd53222021a0853bd05341cf. --- src/locale/langinfo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locale/langinfo.c b/src/locale/langinfo.c index 7bfc9da..b2c8569 100644 --- a/src/locale/langinfo.c +++ b/src/locale/langinfo.c @@ -13,7 +13,7 @@ static const char c_time[] = "May\0" "June\0" "July\0" "August\0" "September\0" "October\0" "November\0" "December\0" "AM\0" "PM\0" - "%a %b %e %T %Y %Z\0" + "%a %b %e %T %Y\0" "%m/%d/%y\0" "%H:%M:%S\0" "%I:%M:%S %p\0" -- 2.1.4 [-- Attachment #3: 0002-Necessary-changes-for-correct-C-locale.patch --] [-- Type: text/x-diff, Size: 1186 bytes --] From 3b048aaa38cc0c753794a7ad8aba4a1412a53d6f Mon Sep 17 00:00:00 2001 From: Markus Wichmann <nullplan@gmx.net> Date: Thu, 31 Dec 2015 09:39:53 +0100 Subject: [PATCH 2/2] Necessary changes for correct C locale. Turns out the C locale D_T_FMT string was mandated by C standard. So, for glibc compatibility, not only did I revert my first commit, but also changed the POT and PO files to reflect that. --- po/de.po | 5 +---- po/musl.pot | 3 --- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/po/de.po b/po/de.po index 29cf025..7dfb819 100644 --- a/po/de.po +++ b/po/de.po @@ -388,9 +388,6 @@ msgstr "" msgid "PM" msgstr "" -msgid "%a %b %e %T %Y %Z" -msgstr "%a %e %b %Y %T %Z" - msgid "%m/%d/%y" msgstr "%d.%m.%y" @@ -404,7 +401,7 @@ msgid "0123456789" msgstr "0123456789" msgid "%a %b %e %T %Y" -msgstr "%a %e %b %Y %T" +msgstr "%a %e %b %Y %T %Z" msgid "^[yY]" msgstr "^[jJ]" diff --git a/po/musl.pot b/po/musl.pot index 699e8f5..3b7138f 100644 --- a/po/musl.pot +++ b/po/musl.pot @@ -377,9 +377,6 @@ msgstr "AM" msgid "PM" msgstr "PM" -msgid "%a %b %e %T %Y %Z" -msgstr "%a %b %e %T %Y %Z" - msgid "%m/%d/%y" msgstr "%m/%d/%y" -- 2.1.4 ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-12-31 9:37 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-12-30 10:56 Patches: Timezone in %c and POT file Markus Wichmann 2015-12-30 15:58 ` Rich Felker 2015-12-31 9:37 ` Markus Wichmann
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/musl/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).