Files
trail-mate/platform/linux/common/src/ui/localization.cpp
T
liu weikai b8352bc5e6 Add optional emoji extension pack
Fixes #33

Adds an installable emoji content/input extension, a generic candidate-picker IME backend, and registry support for small content supplement fonts.
2026-06-17 10:47:41 +08:00

233 lines
4.1 KiB
C++

#include "ui/localization.h"
#include <cstdarg>
#include <cstdio>
#include <string>
#include "ui/assets/fonts/font_utils.h"
namespace ui::i18n
{
namespace
{
constexpr LocaleInfo kEnglishLocale{
.id = "en",
.display_name = "English",
.native_name = "English",
.ui_font_pack_id = nullptr,
.content_font_pack_id = nullptr,
.ime_pack_id = nullptr,
.builtin = true,
};
} // namespace
void reload_language()
{
::ui::fonts::refresh_locale_font_bindings();
}
std::size_t locale_count()
{
return 1;
}
const LocaleInfo* locale_at(std::size_t index)
{
return index == 0 ? &kEnglishLocale : nullptr;
}
int current_locale_index()
{
return 0;
}
const char* current_locale_id()
{
return kEnglishLocale.id;
}
const char* current_locale_display_name()
{
return kEnglishLocale.display_name;
}
const char* current_locale_direction()
{
return "ltr";
}
bool set_locale(const char* locale_id, bool persist)
{
(void)persist;
return locale_id != nullptr && std::string(locale_id) == kEnglishLocale.id;
}
bool set_locale_by_index(std::size_t index, bool persist)
{
(void)persist;
return index == 0;
}
const lv_font_t* active_ui_font_fallback()
{
return nullptr;
}
const lv_font_t* active_content_font_fallback()
{
return nullptr;
}
const lv_font_t* locale_preview_font(const char* locale_id, const lv_font_t* ascii_font)
{
(void)locale_id;
return ascii_font;
}
bool ensure_content_font_for_text(const char* text)
{
(void)text;
return false;
}
std::size_t ime_count()
{
return 0;
}
const ImeInfo* ime_at(std::size_t index)
{
(void)index;
return nullptr;
}
std::size_t ime_candidate_count(const char* ime_id)
{
(void)ime_id;
return 0;
}
const char* ime_candidate_at(const char* ime_id, std::size_t index)
{
(void)ime_id;
(void)index;
return nullptr;
}
std::size_t enabled_ime_count()
{
return 0;
}
bool ime_enabled(const char* ime_id)
{
(void)ime_id;
return false;
}
bool set_ime_enabled(const char* ime_id, bool enabled, bool persist)
{
(void)ime_id;
(void)enabled;
(void)persist;
return false;
}
bool any_enabled_script_input()
{
return false;
}
const char* active_ime_pack_id()
{
return nullptr;
}
bool active_locale_supports_script_input()
{
return false;
}
const char* tr(const char* english)
{
return english ? english : "";
}
std::string vformat(const char* english_fmt, va_list args)
{
if (english_fmt == nullptr)
{
return {};
}
va_list args_copy;
va_copy(args_copy, args);
const int required = std::vsnprintf(nullptr, 0, english_fmt, args_copy);
va_end(args_copy);
if (required <= 0)
{
return {};
}
std::string formatted(static_cast<std::size_t>(required), '\0');
std::vsnprintf(formatted.data(), formatted.size() + 1, english_fmt, args);
return formatted;
}
std::string format(const char* english_fmt, ...)
{
va_list args;
va_start(args, english_fmt);
std::string formatted = vformat(english_fmt, args);
va_end(args);
return formatted;
}
void set_label_text_raw(lv_obj_t* label, const char* text)
{
if (label == nullptr)
{
return;
}
const char* safe_text = text ? text : "";
lv_label_set_text(label, safe_text);
::ui::fonts::apply_localized_font(label, safe_text, nullptr);
}
void set_label_text(lv_obj_t* label, const char* english)
{
set_label_text_raw(label, tr(english));
}
void set_content_label_text_raw(lv_obj_t* label, const char* text)
{
if (label == nullptr)
{
return;
}
const char* safe_text = text ? text : "";
lv_label_set_text(label, safe_text);
::ui::fonts::apply_content_font(label, safe_text, nullptr);
}
void set_content_label_text(lv_obj_t* label, const char* english)
{
set_content_label_text_raw(label, tr(english));
}
void set_label_text_fmt(lv_obj_t* label, const char* english_fmt, ...)
{
va_list args;
va_start(args, english_fmt);
const std::string text = vformat(english_fmt, args);
va_end(args);
set_label_text_raw(label, text.c_str());
}
} // namespace ui::i18n