37const std::string* lookup_localised(
38 const std::map<std::string, cdc::plugin_manager::LocalizedString>& table,
39 const std::string& key,
const std::string& default_lang)
41 auto it = table.find(key);
42 if (it == table.end())
return nullptr;
43 uint8_t lang = lang_index();
44 const char* lang_name = (lang ==
HOST_LANG_DE) ?
"de" :
"en";
45 auto by_lang_it = it->second.by_lang.find(lang_name);
46 if (by_lang_it != it->second.by_lang.end())
return &by_lang_it->second;
47 by_lang_it = it->second.by_lang.find(default_lang);
48 if (by_lang_it != it->second.by_lang.end())
return &by_lang_it->second;
49 if (!it->second.by_lang.empty())
return &it->second.by_lang.begin()->second;
53int copy_to_buffer(
const char* src,
char* out, uint32_t out_cap)
55 if (!out || out_cap == 0)
return -1;
57 size_t len = std::strlen(src);
58 size_t to_copy = (len < out_cap - 1) ? len : (out_cap - 1);
59 std::memcpy(out, src, to_copy);
61 return static_cast<int>(to_copy);
70 if (!out || out_cap == 0)
return -1;
72 if (!p || !key)
return copy_to_buffer(
"", out, out_cap);
73 if (
const char* s = p->trKey(key))
return copy_to_buffer(s, out, out_cap);
74 const auto& mf = p->manifest();
75 const std::string* s = lookup_localised(mf.i18n_strings, key, mf.default_language);
76 return copy_to_buffer(s ? s->c_str() :
"", out, out_cap);
81 if (!out || out_cap == 0)
return -1;
84 LOG_W(
"I18N",
"tr_meta: no active plugin (%p) or field (%p)", p, field);
85 return copy_to_buffer(
"", out, out_cap);
88 std::string composed =
"meta.";
90 if (
const char* s = p->trKey(composed.c_str()))
return copy_to_buffer(s, out, out_cap);
92 const auto& mf = p->manifest();
93 const std::string* s = lookup_localised(mf.i18n_meta, field, mf.default_language);
95 LOG_W(
"I18N",
"tr_meta('%s'): no entry; meta size=%u, default_lang='%s'",
96 field,
static_cast<unsigned>(mf.i18n_meta.size()), mf.default_language.c_str());
98 return copy_to_buffer(s ? s->c_str() :
"", out, out_cap);
108 if (!out || out_cap == 0)
return -1;
109 if (!key)
return copy_to_buffer(
"", out, out_cap);
Internationalization with English fallbacks in code and overlay translations loaded at runtime from a...
Owned WAMR module instance + per-plugin state.
CDC Log: logging over TinyUSB CDC and UART.
#define LOG_W(tag, fmt,...)
const std::string & getLanguageCode() const
Current language code (lower-case ISO-639-1, e.g. "en", "de").
static I18n & instance()
Singleton accessor.
uint8_t host_i18n_current_language(void)
Active language code (HOST_LANG_*).
int host_i18n_tr_core(const char *key, char *out, uint32_t out_cap)
Translate a core.* key from the firmware string table.
int host_i18n_tr_meta(const char *field, char *out, uint32_t out_cap)
Read a metadata field (name, description, ...) from the plugin manifest.
int host_i18n_tr_key(const char *key, char *out, uint32_t out_cap)
Translate a plugin-local key into the current language.
CDC Badge OS plugin host API - canonical C ABI contract.
void * plg_get_active_plugin(void)