Показать сообщение отдельно
Старый 04.10.2017, 21:12
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
1>>Интерфейсы могут быть реализованы только экземплярами. Другими словами, статические методы интерфейсами не регламентируются.

2>>Пространства имен не дадут тебе возможности добавлять языки, не переписывая код. Ведь для нового языка тебе придется добавить пространство имен и соответствующие методы. Надо абстрагировать систему так, чтобы программе было совершенно фиолетово, какой язык.
Ты вот приводил пример, что в английском нет падежей. Ну так это значит, что все замены будут однотипные в именительном падеже. То есть везде в тексте будет $n0, и не будет $n1...$n5. А в массиве замен будет просто одно имя John, а не Маша в шести падежах. И поэтому один и тот же алгоритм сможет обрабатывать текст и на русском и на английском. Почему? Потому что разница только в данных, и если данные Текст соответствуют данным Замены, то никаких проблем не будет. Такой же степени абстракции кода надо добиться во всех других случаях. Например, формат даты и времени тоже можно как-то единообразно зашифровать и передавать в файле языковых данных, например там <dataFormat>DD.MM.YYYY</dataFormat>. И написать парсер (мне кажется это не так уж сложно) который будет в рантайме форматировать дату-время под заданный формат. То есть постоянный код, не заменяемый с языком, способный отформатировать дату по заданному шаблону (а вариантов форматов, мягко говоря, совсем немного).

3>>Не совсем понял, что значит "руками это не делается"? При чем тут "статические таблицы"? А их кто писал? Не руками? Как-то вообще непонятно, что ты имеешь ввиду.
Я не делал текстовых квестов. Возможность смены языков я делал для приложения типа хранилища и редактора записок, то есть там смена языка только в интерфейсе. Для каждой фразы имеется идентификационный номер. В коде, когда надо вывести текст, идет обращение к классу Language и вызывается его статический метод getText(id:uint):String. Этот класс в начале программы загружает XML, в котором все фразы хранятся со своими идентификаторами, например в Eng.xml так:
<phrase id="123684">The File $&fileName is broken.</phrase>
а в Rus.xml так:
<phrase id="123684">Файл $&fileName поврежден.</phrase>

Как программа узнает, какой файл языка загрузить и применять? Его название хранит config.xml, который программа загружает самым первым и из него берет пути к остальным настроечным файлам — теме оформления интерфейса, истории открывавшихся файлов, файлу языка.

То есть, по-порядку:
программа загружает config.xml
в нем указано <language>Rus</language>
программа активирует класс Language, передавая ему путь загрузки "Rus.xml"
Language открывает этот файл и считывает его в объект XML
программа двигается дальше, отрисовывает интерфейс, периодически обращаясь к Language.getText(#) —
ей не надо ничего знать о том, какой там на дворе язык: Language даст ей фразу на нужном языке и дату/время в нужном формате (шаблон русского формата указан в Rus.xml)
__________________
Reality.getBounds(this);