C++ я никогда не изучал. Вот с чем с ходу удалось разобраться (надеюсь, правильно понял):
Спойлер
// ChangeText.cpp: определяет экспортированные функции для приложения DLL.
//
#include "stdafx.h"
#include "ChangeText.h"
#include <stdio.h>
#include <locale>
/////////Вставьте здесь объявление своих переменных//
int LenDict = 0; //номер строки в словаре (при составлении) и длина словаря
wchar_t Dict[10000][2][80]; //словарь, состоящий из 10000 пар значений оригинал-перевод (по 80 символов в каждой фразе?)
FILE* stream; //контейнер хранения файла замен
char first = 1; //флаг однократного считывания словаря
/////////////////////////////////////////////////////
CHANGETEXT_API wchar_t* ChangeText(wchar_t* inText)
{
wchar_t outText[80];
//////////Вставте здесь свой текст/////////////////
if (first) //проверка флага: выполнялось ли заполнение словаря
{
first = 0; //меняет значение флага
setlocale(LC_ALL, "Russian"); //устанавливает новую локализацию
if( fopen_s( &stream, "words.txt", "r, ccs=UNICODE" ) == 0 ) //загоняет файл "words.txt" в поток обрботки в режиме юникода
{
while( fgetws( Dict[LenDict][0], 80, stream ) != NULL) //считывает 80 символов из файла в строку переводимого значения;
//исполнять цикл до ошибки или конца файла
{
fgetws( Dict[LenDict][1], 80, stream ); //четные строки файла берутся в качестве перевода
Dict[LenDict][0][wcslen(Dict[LenDict][0]) - 1] = 0; //удаляется символ новой строки в конце
Dict[LenDict][1][wcslen(Dict[LenDict][1]) - 1] = 0; //удаляется символ новой строки в конце
LenDict++;
}
fclose( stream ); //закрыть поток ввода/вывода
}
}
memset(outText, 0, 80*sizeof(wchar_t)); //заполняет блок памяти outText пустым значением в соответствующем формате
memcpy(outText, inText, wcslen((wchar_t*)inText) * sizeof(wchar_t)); //копирует блок памяти из адреса inText в outText
for (int i = 0; i < LenDict; i++) //для каждой из строк словаря
{
wchar_t* find = wcsstr(outText,Dict[i][0]); //ищет подстроку переводимой фразы в outText (первое совпадение!)
if (find != NULL) //если найдено
{
int pos = (int)(find - outText); //позиция первого символа найденной строки в outText (из разницы указателей)
memcpy(outText + pos + wcslen(Dict[i][1]), outText + pos + wcslen(Dict[i][0]), (wcslen(outText) - pos - wcslen(Dict[i][0]))*2);
outText[wcslen(outText) - wcslen(Dict[i][0]) + wcslen(Dict[i][1])] = 0;
memcpy(outText + pos, Dict[i][1], wcslen(Dict[i][1])*2);
//копирует ??? Короче, тут я запутался, но смысл тот, что заменяет переводимое значение на перевод,
//корректируя адреса в соответствии с длиной строк из словаря
}
}
///////////////////////////////////////////////////
return outText; //возвращает значение после перевода
}
В связи с этим возникла пара вопросов:
С чем связано ограничение длины строк словаря в 80 символов (если я не ошибаюсь)?
Если в inText несколько раз встречается подстрока
Dict[i][0]
, то переведётся только первое совпадение?
И можно ли еще выложить исходники измененной sdl и sdl_ttf, если не трудно? Хочется разобраться, как это все работает.