Easyelectronics.ru

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

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



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

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

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


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

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 377
demiurg1978, макросы в си дают возможность не только задавать константы (#define SysClockFreq 16000000), но и примитивно генерировать исходный код.

В моём случае, если написать
Код:
#define LNG_BEGIN_STR_TABLE typedef enum { _FIRST_STR_ID = -1
#define LNG_END_STR_TABLE } LngStrId;
#define LNG_STR(STR_ID, ...) , STR_ID

и после этого вставить
Код:
LNG_BEGIN_STR_TABLE
   LNG_STR(iGET,  "Get",  u8"Взять")
   LNG_STR(iPUT,  "Put",  u8"Положить")
   LNG_STR(iMENU, "Menu", u8"Меню")
   LNG_STR(iEXIT, "Exit", u8"Выход")
LNG_END_STR_TABLE


То сгенерированный код получится такой:
Код:
typedef enum { _FIRST_STR_ID = -1,
    iGET,
    iPUT,
    iMENU,
    iEXIT
} LngStrId;


Если же поменять дефайны LNG_BEGIN_STR_TABLE, LNG_END_STR_TABLE и LNG_STR на
Код:
#define LNG_BEGIN_STR_TABLE const LngStrItem lng_str_items[] = {
#define LNG_END_STR_TABLE {0} };
#define LNG_STR(STR_ID, ...) { __VA_ARGS__ },

и опять после этого поставить
Код:
LNG_BEGIN_STR_TABLE
   LNG_STR(iGET,  "Get",  u8"Взять")
   LNG_STR(iPUT,  "Put",  u8"Положить")
   LNG_STR(iMENU, "Menu", u8"Меню")
   LNG_STR(iEXIT, "Exit", u8"Выход")
LNG_END_STR_TABLE

то сгенерируется код
Код:
const LngStrItem lng_str_items[] = {
    {"Get",  u8"Взять"},
    {"Put",  u8"Положить"},
    {"Menu", u8"Меню"},
    {"Exit", u8"Выход"},
    {0}
};


фактически lng.h, который я тут привёл, занимается тем, что сначала задаёт макросы, а потом подключает файл с переводом (lng_strings.incl) через #include (и делает это не один раз). В итоге генерируется и enum для строк и сами строки перевода. При этом они гарантированно соответствуют друг другу. Вот такая магия на макросах.


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

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


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

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
ArtDen писал(а):
...

Этот человек любезно согласился переделать файлы под IAR. Премного вам благодарен. Все заработало. Только пришлось поменять кодировку и переделать файл в lng_strings.h.
Есть но!
Show У меня было так


Show У вас так


Мой вариант удобен тем, что В строке сразу виден текст. И редактировать меню в одном месте. У вас же указатель на массив текстов. Я тоже так делал. В смысле массив, а не ваш метод идентификации языков. Но теперь редактировать в двух местах и чесать репу насчет названий... С другой стороны вся эта простыня текстовых сообщений убирается в другое место.

Есть просьба. Ваш метод хорош. И думаю будет полезен и другим участникам. Разверните пожалуйста ваш метод.


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

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 377
Огород из моего lng.h имеет смысл городить тогда, когда на разные языки переводится не только меню (в котором можно и switch для каждого языка сделать), но и всё остальное - информационные экраны, настройки, заголовки, справка.
Я лишь показал идею - использовать макросы вместо того, чтобы вручную составлять идентификаторы и массивы из строк для каждого языка.

demiurg1978 писал(а):
Разверните пожалуйста ваш метод.

Не совсем понял


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

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

Расписать идею полностью. Поясню. Мне когда впервые показали x-макросы, я матерился в голос. Потому что я итак не понимал, что и как, но и мне тогда пришлось выдергивать кусок той идеи. И пришлось вникать, все мозги свернул напрочь... Понял, но материииился....
И я заметил, что такая же ситуация у многих участников, им бы попроще, и они не понимают пользы подобных макросов.
Если вы распишете, то начнут понимать и использовать. А это можно сказать повышение квалификации. Не побоюсь таких громких слов.
Я в свое время именно на таких топиках учился.


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

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 377
Так я же уже расписывал. Вот 2 основных куска кода из lng.h:
Код:
#define LNG_BEGIN_LANG_TABLE typedef enum LngId_ { _LNG_FIRST_ID = -1
#define LNG_ID(LANG_ID) , LANG_ID
#define LNG_END_LANG_TABLE , _LNG_LAST_ID } LngId;
#define LNG_BEGIN_STR_TABLE typedef enum { _FIRST_STR_ID = -1
#define LNG_END_STR_TABLE } LngStrId;
#define LNG_STR(STR_ID, ...) , STR_ID

#include LNG_FILE

Тут создаётся enum для списка языков и enum для id-шников строк.

И далее:
Код:
#define LNG_BEGIN_LANG_TABLE
#define LNG_ID(LANG_ID)
#define LNG_END_LANG_TABLE
#define LNG_BEGIN_STR_TABLE const LngStrItem lng_str_items[] = {
#define LNG_END_STR_TABLE {0} };
#define LNG_STR(STR_ID, ...) { __VA_ARGS__ },

#include LNG_FILE

Создаётся массив переводов.

PS: кто хочет - разберётся. И, возможно, свою реализацию напишет. Кто не хочет - ну это его дело. Я не заставляю разбираться ))
PPS: как работают макросы си расписано в вики: https://ru.wikipedia.org/wiki/%D0%9F%D1 ... 0%A1%D0%B8
Магия с __VA_ARGS__ расписана вот тут: https://ru.wikipedia.org/wiki/%D0%92%D0 ... 0%BE%D1%81


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

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


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

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 377
Чтобы текст был в MAKE_MENU как и раньше? Никак. Мой способ это не позволяет.


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

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

Понятно. Законсервирую ваш способ до лучших времен.


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


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


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

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


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

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

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