Перейти к содержанию

Локали (Locale)

Подсистема Locale предоставляет удобный способ централизованного хранения текстового контента приложения для поддержки множественных языков.

Быстрый старт

#include <wui/locale/locale.hpp>

// Установка локали из файла (Linux/macOS)
auto ok = wui::set_locale_from_file(wui::locale_type::rus, "ru", "res/ru_locale.json");
if (!ok) {
    std::cerr << "can't load locale" << std::endl;
    return -1;
}

// Использование
std::string greeting = wui::locale("greeting", "hello"); // "Здравствуйте"

API

set_locale_from_file

bool set_locale_from_file(locale_type type, std::string_view name, std::string_view file_name);

Параметры: - type — тип локали (например, locale_type::rus, locale_type::eng) - name — имя локали - file_name — путь к JSON-файлу с локалью

Возвращает: true в случае успеха

set_locale_from_json

bool set_locale_from_json(locale_type type, std::string_view name, std::string_view json);

Параметры: - type — тип локали - name — имя локали - json — JSON-строка с локалью

Возвращает: true в случае успеха

set_locale_from_resource (Windows only)

bool set_locale_from_resource(locale_type type, std::string_view name, 
                              int32_t resource_index, std::string_view resource_section);

Параметры: - type — тип локали - name — имя локали - resource_index — ID ресурса - resource_section — секция ресурсов (например, "JSONS")

Возвращает: true в случае успеха

get_locale

std::shared_ptr<i_locale> get_locale();

Возвращает: Указатель на текущий экземпляр локали по умолчанию

locale

const std::string &locale(std::string_view section, std::string_view value);

Параметры: - section — секция (например, "button", "dialog") - value — ключ значения (например, "cancel", "ok")

Возвращает: Ссылку на строку из текущей локали

Пример:

std::string cancel_text = wui::locale("button", "cancel"); // "Отмена"
std::string title = wui::locale("dialog", "settings_title"); // "Настройки"

set_locale_value

void set_locale_value(std::string_view section, std::string_view value, std::string_view str);

Параметры: - section — секция - value — ключ - str — устанавливаемая строка

Позволяет динамически устанавливать значения локали во время выполнения.

Формат JSON

Пример файла локали:

{
  "button": {
    "ok": "OK",
    "cancel": "Отмена",
    "apply": "Применить"
  },
  "dialog": {
    "settings_title": "Настройки",
    "about_title": "О программе"
  },
  "message": {
    "error": "Ошибка",
    "warning": "Предупреждение",
    "info": "Информация"
  }
}

Интерфейс i_locale

class i_locale
{
public:
    virtual std::string get_name() const = 0;

    virtual void set(std::string_view section, std::string_view value,
                          std::string_view str) = 0;
    virtual const std::string &get(std::string_view section,
                                        std::string_view value) const = 0;

#ifdef _WIN32
    virtual void load_resource(int32_t resource_index, 
                              std::string_view resource_section) = 0;
#endif
    virtual void load_json(std::string_view json) = 0;
    virtual void load_file(std::string_view file_name) = 0;

    virtual error get_error() const = 0;

    virtual ~i_locale() {}
};

get_name

Возвращает: Имя экземпляра локали (например, "ru", "en")

set

Параметры: - section — секция - value — ключ - str — устанавливаемая строка

Устанавливает строковое значение для секции и ключа.

get

Параметры: - section — секция - value — ключ

Возвращает: Ссылку на строковое значение

load_json / load_file / load_resource

Загружает локаль из JSON-строки, файла или ресурса.

get_error

Возвращает error, а не bool; проверяйте is_ok() и str().

Переключение языка

wui::error error;
if (wui::set_locale_from_type(wui::get_next_app_locale(), error)) {
    label->set_text(wui::locale("main_frame", "whats_your_name_text"));
    button->set_caption(wui::locale("main_frame", "ok_button"));
}

Сначала зарегистрируйте локали через set_app_locales(), как в полном примере Hello world. Загрузка локали не заменяет автоматически строки, уже сохранённые в контролах. Состояние экземпляра локали проверяется через get_error().is_ok().