Re: Remaining dependency on setlocale()
От | Jeff Davis |
---|---|
Тема | Re: Remaining dependency on setlocale() |
Дата | |
Msg-id | b555e9895fce1fae896bbada4c01a5872739a7dc.camel@j-davis.com обсуждение исходный текст |
Ответ на | Re: Remaining dependency on setlocale() (Jeff Davis <pgsql@j-davis.com>) |
Список | pgsql-hackers |
On Thu, 2025-07-24 at 11:10 -0700, Jeff Davis wrote: > The main problem is with strerror_r()... Postgres messages, like "division by zero" are translated just fine without LC_CTYPE; gettext() only needs LC_MESSAGES and the server encoding. So these are fine. We use strerror_r() to translate the system errno into a readable message, like "No such file or directory", i.e. the %m replacements. That needs LC_CTYPE set (just for the encoding, not the language/region) as well as LC_MESSAGES (for the language/region). When using a locale provider other than libc, it's unfortunate to require LC_CTYPE to be set for just this one single purpose. The locale itself, e.g. the "en_US" part, is not used at all; only the encoding part of the setting is relevant. And there is no value other than "C" that works on all platforms. It's fairly confusing to explain why the LC_CTYPE setting is required for the builtin or ICU providers at all. Also, while it's far from the biggest challenge when it comes to multithreading, it does cause thread-safety headaches on platforms without uselocale(). Perhaps we could get the ASCII message and run it through gettext()? That would be extra work for translators, but perhaps not a lot, given that it's a small and static set of messages in practice. That would also have the benefit that either NLS is enabled or not -- right now, since the translation happens in two different ways you can end up with partially-translated messages. It would also result in consistent translations across platforms. Regards, Jeff Davis
В списке pgsql-hackers по дате отправления: