Guest FLAM Posted January 14, 2011 Share Posted January 14, 2011 Добрый день! Может кто знает как довести иформацию до разработчиков? Проблема в том, что функции FromWString и ToWString некорректно работают на не русских ОС (при игре в русские АО). У меня на немецкой ОС FromWString возвращает одни вопросительные знаки, а ToWString "крякозябли". Я полагаю что разработчики используют для перевода WString <-> String стандартную кодировку систему. Это работает нормально если стандартная кодировка выставленна как русская. Если подумать, то кодировка должна не зависить от систему, а зависить от языка игры. При русской локализации - это должна быть кодировка 1251. При немецкой - 1252. Возможно ли поправить функции или дать возможнось передавать кодировку как параметр? Спасибо! Quote Link to comment Share on other sites More sharing options...
Guest FLAM Posted January 17, 2011 Share Posted January 17, 2011 Я пообщался с администрацией и мне сказали, что эти функции исчключительно для тестовых нужд. Если вы хотите чтобы ваши аддоны работали не только на русской ОС, то от этих фунций придётся отказаться. Это конечно сложно, если не дадут возможности напрямую работать с WString'ами, т.к. в данный момент их например даже нельзя объединить (или я не знаю такого метода). Quote Link to comment Share on other sites More sharing options...
Guest FLAM Posted January 18, 2011 Share Posted January 18, 2011 Функция для работы с WString'ами не будет. Я к сожалению не могу понять как тогда делать аддоны если не использовать toWString и FromWString. Если я например хочу вывести где-нить в интерфейсе имя персонажа и в скобках его левел - как мне это сделать? Quote Link to comment Share on other sites More sharing options...
duvo Posted January 18, 2011 Share Posted January 18, 2011 Видимо, остается только играться форматами. Например, Code: local format = userMods.ToWString( "<body><r name='name'/> [<r name='level'/>] </body>" ) wtTextView:SetFormat( format ) wtTextView:SetVal( "name", object.GetName( avatar.GetId() ) ) wtTextView:SetVal( "level", common.FormatInt( unit.GetLevel( avatar.GetId() ), "%d" ) ) Quote Link to comment Share on other sites More sharing options...
Ciuine Posted January 18, 2011 Share Posted January 18, 2011 Character names in the game are passed as WStrings, not strings. This means they do not need to be converted to WStrings via ToWString commands. object.GetName(id) is a WString. "Blah, useless string." is a string. Look for the labeling of types in the ModdingDocuments. Google Translate: Имена персонажей в игре передаются как WStrings, а не strings. Это означает, что они не должны быть преобразованы в WStrings через ToWString команды. object.GetName(id) является WString. "Бла, бесполезные строки". является string. Посмотрите на маркировку типа в ModdingDocuments. Quote Link to comment Share on other sites More sharing options...
Ciuine Posted January 18, 2011 Share Posted January 18, 2011 Bah, beat me to the punch. Quote Link to comment Share on other sites More sharing options...
Guest FLAM Posted January 18, 2011 Share Posted January 18, 2011 Во, это уже что-то! Хоть тут и используется ToWString, но она тут работать будет, т.к. кириллицы в строке нету. Можно ли такой же фокус прокрутить если у нас нету TextView? Если я например хочу просто закинуть в переменную? Quote Link to comment Share on other sites More sharing options...
Nikon Posted January 18, 2011 Share Posted January 18, 2011 Quote: вывести где-нить в интерфейсе имя персонажа и в скобках его левел Это делается элементарно, без всяких ВСтрингов. И даже без извращений с форматами. Примеров в аддонах полноБывают закавыки и поинтереснее. Типа тех же локализацЫй Quote Link to comment Share on other sites More sharing options...
Guest FLAM Posted January 18, 2011 Share Posted January 18, 2011 А можно, пожалуйста, конкретный пример? Quote Link to comment Share on other sites More sharing options...
Nikon Posted January 18, 2011 Share Posted January 18, 2011 Текст "где-нить в интерфейсе" выводится обычно в TextView(чаще, удобнее и понятнее) или на кнопачку(реже, для эстетов) Ну и берем, к примеру, всем известный DarkDPSMeter и смотрим там работу с TextView. Там дофига конкретных примеров Если не понятно и хочется чепопроще - смотрим DDStat или DDView Если ваще влом чето левое качать - идем по адресу МаяЛюбимаяИгруха\data\Mods\SampleAddons\SampleZoneAnnounce И смотрим там работу с TextView Quote: Я пообщался с администрацией и мне сказали, что эти функции исчключительно для тестовых нужд. У них весь клиент создан исключительно для тестовых нужд, причем результаты тестов никого не волнуют (ну, кроме денежных тестов) Quote Link to comment Share on other sites More sharing options...
Guest FLAM Posted January 18, 2011 Share Posted January 18, 2011 Всё, я вроде разобрался. Надо всё делать через ValuedText. Сейчас буду пробовать! Всем спасибо! Quote Link to comment Share on other sites More sharing options...
Guest FLAM Posted January 18, 2011 Share Posted January 18, 2011 Возможно ли как-то из ValuedText получить WString без добавления этого куда-то в TextView? Code: local valuedText = common.CreateValuedText(); valuedText:SetFormat(userMods.ToWString("<body><r name='zone'/> :: <r name='name'/> [<r name='level'/>] </body>")); valuedText:SetVal("zone",cartographer.GetCurrentZone().zoneName); valuedText:SetVal("name",object.GetName(uid)); valuedText:SetVal("unit",common.FormatInt(unit.GetLevel(uid),"%02d")); Вот как мне теперь результат запихать в WString? Quote Link to comment Share on other sites More sharing options...
duvo Posted January 19, 2011 Share Posted January 19, 2011 Вроде, нет, получить никак. Зачем запихивать результат в WString? Для чего это нужно? Может, возможно как-то иначе все реализовать. Quote Link to comment Share on other sites More sharing options...
Nikon Posted January 19, 2011 Share Posted January 19, 2011 Ога. У разрабов оригинальное чуство юмора В версии АО 2.01 добавилась замечательная функция TextViewSafe:GetValuedText() И получать текст, в примере к функци, они предлагают через неработающий в пользовательских аддонах debugCommon.FromValuedText() ЗЫ. А на самом деле, тебе зачем это все преобразовывать в WString? Чтобы что? Где то хранить? С чем то сравнивать? Куда то выводить? Quote Link to comment Share on other sites More sharing options...
Guest FLAM Posted January 19, 2011 Share Posted January 19, 2011 Ну всё началось с аддона aospider, там собирается информация и сохраняется в .cfg файл. При этом все значения надо как бы сохранить в переменные. У меня этот аддон некорректно работает. Я понимаю что это очень специфическая задача и функции для этого не предназначенны, но если подумать то нехватает совсем чуть чуть. Quote Link to comment Share on other sites More sharing options...
Nikon Posted January 19, 2011 Share Posted January 19, 2011 Текст WString, наверное, должен использоваться только для отображения локализованой информации в игровом интерфейсе Как aospider (сам им не пользовался, пока нет нормального инета) некорректно работает? 1. Сохраненяем в .cfg текст в формате WString, ничем не преобразованый до этого (или он как-то зачем-то преобразуется? ) 2. Считываем этот же текст из .cfg - пытаемся отобразить в игровом интерфейсе, получаем нечитаемый набор символов? 2. Или смотрим .cfg и "видим фигу"? (чем смотрим? Режим отображения UTF8 в ANSI кодировке? ) Нет в пользовательском АПИ никаких функций для преобразования WString в String кроме "тестовой" FromWString (по крайней мере я что то про них не слышал) В общем ИМХО пока не поправят FromWString и ToWString рыпаться бесполезно. Как вариант, попробовать составить таблицу соответствия преобразованиых символов после WString -> BuggedString <=> String и состряпать функцию, которая по этой таблице будет восстанавливать текст Quote Link to comment Share on other sites More sharing options...
duvo Posted January 19, 2011 Share Posted January 19, 2011 Посмотрел код по диагонали: проблема с aospider решается, во-первых, отказом от преобразований to-/fromWString; во-вторых, заменой кириллических имен полей латинскими или вовсе использованием массива. Это потребует, видимо, несколько изменить структуру данных, чтобы аддон продолжал выполнять свою функцию, но иного пути достижения совместимости "малой кровью" не вижу. Разумеется, имхо. Если же говорить о локализации в общем, от relatedtext никуда не деться. Все-таки, хранить строки в скрипте и преобразовывать -- это не вариант, как бы удобно ни было. p.s. В аддонах ВоВ строки хранятся прямо в скрипте. Хм... Quote Link to comment Share on other sites More sharing options...
Loss Posted January 19, 2011 Share Posted January 19, 2011 В моем аддоне, а именно "aospider" часто происходит работа со строками(например: склеивание текста, не работает без преобразования). По поводу преобразования такая же проблема. Все функции работают только со String форматом. Пробовали уже. Quote Link to comment Share on other sites More sharing options...
Loss Posted January 19, 2011 Share Posted January 19, 2011 при попытки склеивания без преобразования выдает: Error: addon aospider code: [string "mods/addons/aoscode/main.lua"] attempt to concatenate local `name' (a userdata value) Quote Link to comment Share on other sites More sharing options...
Loss Posted January 19, 2011 Share Posted January 19, 2011 проблема в не использовании кириллице в аддоне. А в том что например имя НИПов хранятся в кириллице. И по этому у него при сохранении в файле пишется "???????" А аддон будет переписан. Присутствие кириллицы обусловлено тем, что бы проще было обрабатывать данные. В ближайшее время кириллица будет убрана, точнее все лишние символы. Это снизит размер сохраняемых данных. Quote Link to comment Share on other sites More sharing options...
duvo Posted January 19, 2011 Share Posted January 19, 2011 Полагаю, если имя НИПа сохранять непосредственно (без перевода в string для конкатенации), в .cfg будет вполне корректная запись L"Имя_НИПа". Quote Link to comment Share on other sites More sharing options...
Loss Posted January 19, 2011 Share Posted January 19, 2011 Да, только вот с этим куском текста работать тоже надо. как же я еще сохраню каждого нпс в разной таблице, что бы при этом эта таблица могла дополнятся другими значениями по требованию. Quote Link to comment Share on other sites More sharing options...
Guest FLAM Posted January 19, 2011 Share Posted January 19, 2011 Я вот тут подумал ... ты делаешь строку "Unit_zone_name_lvl" и под этим ключом закидываешь в массив. А нельзя просто сделать многомерный массив? data["unit"][zone][name][lvl] Тогда все переменные можно оставить в WStringах и уникальность сохраняется. Quote Link to comment Share on other sites More sharing options...
Loss Posted January 20, 2011 Share Posted January 20, 2011 Можно, но: 1. Увеличивает размер сохраняемого файла. Я стараюсь наоборот уменьшить. 2. Нельзя применить фикс, который убирает в тексте лишние переносы строк. если это не делать то некоторые НИП, Задания, Объекты и Предметы не сохранятся. 3. Придется усложнять массив потому, что у меня например лут сохраняются "название" = "количество", где название проходит через еще один фикс который убирает в нем пробелы и заменяет их "_". Это опять увеличение размера сохраняемого файла. FLAM, у тебя какая ОС стоит? Quote Link to comment Share on other sites More sharing options...
Guest FLAM Posted January 20, 2011 Share Posted January 20, 2011 У меня стоит немецкая Windows 7. Как ANSI кодировка для не UNICODE программ используется кодировка Windows-1252. Quote Link to comment Share on other sites More sharing options...
Recommended Posts