Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Yboichuk/sdk/language localization module #76

Open
wants to merge 6 commits into
base: main
Choose a base branch
from

Conversation

black-ghost-off
Copy link
Collaborator

add support for multi language on keira os

` // Initialize the Localization object
lilka::Localization localization;

// Add some localized strings
localization.addString(lilka::Language_Code::EN, "greeting", "Hello");
localization.addString(lilka::Language_Code::UA, "greeting", "Привіт");

// Get the greeting message in English
String greetingEn = localization.getString(lilka::Language_Code::EN, "greeting");
Serial.begin(9600);
Serial.println(greetingEn);

// Get the greeting message in Ukrainian
String greetingUa = localization.getString(lilka::Language_Code::UA, "greeting");
Serial.println(greetingUa);
`

@and3rson
Copy link
Owner

Ідея хороша, але робити це в ран-таймі не дає ніяких переваг.
Краще виносити локалізації в окремі заголовні файли і зробити якийсь макрос, типу TR(), який буде брати відповідну стрінгу з пам'яті.

@and3rson
Copy link
Owner

Можна ще спробувати підключити якусь лібу для цього, яка б була сумісна з, скажімо, gettext

@and3rson
Copy link
Owner

and3rson commented Mar 28, 2024

Ось варіант, як можна мінімізувати час пошуку перекладу і переконатись, що ніхто не забуде перекласти якусь стрінгу:

// lilka/i18n.h
#include <stdio.h>

#define TR(KEY)  (lang == UA) ? HELLO_UA : HELLO_EN

typedef enum {
    UA,
    EN,
} lang_t;

lang_t lang = UA;

void setLang(lang_t newLang) {
    lang = newLang;
}
// myapp.h
#define HELLO_UA "Привіт!"
#define HELLO_EN "Hello!"

// myapp.cpp
void foo() {
    printf("%s\n", TR(HELLO));
    setLang(EN);
    printf("%s\n", TR(HELLO));
    return 0;
}
// otherapp.h
#define GOODBYE_UA "Бувай!"
#define GOODBYE_EN "Goodbye!"

// otherapp.cpp
void bar() {
    printf("%s\n", TR(GOODBYE));
    return 0;
}

В результаті, всі стрінги будуть визначені на етапі компіляції, а їх вибір буде здійснюватись тернарним оператором в ран-таймі (макро TR). При цьому збережеться статична типізація, оскільки цей механізм більш строгий. І найголовніше - це все буде в флеш-пам'яті, всі стрінги будуть const і не буде випадкових дублювань.

@black-ghost-off
Copy link
Collaborator Author

В моєму випадку можлива підтримка любої кількості мов і розробка додатків з підтримкою тих мов які ти знаєш з можливим доповненням в подальшому. В твоєму випадку ми прив'язані що обов'язково має бути переклад на дві мови.

Можна попередити що стягування "мовного пакету" варто(не обов'язково) робити тільки при ініціалізації апки, а не в циклі

@ReAlUA
Copy link

ReAlUA commented Mar 29, 2024

(на жаль, не маю зараз змоги приєднатися до проекту, хіба оце трохи своїх міркувань додати)
Як вже зазначено, пропонований варіант потребуватиме багато місця в оперативній пам'яті під текстові рядки, які й так вже є у флеш.
В альтернативному перекладати все відразу не обов'яково, бо завжди можна

#define GOODBYE_UA "Бувай!"
#define GOODBYE_EN GOODBY_UA

і доперекласти пізніше.
Але якщо хтось додасть PL, і воно буде додане в TR(), то треба буде скрізь пододавати затички типу #define GOODBY_PL GOODBY_UA, інакше поламаються всі билди. Або робити макроси TR() для кожного застосунку окремо, що як на мене теж не дуже добре.
Щось на зразок згаданого gettext набагато краще. Основні розробники застосунку можуть просто додавати щось мовою (мовами) які знають, і не турбуватися навіть які мови взагалі в підтримуються у цьому застосунку на цей час.
Так, у новій версії іншою мовою просто виявиться частина не перекладеною. Так буде доки той, хто підтримує цю мову в усій системі, не перекладе ці нові рядки. Як я коли мав час, то підтримував на transifex українську локалізацію оболонки arduino, хоч сам нею не користувався і джаву не знаю :-).

p.s. Мабуть, малося на увазі

#define TR(KEY)  ((lang == UA) ? KEY ## _UA : KEY ## _EN) // Якщо хочемо за умовчанням EN

@black-ghost-off black-ghost-off added the wip Work in progress label Mar 29, 2024
@and3rson and3rson force-pushed the main branch 2 times, most recently from 4563cc8 to 14a952c Compare April 17, 2024 18:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants