Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2020, 08:24

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 05:56 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 115
Откуда: Иркутск
Возникла необходимость ввести поддержку локализации в своём проекте. Задача как бы простая но:
По вашему мнению с т.з. сопровождения. в чём основной затык такого подхода? Код под катом.
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 09:07 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 680
Предлагаю обдумать вариант указания языка прямо в самой строке, например:
"[en] Helow! [ru] Привет!".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 10:22 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
Я когда-то подобными велосипедами занимался, два массива - в одном оригинал, в другом на русском. Массивы заполняются макросом, а другим макросом отображаются.
Но это - извращение, когда есть gettext!
Разве что локализовать надо десяток надписей в менюшке микроконтроллера… Но тогда вообще рвение непонятно: оставить на английском, всем будет хорошо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 10:37 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 680
Цитата:
оставить на английском, всем будет хорошо

Я так и делаю. Снимает массу проблем. Мне оказалось проще в РЭ привести табличку с сообщениями и дать пояснения. Тем более, что у приборов, как правило, маленький дисплей и много текста там не напишешь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 11:05 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3558
Откуда: Китай, Пекин
это всё та самая убогость, о которой так много говорят большевики

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 11:39 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Локализация интерфейса - менюшки, сообщения, диалоговые окна? Про это чтоль? Да несложно. Создаете два массива строк со всеми сообщениями. Один массив - на русском, другой - на англ. Эти два массива объединяете в массив.
char *rus_msg[] = {"Привет, чувак!", "Каг дила?"};
char *eng_msg[] = {"Hi, mazafkr!", "How do Y do?"}
char **msgs[] = {rus_msg, eng_msg};
ну и все. Дальше у нас будет глобальная переменная-селектор языка, она же первый индекс массива, выбирающая тот или иной массив сообщений:
uint8_t lang;
#define RUS_LANG 0
#define ENG_LANG 1
выбор языка:
lang = RUS_LANG;
print(msgs[lang][num_msg])


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 11:46 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
Вот мое рукоблудие, только надо const добавить + макрос переделать, чтобы не нужно было идентификатор писать, а просто printf(L("eng", "рус")) везде тыкать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 11:57 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 115
Откуда: Иркутск
BusMaster писал(а):
Локализация интерфейса - менюшки, сообщения, диалоговые окна? Про это чтоль? Да несложно. Создаете два массива строк со всеми сообщениями. Один массив - на русском, другой - на англ. Эти два массива объединяете в массив.
char *rus_msg[] = {"Привет, чувак!", "Каг дила?"};
char *eng_msg[] = {"Hi, mazafkr!", "How do Y do?"}
char **msgs[] = {rus_msg, eng_msg};
ну и все. Дальше у нас будет глобальная переменная-селектор языка, она же первый индекс массива, выбирающая тот или иной массив сообщений:
#define RUS_LANG 0
#define ENG_LANG 1
выбор языка:
lang = RUS_LANG;
print(msgs[lang][num_msg])

В принципе, у вашего подхода та же проблема что и у моего. По каким правилам получать num_msg? В моём коде она зовётся localeStringNum в функции и безымянный enum (я его не обозвал хотя нужно бы.) Стоит удалить хоть одно сообщение и все номера поплывут нафиг. Что не приемлемо для дальнейшего сопровождения. Можно конецно наколхозить поиск по индексу, но нафига?
gettext на мой взгляд избыточен. Хотя хз может быть когда-нибудь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 12:00 
Старожил

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 291
BusMaster писал(а):
Дальше у нас будет глобальная переменная-селектор языка, она же первый индекс массива, выбирающая тот или иной массив сообщений:
...
print(msgs[lang][num_msg])

Зачем? Указатель на массив сообщений, и при переключении языка просто присваиваем тот или иной массив. И тогда писанины меньше: print(msgs[num_msg])


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 12:01 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
Да не надо цифры запоминать! Просто макрос в нужном месте правильно определить.
Либо как в моем рукоблудии - каждому сообщению давать понятный идентификатор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 10 мар 2020, 12:21 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 115
Откуда: Иркутск
Eddy_Em писал(а):
Да не надо цифры запоминать! Просто макрос в нужном месте правильно определить.
Либо как в моем рукоблудии - каждому сообщению давать понятный идентификатор.

Да, проверил, оно действительно работает так как требуется. Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 19 мар 2020, 01:43 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Использовать X-macros. Мне один человек давал свой проект для примера, чтобы я разбирался. Я ему обещал не распространять, так что дам направление.

_messages.h:
Код:
MLMESSAGE(   Testing         ,   "----Testing-----"   ,   "--Anzeigentest--"      ,   "-----Prueba-----"   ,   "------Test------"   ,   "Тестирование"      )   //10


Код:
#define MLMESSAGE(name, engl, germ, ital, french,   rus)   char __flash name##_engl[]=engl;
#include "__messages.h"
#undef   MLMESSAGE


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 03:25 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Я написал тому человеку, попросил развернуть, как он в своем проекте реализовал. Ответил, что пока занят, обещал позже поднять проект, вспомнить что к чему.
Я выбрал время, собрал проект конструктор. Получилось так:
Лучше всего это действительно реализовать на макросах.

Show menu.h


Show menu.c


Show


Последний раз редактировалось demiurg1978 21 мар 2020, 21:54, всего редактировалось 4 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 03:37 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Теперь прогон в симуляторе AVR-Studio:
1 прогон. Русский текст. Параметры. Но в студии показываются кракозябры.
Вложение:
00001.jpg
00001.jpg [ 184.63 Кб | Просмотров: 382 ]

2 прогон. Вуаля.
Вложение:
00002.jpg
00002.jpg [ 184.06 Кб | Просмотров: 382 ]


Последний раз редактировалось demiurg1978 21 мар 2020, 21:56, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 14:09 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 377
А насколько просто будет добавить третий язык с таким подходом?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 14:43 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
...ровно столько же картинок.
Ах, это стремление всё усложнить...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 15:06 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
ArtDen писал(а):
А насколько просто будет добавить третий язык с таким подходом?

В любом случае нужен идентификатор языка и поля в структурах. Затем свитчем выводить сообщения в соответствии с идентификатором языка. Сложно не сложно. Давайте разбираться. Это всегда компромисс. Просто в написании, сложно применять. Сложно в написании, просто применить.
Это моя первая реализация. До этого мне не требовалось. А в моем примере сложно, потому что я в строился в программный модуль меню. Где в одной строке навигация по меню и текст. И сложность только при первом создании. В дальнейшем меню собирается как конструктор, редактируя пункты меню.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 15:50 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Вы, сударь, поразительно никогда не слушаете других, даже если они дают правильные советы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 15:54 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Сходи желчь отхаркай, и предложи стоящее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 15:56 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Выше было предложено. Это отлично работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 16:15 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Херня на постом масле. В моем примере ты видел две строки. А теперь представим. Прибор с сотней и более таких строк как у меня. И необязательно как у меня. Просто десятки и сотни строк.


Последний раз редактировалось demiurg1978 21 мар 2020, 17:27, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 16:18 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Причем тут проблемы и разборки? Ваша беда в том, что вы чето изобретаете, совершенно не интересуясь опытом других. А тем временем, другие уже двадцать раз через это прошли.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 17:28 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Примеры в студию. Заранее все благодарны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 20:46 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
ArtDen писал(а):
А насколько просто будет добавить третий язык с таким подходом?

Show Switch-case

Я поправил свое сообщение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си и вопросы локализации.
СообщениеДобавлено: 21 мар 2020, 21:09 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 377
Что-то я взгрустнул, глядя на то, как народ переводит свои проекты и накидал первую сходу придуманную идею на сишных макросах, которая позволяет без переписывания всего кода добавлять новые языки и не путаться в массивах строк и константах num_msg как у BusMaster-а:
https://github.com/art-den/lng/blob/master/lng.h

Как использовать: 1) Берёте и создаёте файл со списком языков и строк на разных языках. Файл может называться как угодно. У меня он называется lng_strings.incl:
Show lng_strings.incl

Языков может быть любое количество.

2) Подключаете файл lng.h в .с исходник, не забыв перед этим сделать несколько дефайнов:
Show main.c


В случае с demiurg1978 struct для меню будет выглядеть так:

Код:
typedef struct menu_item
{
  .....
   LngStrId text_id;
} menu_item;

// теперь вызов Print_Buf выглядит так. Не надо никаких switch-ей

Print_Buf (2, pos_y_text_item, _(menu->text_id));




Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB