Как делается переключение языка?

Jake
Offline
Зарегистрирован: 07.02.2019

Есть дисплей (SPI ILI9341), хочется сделать возможность переключать язык (англ, русс, потом ещё и другие добавлю).

Помогите понять логику правильной/оптимальной реализации переключения языка, пожалуйста.

Можно просто что-то типа такого:

1if (language == 1) {
2tft.print(utf8rus("Молоко");  // это роботает, см. ниже
3} else {
4tft.print("Milk");
5}

Но фраз будет много - громоздко получится, если делать такую проверку (if) прямо в коде вывода фразы на экран.

Как же лучше сделать?

 

=======

Кому интересно, вот функция обработки кириллических символов:

01String utf8rus(String source)  // Функция для конвертации русских символов из двубайтовой кодировки в однобайтовую
02{
03  int i,k;
04  String target;
05  unsigned char n;
06  char m[2] = { '0', '\0' };
07  k = source.length(); i = 0;
08  while (i < k) {
09    n = source[i]; i++;
10 
11    if (n >= 0xBF){
12      switch (n) {
13        case 0xD0: {
14          n = source[i]; i++;
15          if (n == 0x81) { n = 0xA8; break; }
16          if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
17          break;
18        }
19        case 0xD1: {
20          n = source[i]; i++;
21          if (n == 0x91) { n = 0xB7; break; }
22          if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
23          break;
24        }
25      }
26    }
27    m[0] = n; target = target + String(m);
28  }
29  return target;
30}

 

b707
Offline
Зарегистрирован: 26.05.2017

Вариант - организуете все строчки на одном языке в массив. Потом делаете полную копию первого массива. но уже на другом языке.

Теперь, когда вам надо сменить язык - просто подменяете один массив другим.

sadman41
Offline
Зарегистрирован: 19.10.2016

Тут требуется крепко подумать вот над чем: нужны ли эти строки в RAM , а если нет, то будет ли перекодировать ваша функция, если ей скормить PROGMEM-ресурс.

Jake
Offline
Зарегистрирован: 07.02.2019

b707 пишет:

... Теперь, когда вам надо сменить язык - просто подменяете один массив другим.

Была такая мысль, но я пока не умею подменять один массив другим. Можете сделать демо код, пожалуйста?

 

sadman41 пишет:

Тут требуется крепко подумать вот над чем: нужны ли эти строки в RAM , а если нет, то будет ли перекодировать ваша функция, если ей скормить PROGMEM-ресурс.

Что такое PROGREM-ресурс, и что Вы предлагаете? функция не моя, если что, извините за такие вопросы..

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

:)

sadman41
Offline
Зарегистрирован: 19.10.2016

Я предлагаю подумать, как и написал ранее... А подмена делается через указатель в одно движение.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

sadman41 пишет:

Я предлагаю подумать, как и написал ранее... А подмена делается через указатель в одно движение.

:)) .........    (ждите - "а что такое указатель?")

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак мне не жалко указателей отсыпать...

01int8_t negativeArray[] = { -5, -7, -15, -19, -3, -42};
02int8_t positiveArray[] = { +5, +7, +15, +19, +3, +42};
03 
04int8_t* ptrArray = negativeArray;
05uint8_t arraySize;
06 
07void setup() {
08  Serial.begin(115200);
09}
10 
11void loop() {
12 
13  if (negativeArray == ptrArray) {
14    ptrArray = positiveArray;
15    arraySize = sizeof(positiveArray);
16    Serial.println("*** positive ***");
17  } else {
18    ptrArray = negativeArray;
19    arraySize = sizeof(negativeArray);
20    Serial.println("*** negative ***");
21  }
22 
23  for (uint8_t i = 0x00; i < arraySize; i++) {
24    Serial.println(ptrArray[i]);
25  }
26  delay(2048);
27}

 

Jake
Offline
Зарегистрирован: 07.02.2019

xDriver пишет:

:)) .........    (ждите - "а что такое указатель?")

Кто-то из нас перепутал раздел, кто бы это мог быть? :)

bwn
Offline
Зарегистрирован: 25.08.2014

Jake пишет:

xDriver пишет:

:)) .........    (ждите - "а что такое указатель?")

Кто-то из нас перепутал раздел, кто бы это мог быть? :)

Вангую, это был не xDriver.))))

Jake
Offline
Зарегистрирован: 07.02.2019

bwn пишет:

Jake пишет:

xDriver пишет:

:)) .........    (ждите - "а что такое указатель?")

Кто-то из нас перепутал раздел, кто бы это мог быть? :)

Вангую, это был не xDriver.))))

Тогда что он ожидал в Разделе для новичков?

bwn
Offline
Зарегистрирован: 25.08.2014

Наверно, чтобы новичек, выучил терминологию.))) Хотя, ладно, брюзжу, по стариковски. Но плюсик, в противовес, ему добавил.

arduinec
Offline
Зарегистрирован: 01.09.2015

sadman41 пишет:

будет ли перекодировать ваша функция, если ей скормить PROGMEM-ресурс

Функция utf8rus() теперь может и с PROGMEM-строками работать (пост #405): http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

arduinec
Offline
Зарегистрирован: 01.09.2015

Jake пишет:

Кому интересно, вот функция обработки кириллических символов

Кому интересно :) могут пример для дисплея 9341 в посте #46 посмотреть: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

Jake
Offline
Зарегистрирован: 07.02.2019

Спасибо, буду пробовать. Что именно означает команда "display.cp437(true);"?

arduinec
Offline
Зарегистрирован: 01.09.2015

Jake пишет:

Спасибо, буду пробовать. Что именно означает команда "display.cp437(true);"?

Пост #15: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...