Как запихнуть строки в ресурсы или мультиязычный советник - страница 2

 
Alexey Viktorov:
Алексей, а условную компиляцию здесь нельзя применить? Не получится удобней?

Я думаю, это будет более громоздко, чем выбор строки из многомерного строкового массива. К тому же нет определенного дефайна, который указывал бы на язык терминала, то есть придется задавать этот дефайн самому.

Ну, и наконец, получится несколько вариантов .ex* файлов, по одному на каждый язык

 
Maxim Kuznetsov:

по идее можно сделать csv файл с переводами и считывать его в OnInit

id ; English ; Russian

0 ; "spread" ; "Спрэд"

1 ; "profit" ; "Профит"

а файл уже запихнуть в ресурсы. Да и вообще такой файл можно сделать один на все проекты

В маркете не пойдет, там нужен один .ex* файл
 
Sergey Pavlov:

Я делаю так:

Я примерно так себе и представляю, вопрос был, как эти строковые массивы запихнуть в ресурсы. Уже понимаю, что никак, придется вынести в отдельный .mqh файл наверное.
 
Alexey Volchanskiy:
Я примерно так себе и представляю, вопрос был, как эти строковые массивы запихнуть в ресурсы. Уже понимаю, что никак, придется вынести в отдельный .mqh файл наверное.

А если этот *.mqh файл сделать в виде класса. В этом классе начальный метод - инициализация - выбор языка в зависимости от языка терминала.

И потом просто метод GetRow(const int row) и будет этот метод, в зависимости от языка, возвращать строку под номером таким-то из соответствующего списка или массива:

string Mstr_eng[][3]=
  {
     {"      The class constructor CWin"},
     {"      Properties class object CWin:"},
     {"Window title","New window"},
     {"Header Type","CRowType1(0)"},
     {"X= offset from the vertical","50"},
     {"Y= offset from the horizontal","100"},
     {"B= window width","250"},
     {"Snap windows","left corner"},
     {"         The class constructor CRow"},
     {"Focus is on the line","0"},
     {"ADD","INSERT","DELETE"},
     {"         Properties class object CRow:"},
     {"Type line","CRowType1(0)"},
     {"Cell 1 (string)",""},
     {"Cell 2 (string)",""},
     {"Cell 3 (string)",""},
     {"Cell width 1 (int)",""},
     {"Cell width 2 (int)",""},
     {"Project","file name"},
     {"Code Generation","START"},
     {},
     {}
  };
string Mstr_rus[][3]=
  {
     {"      Конструктор класса CWin"},
     {"      Свойства объекта класса CWin:"},
     {"Заголовок окна","Новое окно"},
     {"Тип заголовка","CRowType1(0)"},
     {"X= отступ от вертикали","50"},
     {"Y= отступ от горизонтали","100"},
     {"B= ширина окна","250"},
     {"Привязка окна","левый угол"},
     {"         Конструктор класса CRow"},
     {"Фокус на строке","0"},
     {"ДОБАВИТЬ","ВСТАВИТЬ","УДАЛИТЬ"},
     {"         Свойства объекта класса CRow:"},
     {"Тип строки","CRowType1(0)"},
     {"Ячейка 1 (string)",""},
     {"Ячейка 2 (string)",""},
     {"Ячейка 3 (string)",""},
     {"Ширина ячейки 1 (int)",""},
     {"Ширина ячейки 2 (int)",""},
     {"Проект","имя файла"},
     {"Генерация кода","СТАРТ"},
     {},
     {}
  };
 
Alexey Volchanskiy:
Вы хотели сказать - арифметика указателей? В MQL не работает, т.к. тутошние указатели не указывают на адреса памяти, это просто дескрипторы в виндовской интерпретации.

Я хотел сказать и сказал спецификация. :) Описание арифметики часть спецификации. Ну ладно, вопрос терминологии.

Ну, не работает, так не работает. Жаль.

 
Alexey Volchanskiy:
Я примерно так себе и представляю, вопрос был, как эти строковые массивы запихнуть в ресурсы. Уже понимаю, что никак, придется вынести в отдельный .mqh файл наверное.

Для строк по определению не нужны ресурсы, т.к. строки в массивах это и есть подключаемые "ресурсы". Вообще абсолютно любой файл может хранится в программе в виде обычного массива uchar. Так у меня например хранится xml файл настроек программы:

uchar test_mqh[115] = 
{
   60,83,101,116,116,105,110,103,115,62,13,10,9,60,65,99,116,105,118,101,45,80,111,115,105,116,105,111,110,115,62,13,10,
   9,13,10,9,60,47,65,99,116,105,118,101,45,80,111,115,105,116,105,111,110,115,62,13,10,9,60,65,99,116,105,118,
   101,45,80,111,115,105,116,105,111,110,115,62,13,10,9,13,10,9,60,47,65,99,116,105,118,101,45,80,111,115,105,116,
   105,111,110,115,62,13,10,60,92,83,101,116,116,105,110,103,115,62
};

 Естественно необходимо написать специальный конвертер, загружающий произвольный файл с диска и конвертирующий его в MQL массив. Кстати, подобные ресурсы можно еще и сжимать zip'ом, благодаря чему будет достигаться еще большая экономия.

 
Karputov Vladimir:

А если этот *.mqh файл сделать в виде класса. В этом классе начальный метод - инициализация - выбор языка в зависимости от языка терминала.

И потом просто метод GetRow(const int row) и будет этот метод, в зависимости от языка, возвращать строку под номером таким-то из соответствующего списка или массива:

Кстати, это мысль. Будет попроще в использовании. Наверное, так и сделаю, сенкс за идею.
 
Alexey Volchanskiy:
Кстати, это мысль. Будет попроще в использовании. Наверное, так и сделаю, сенкс за идею.
Пожалуйста. 
 
Alexey Volchanskiy:
Кстати, это мысль. Будет попроще в использовании. Наверное, так и сделаю, сенкс за идею.
Вот только кажется массивы типа string нельзя проинициализировать в конструкторе?
 
Karputov Vladimir:
Вот только кажется массивы типа string нельзя проинициализировать в конструкторе?

В конструкторе никакие массивы нельзя проинициализировать одной строкой типа 

double arr[] = {1, 22.44, 123.456};

Можно только поэлементно

Но можно задать начальные значения массивам с модификатором static или const static. Пример:

class InitStaticAndConst
{
public:
    const static string str[][5];
};

const string InitStaticAndConst::str[][5] = {{"s1","s2","s3","s4","s5"}, {"s11","s12","s13","s14","s15"}}; // инициализацию необходимо выносить за объявление класса

void OnStart()
{
    Print(InitStaticAndConst::str[1][2]);
}
Причина обращения: