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

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

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

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

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

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

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

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

 

=======

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

String utf8rus(String source)  // Функция для конвертации русских символов из двубайтовой кодировки в однобайтовую
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xBF){
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB7; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}

 

b707
Онлайн
Зарегистрирован: 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

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

int8_t negativeArray[] = { -5, -7, -15, -19, -3, -42};
int8_t positiveArray[] = { +5, +7, +15, +19, +3, +42};

int8_t* ptrArray = negativeArray;
uint8_t arraySize;

void setup() {
  Serial.begin(115200);
}

void loop() {

  if (negativeArray == ptrArray) {
    ptrArray = positiveArray;
    arraySize = sizeof(positiveArray);
    Serial.println("*** positive ***");
  } else {
    ptrArray = negativeArray;
    arraySize = sizeof(negativeArray);
    Serial.println("*** negative ***");
  }

  for (uint8_t i = 0x00; i < arraySize; i++) {
    Serial.println(ptrArray[i]);
  }
  delay(2048);
}

 

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...