I use gettext for internalization. I define a static and a non-static string. The string only gets translated the second time I wrapp it with __()
. In my understanding, the string should already be translated upon definition.
How do I achieve that the string is translated in the definition?
main.cpp
#include <iostream>
#include <string>
#include <libintl.h>
#define __(String) gettext(String)
class A {
public:
static const std::string BASE_PCB;
};
const std::string A::BASE_PCB = __("BasePCB");
int main() {
std::string BASE_PCB_2 = __("BasePCB2");
const std::string path = "/usr/local/share/locale";
std::cout << "Locale path: " << path << std::endl;
setlocale(LC_ALL, "fr_CH.utf8");
bindtextdomain("example", path.c_str());
textdomain("example");
std::cout << "Locale: " << setlocale(LC_ALL, nullptr) << std::endl;
std::cout << "1. Translation: " << A::BASE_PCB.c_str() << std::endl;
std::cout << "2. Translation with __: " << __(A::BASE_PCB.c_str()) << std::endl;
std::cout << "3. Translation: " << BASE_PCB_2 << std::endl;
std::cout << "4. Translation with __: " << __(BASE_PCB_2.c_str()) << std::endl;
return 0;
}
fr.po
#: main.cpp:12
msgid "BasePCB"
msgstr "Base PCB"
#: main.cpp:15
msgid "BasePCB2"
msgstr "Base PCB 2"
*.mo generation and placement
msgfmt fr.po -o example.mo
cp example.mo /usr/local/share/locale/fr/LC_MESSAGES/example.mo
CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project (
"CppInternationalization"
VERSION 1.0.0
LANGUAGES CXX
)
# Using C++20
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(${PROJECT_NAME} "main.cpp")
# add libintl
find_package(Intl REQUIRED)
target_link_libraries(${PROJECT_NAME} PUBLIC ${Intl_LIBRARY})
target_include_directories(${PROJECT_NAME} PUBLIC ${Intl_INCLUDE_DIRS})
Execution
mkdir build
cmake .. && cmake --build . && ./CppInternationalization
OUTPUT
Locale path: /usr/local/share/locale
Locale: fr_CH.utf8
1. Translation: BasePCB # <- Expected 'Base PCB'
2. Translation with __: Base PCB
3. Translation: BasePCB2 # <- Expected 'Base PCB 2'
4. Translation with __: Base PCB 2
1