Тестирование локализации, форматирование всех строк с XXXXX
Мы пытаемся взглянуть на оптимизацию нашего тестирования локализации.
Наша группа QA предложила специальный режим, чтобы все строки из ресурсов полностью содержались в X. Мы уже используем API LoadString и его реализацию MFC, поэтому это не должно быть серьезным препятствием.
Мой вопрос: как бы вы решили проблемы с форматированием?
Examples -
CString str ;
str . LoadString ( IDS_MYSTRING ) ;
where IDS_MYSTRING is "Hello World", should return "XXXXX XXXXX"
where IDS_MYSTRING is "Hello\nWorld", should return "XXXXX\nXXXXX"
where IDS_MYSTRING is "Hello%dWorld", should return "XXXXX%dXXXXX"
where IDS_MYSTRING is "Hello%.2fWorld", should return "XXXXX%.2fXXXXX"
where IDS_MYSTRING is "Hello%%World", should return "XXXXX%%XXXXX"
Таким образом, в итоге строка должна работать, если она используется в операторе printf или Format, она должна учитывать escape-символы.
Так что это вопрос чистого кода, C++/MFC,
CString ConvertStringToXXXX ( const CString& aSource )
{
CString lResult = aSource ;
// Insert your code here
return lResult ;
}
Я знаю, что это можно сделать с помощью инструментов для файлов.RC, но мы хотим построить английский, а затем запустить так:
приложение -L10NTEST
6 ответов
Если этот подход заключается в выделении отформатированных строк (или форматных последовательностей) в приложении (т. Е. Весь текст, отличный от XXXX), вы можете найти escape-последовательность (возможно, с помощью регулярных выражений) и вставить кавычки вокруг отформатированных (замещенных) значений,
например, некоторый текст \ntext -> Some[\n]
Вы получаете удобочитаемость (все строки, так как XXX может быть трудно использовать в приложении), а также обнаруживает нересурсные (жестко закодированные) строки.
Сказав это, если вы хотите обнаружить строки, не загруженные ресурсами (жестко закодированные строки), вместо замены X, почему бы просто не поставить префикс строки? Вы легко сможете отличить загруженные ресурсом строки от жестко закодированных строк,
например, некоторые \ntext -> [EN] некоторые \ ntext
Надеюсь, поможет?
В этом вам может помочь функция псевдолокализации appTranslator: она изменяет непереведенные строки для использования диакритических знаков, расширения или сокращения текста и тому подобного. Пока что тебе это не интересно. Интересно, что такие строки заключаются в скобки. Идея состояла в том, чтобы сделать более очевидным, что строка псевдо локализована. Вы можете использовать это, чтобы обнаружить, что строка на самом деле приходит из таблицы строк, а не из кода.
И, конечно же, поскольку псевдо-локализованная программа должна работать правильно, appTranslator сохраняет все средства форматирования (в том числе printf-подобные и FormatMessage-подобные форматеры) и специальные символы, такие как% или \ n. Который является тем, что вы ищете.
Вам даже не придется изменять свой код: просто создайте "фиктивный" перевод. Под "пустышкой" я подразумеваю язык, на который вы не планируете переводить свое приложение. Установите языковые предпочтения вашего приложения на этот язык. Подождите, еще лучше: ребята из QA могут сделать это самостоятельно. Они даже не должны беспокоить вас!:-)
Отказ от ответственности: я автор appTranslator.
Редактировать: ответ на ваш комментарий: Рад, что вы уже используете appTranslator. Чтобы избежать проблем из-за диалогов или строк, отсутствующих в L10N DLL, вы можете просто перестроить библиотеки DLL (например, используя шаг после ссылки в вашем проекте VS). Процесс автоматически повторно сканирует исходный exe-файл и объединяет новые и измененные тексты во встроенных библиотеках ресурсов (не влияет на файл проекта appTranslator, в отличие от "Update Source"). Это помогает убедиться, что ваши библиотеки ресурсов всегда синхронизированы с вашим exe-файлом.
Мое окончательное решение заключалось в добавлении префикса к строке, например, "*[имя экземпляра ресурса] исходная строка". Он работает очень хорошо, он показывает вероятные строки, которые не подходят, скажем, по-немецки.
Пример:
Исходная строка из appres.dll, "Мое приложение"
Новая строка из appres.dll, "*[appres] Мое приложение".
Спасибо за все предложения.
Я думаю, что вам нужен языковой стандарт XXXX, если ваше программное обеспечение поддерживает языковые стандарты.
Вы разрабатываете его на английском языке, а затем переключаетесь на язык XXXX, чтобы убедиться, что все можно перевести.
Вы можете применить здесь теорию компилятора и сгенерировать свой сканер и парсер, используя flex / bison (lex / yacc или любые другие инструменты). Вы можете определить \w+ как слово, которое может соответствовать как "Hello", так и "World" и т. Д.
Я предпочитаю механизм, который мы использовали, когда я был в Microsoft, для псевдолокализации, который включал в себя установку скобок вокруг каждого локализованного ресурса. Ресурс => [-Resource-], например. Тогда вы всегда можете сказать, что у вас есть составная строка, и форматирование обычно не меняется, за исключением правил разрыва строки.
Мы также обычно делали некоторое расширение строки (добавляли различные символы вокруг исходной строки) и некоторую подстановку символов на основе словаря или рандомизации (конвертировали "o" в "ö").
Некоторые команды также помещают буквальный идентификатор ресурса (имя) в качестве значения локализованного ресурса, что было более полезно для локализаторов, чем для тестировщиков, потому что они могли видеть, где ресурс фактически использовался в пользовательском интерфейсе.