Как делается переключение языка?
- Войдите на сайт для отправки комментариев
Втр, 19/03/2019 - 18:40
Есть дисплей (SPI ILI9341), хочется сделать возможность переключать язык (англ, русс, потом ещё и другие добавлю).
Помогите понять логику правильной/оптимальной реализации переключения языка, пожалуйста.
Можно просто что-то типа такого:
1 | if (language == 1) { |
2 | tft.print(utf8rus( "Молоко" ); // это роботает, см. ниже |
3 | } else { |
4 | tft.print( "Milk" ); |
5 | } |
Но фраз будет много - громоздко получится, если делать такую проверку (if) прямо в коде вывода фразы на экран.
Как же лучше сделать?
=======
Кому интересно, вот функция обработки кириллических символов:
01 | String 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 | } |
Вариант - организуете все строчки на одном языке в массив. Потом делаете полную копию первого массива. но уже на другом языке.
Теперь, когда вам надо сменить язык - просто подменяете один массив другим.
Тут требуется крепко подумать вот над чем: нужны ли эти строки в RAM , а если нет, то будет ли перекодировать ваша функция, если ей скормить PROGMEM-ресурс.
... Теперь, когда вам надо сменить язык - просто подменяете один массив другим.
Тут требуется крепко подумать вот над чем: нужны ли эти строки в RAM , а если нет, то будет ли перекодировать ваша функция, если ей скормить PROGMEM-ресурс.
:)
Я предлагаю подумать, как и написал ранее... А подмена делается через указатель в одно движение.
Я предлагаю подумать, как и написал ранее... А подмена делается через указатель в одно движение.
:)) ......... (ждите - "а что такое указатель?")
Дак мне не жалко указателей отсыпать...
01
int8_t negativeArray[] = { -5, -7, -15, -19, -3, -42};
02
int8_t positiveArray[] = { +5, +7, +15, +19, +3, +42};
03
04
int8_t* ptrArray = negativeArray;
05
uint8_t arraySize;
06
07
void
setup
() {
08
Serial
.begin(115200);
09
}
10
11
void
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
}
:)) ......... (ждите - "а что такое указатель?")
:)) ......... (ждите - "а что такое указатель?")
Вангую, это был не 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...