use core::ffi::{CStr, c_char};
use oxivgl_sys::*;
#[repr(transparent)]
#[derive(Clone, Copy)]
pub struct StaticCStr(*const c_char);
unsafe impl Sync for StaticCStr {}
unsafe impl Send for StaticCStr {}
impl StaticCStr {
pub const fn from_cstr(s: &'static CStr) -> Self {
Self(s.as_ptr())
}
pub const NULL: Self = Self(core::ptr::null());
}
pub fn add_static(
languages: &'static [StaticCStr],
tags: &'static [StaticCStr],
translations: &'static [StaticCStr],
) {
unsafe {
lv_translation_add_static(
languages.as_ptr().cast(),
tags.as_ptr().cast(),
translations.as_ptr().cast(),
);
}
}
pub fn set_language(lang: &CStr) {
unsafe { lv_translation_set_language(lang.as_ptr()) };
}
pub fn get_language() -> Option<&'static CStr> {
let ptr = unsafe { lv_translation_get_language() };
if ptr.is_null() {
None
} else {
Some(unsafe { CStr::from_ptr(ptr) })
}
}
pub fn translate(tag: &CStr) -> &'static CStr {
let ptr = unsafe { lv_translation_get(tag.as_ptr()) };
unsafe { CStr::from_ptr(ptr) }
}
pub struct DynamicPack {
inner: *mut lv_translation_pack_t,
}
pub struct TagDsc {
inner: *mut lv_translation_tag_dsc_t,
}
pub fn add_dynamic() -> DynamicPack {
let ptr = unsafe { lv_translation_add_dynamic() };
assert!(!ptr.is_null(), "lv_translation_add_dynamic returned NULL");
DynamicPack { inner: ptr }
}
impl DynamicPack {
pub fn add_language(&self, lang: &CStr) {
unsafe { lv_translation_add_language(self.inner, lang.as_ptr()) };
}
pub fn add_tag(&self, tag_name: &CStr) -> TagDsc {
let ptr = unsafe { lv_translation_add_tag(self.inner, tag_name.as_ptr()) };
assert!(!ptr.is_null(), "lv_translation_add_tag returned NULL");
TagDsc { inner: ptr }
}
pub fn set_translation(&self, tag: &TagDsc, lang_idx: u32, text: &CStr) {
unsafe {
lv_translation_set_tag_translation(self.inner, tag.inner, lang_idx, text.as_ptr());
};
}
}