gnucash/libgnucash/core-utils/gnc-locale-utils.hpp
Geert Janssens 69a04be353 Fix translations using boost::locale::translate
This requires a std::locale generated from a boost::locale::generator
The examples already in our code base used the wrong message_path while
creating the generator and as a result our message catalogs weren't found.

As with the std::locale I have added code to create a locale via
boost::locale only once instead of having each c++ file redo the work.

This code expects a message_path to set for the boost generator.
An earlier attempt queried for this path directly from within
gnc-locale-utils using gnc_get_locale_dir (from gnc-path.h).

That however broke several c++ tests depending on gnc_locale_utils as those
then also needed to be linked against gnc-path.o. I couldn't get the linker
to do this properly so I worked around it for now by splitting the boost_locale
functionality in two steps:
- an initializer step that takes the messages_path as a string and will
  generate the locale
- a getter to get the locale.

The initializer should only be run once, and before the getter is called.
It won't hurt though if the initializer is called more often.
If the getter is called before the initializer it will still
generate a std::locale but without setting a messages_path. It will then
also log a warning explaining translations may not be properly found.
2020-06-09 22:58:06 +02:00

67 lines
2.8 KiB
C++

/********************************************************************\
* gnc-locale-utils.hpp -- provide a default locale for C++ *
* Copyright (C) 2019 John Ralls <jralls@ceridwen.us *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
#ifndef GNC_LOCALE_UTILS_HPP
#define GNC_LOCALE_UTILS_HPP
#include <locale>
#include <string>
/** Get the default application locale.
*
* If we set std::locale::global we have to imbue every stream that
* we want in the C locale, and that's a lot more than we want imbued
* with the application locale. Calling std::locale("") is expensive,
* so call this instead.
*
* @returns A static std::locale representing the one set with
* setlocale() in main().
*/
const std::locale& gnc_get_locale();
/** Create default boost locale.
*
* std::locale has very limited used on Windows so for translation work we rely
* on boost::locale instead. Calling boost::locale("") is expensive,
* so call gnc_get_boost_locale instead.
*
* However before that funcation can be called the locale should be initialized
* with gnc_init_boost_locale.
*/
void gnc_init_boost_locale(const std::string& messages_path);
/** Get the default boost locale.
*
* std::locale has very limited used on Windows so for translation work we rely
* on boost::locale instead. Calling boost::locale("") is expensive,
* so call this instead.
*
* @returns A static std::locale representing the one set with
* setlocale() in main(), but generated from boost::locale.
*/
const std::locale& gnc_get_boost_locale();
#endif /* GNC_LOCALE_UTILS_HPP */