Как делается переключение языка?
- Войдите на сайт для отправки комментариев
Втр, 19/03/2019 - 18:40
Есть дисплей (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;
}
Вариант - организуете все строчки на одном языке в массив. Потом делаете полную копию первого массива. но уже на другом языке.
Теперь, когда вам надо сменить язык - просто подменяете один массив другим.
Тут требуется крепко подумать вот над чем: нужны ли эти строки в RAM , а если нет, то будет ли перекодировать ваша функция, если ей скормить PROGMEM-ресурс.
... Теперь, когда вам надо сменить язык - просто подменяете один массив другим.
Тут требуется крепко подумать вот над чем: нужны ли эти строки в RAM , а если нет, то будет ли перекодировать ваша функция, если ей скормить PROGMEM-ресурс.
:)
Я предлагаю подумать, как и написал ранее... А подмена делается через указатель в одно движение.
Я предлагаю подумать, как и написал ранее... А подмена делается через указатель в одно движение.
:)) ......... (ждите - "а что такое указатель?")
Дак мне не жалко указателей отсыпать...
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); }:)) ......... (ждите - "а что такое указатель?")
:)) ......... (ждите - "а что такое указатель?")
Вангую, это был не xDriver.))))
:)) ......... (ждите - "а что такое указатель?")
Вангую, это был не xDriver.))))
Наверно, чтобы новичек, выучил терминологию.))) Хотя, ладно, брюзжу, по стариковски. Но плюсик, в противовес, ему добавил.
будет ли перекодировать ваша функция, если ей скормить PROGMEM-ресурс
Функция utf8rus() теперь может и с PROGMEM-строками работать (пост #405): http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...
Кому интересно, вот функция обработки кириллических символов
Кому интересно :) могут пример для дисплея 9341 в посте #46 посмотреть: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...
Спасибо, буду пробовать. Что именно означает команда "display.cp437(true);"?
Спасибо, буду пробовать. Что именно означает команда "display.cp437(true);"?
Пост #15: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...