-
14.02.2011, 10:07 #1
- Регистрация
- 07.08.2006
- Адрес
- Амурская область
- Возраст
- 70
- Сообщений
- 94
- Поблагодарили
- 7
- Поблагодарил
- 13
Как локализовать программу
Имеется некая программа, написанная на Net Framework. При установке есть выбор языка, турецкий или английский. Часть сообщений находится в .XML файлах и с ними проблем нет, локализуется просто. А вот часть находится в самом ЕХЕ-файле и в DLL-ках. Reschaker и Restorator "не видят " никаких ресурсов кроме Version Info. Как бы это дело обрулить и русифицировать всю программу, нужен совет гуру. Спасибо.
Александр (UA0JFY)
-
15.02.2011, 05:45 #2
- Регистрация
- 07.08.2006
- Адрес
- Амурская область
- Возраст
- 70
- Сообщений
- 94
- Поблагодарили
- 7
- Поблагодарил
- 13
Дальнейшие исследования ЕХЕ-шника и DLL-лок показали, что в бинарном коде имеются все надписи, которые есть на формах. Простая замена латинских символов на кириллицу выводит "квадратики". Если заменить транслитом, то все ОК. Естественно все это с соблюдением количества символов, иначе изменяется CRC-код и программа просто не грузится. Как указать фонт, чтобы поддерживалась кириллица?
Александр (UA0JFY)
-
15.02.2011, 18:37 #3
- Регистрация
- 26.02.2006
- Адрес
- Рыбинск, Ярославская обл.
- Возраст
- 41
- Сообщений
- 783
- Поблагодарили
- 157
- Поблагодарил
- 478
Попробуйте разные кодировки: win1251, utf-8, utf-16.
Но затея плохая - сами понимаете.С уважением, Алексей. UA3MQJ
-
15.02.2011, 19:27 #4
- Регистрация
- 12.03.2007
- Адрес
- Грац, Австрия - Санкт-Петербург, Россия
- Возраст
- 60
- Сообщений
- 1,749
- Поблагодарили
- 374
- Поблагодарил
- 160
В принципе элементарно, если эти DLL тоже написаны на .NET. Тогда через Reflector можно вытащить все ресурсы. В случае, если
написаны на другом языке и нет CLI - то поможет только один способ, использовать сателлитные ассембли (satellite assemblies) для
каждого языка. Других способов сцепить СОМ/СОМ+ с .NET нет, если не писать специальный wrapper или interop по выдергиванию
строк в память и их конвертации в нужные языки - но это серьезный геморрой.
Можно обеспечить перехват через Property Grid, но только для веб приложения, так как любой визуальный контроль имеет
аттрибут Localize. Отлавливаем через CultureInfo текущий язык и меняем его, и строки по контролю. Можно попробовать
использовать и ResourceManager, но только в случае, если формат ресурс-файлов совпадает.
Ну и попробуйте пару тулзов:
http://www.visloc.com/formate.0.html?&L=2 - Visual Localize
http://www.sisulizer.com/ - Sisulizer
Хотелось бы правда иметь побольше данных о DLL. Не могли бы выложить здесь для опытов? Так легче будет сказать,
что с ней делать.Последний раз редактировалось RX1AL; 15.02.2011 в 19:30. Причина: Добавлено сообщение
73! Михаил (OE6MAF) :: HB9/OE6MAF, DL/OE6MAF
-
16.02.2011, 10:22 #5
- Регистрация
- 07.08.2006
- Адрес
- Амурская область
- Возраст
- 70
- Сообщений
- 94
- Поблагодарили
- 7
- Поблагодарил
- 13
Доброго времени суток, Вам!
Еще до конца не разобрался во взаимодействии и зависимостях всех файлов этой программы. Могу выложить дистр проги, 12.5 мб. Программа не назойлива, даже не создает ярлыков и пунктов в менюшках. Запуск из %Program Files%\RAINBOW\RAINBOW Но тогда получается, что Вы мне очень сильно поможете. По ссылкам скачал программы, что рекомендованы, но что-то ничего у меня пока не получается. Вот в архиве только те, что явно нужны. Ну а весь дистр можно разбить и выложить. Что скажете?
73! de UA0JFYАлександр (UA0JFY)
-
16.02.2011, 14:04 #6
- Регистрация
- 12.03.2007
- Адрес
- Грац, Австрия - Санкт-Петербург, Россия
- Возраст
- 60
- Сообщений
- 1,749
- Поблагодарили
- 374
- Поблагодарил
- 160
Для начала скажу, что сначала взгляну на этого зверя, а там посмотрим...
UA0JFY
Ну я взглянул на ваш Rainbow.exe. В двух директориях en и en-AU находятся сателлитные ассембли Rainbow.resources.dll, что говорит
о том, что кто-то начинал делать локализацию правильно. Именно начинал, потому, что потом в самом коде .exe используются те же
ресурсы, но embedded. Чем я смотрел файл, не суть важно, есть средства. Но важно другое, то, что в самом коде при использовании
нейтральной CultureInfo есть интересные моменты. Кое-что перечислю:
1. chkGSM2.Text, Culture=neutral, а текст в ресурсе - SMS Gönder, по-турецки. Таких строчек по контролям там масса - ресурсы:
btnReport.Text=Rapor &Hazırlama ve Yazdırma, lstGelenAramalar.Name=lstGelenAramalar, btnIncoming.Text=Gelen Aramalar и.т.д.
2. Часть ресурсов имеет при этом английские строки: lblPasswordText.Text=Password и т.д.
3. А есть ресурсы, где и английские и турецкие вместе.
Вывод напрашивается сам собой. Без перекомпиляции данных ресурсов и вынесения каждой CultureInfo в отдельный ресурс по
отдельному файлу (satellite assembly) вы не сможете ничего сделать. Это физически невозможно при смешанных ресурс-файлах.
Кто так сделал, интересный вопрос, выходящий за рамки вашей проблемы. Теперь, как пытаться победить сие чудо в перьях?
Просто, но трудоемко по времени. Необходим дизассемблер: а) либо программным путем через Reflection.Emit (но это вам не под
силу, так как требует много знаний) и б) уже готовым тулзом. К сожалению, по пункту б) не так много бесплатных, которые позволят
вам это сделать. Другие стоят денег и таблетки на них нет, в силу того, что они obfuscated сами по себе. У нас есть такой тулз, которым
я и смотрел весь ваш код - мне в принципе не сложно сделать для вас весь исходный код по всему namespace J89Y01. Но только сам
исходный код - не более! На C# или на VB.NET - как скажете. Компилировать и проверять саму программу не буду - у меня нет половины
тех компонентов (ActiveX, COM+), которые она использует и ставить я их у себя не буду. Далее получив код, вы сами сначала для
нейтральной CultureInfo правите ресурс файл (редактором ресурсов в самой студии или любым внешним), затем добавляете языки.
Нейтральная CultureInfo всегда en-EN. Затем компилируете и отлаживаете на предмет других ошибок. Вот и все. Устраивает?
Правда, есть вот такая песня в коде нескольких форм:
this.createTabControl("pgm1", "Şebeke Frek Alt Limit", "1", 1, 200, num2, Conversions.ToString(modFunctions.Mains_Freq_Low), 0, 0);
Ключевое здесь ""Şebeke Frek Alt Limit" - данный параметр без переделки кода исправить невозможно, он в вызове метода, а не в
ресурсе. То есть еще и логику придется переписывать. Чьи такие кривые ручки писали код? Тем более по автоматике.
Добавлено через 59 минут
UA0JFY
Вдогонку по вашей программе. Есть и еще один момент с использованием констант в коде. То есть по исходному коду
нужно будет пройтись с напильником и рашпилем. Фрагмент декларации констант ниже:
public const string ShutDownEN547_0 = "Low Oil Press. Switch,High Temp. Switch,Low Coolant Level,Battery Charger Fail,Emergency Stop,Spare-1 Input,Spare-2 Input,Low Fuel Level Switch";
public const string ShutDownEN547_1 = "Low Oil Press. Sender,High Temp. Sender,Genset Low Frequency,Genset High Frequency, Genset Low Voltage, Genset High Voltage, Fail to Start, Low Fuel Level Sender";
public const string ShutDownEN547_2 = "Undefined Shutdown-16,Undefined Shutdown-17,Undefined Shutdown-18,High Battery Voltage, Charge Altern. Fail, J1939 ECU Alarm,Low Coolant Level AC,Undefined Shutdown-23";
public const string ShutDownTR547_0 = "D\x00fcş\x00fck Yağ Bas. Kontak, Aşırı Hararet Kontak, D\x00fcş\x00fck Su Seviye Kontak,Redresor Arıza,Acil Stop,Yedek-1 Arıza,Yedek-2 Arıza,D\x00fcş\x00fck Yakıt Sev.Kont.";
public const string ShutDownTR547_1 = "D\x00fcş\x00fck Yağ Bas. M\x00fcşir, Aşırı Hararet M\x00fcşir,Jenerat\x00f6r D\x00fcş\x00fck Frekans,Jenerat\x00f6r Y\x00fcksek Frekans,Jenerat\x00f6r D\x00fcş\x00fck Voltaj, Jenerat\x00f6r Y\x00fcksek Voltaj, Marşlama Hatası, D\x00fcş\x00fck Yakıt Sev.M\x00fcşir";
public const string ShutDownTR547_2 = "Undefined Shutdown-16,Undefined Shutdown-17,Undefined Shutdown-18,Y\x00fcksek Ak\x00fc Voltajı, Sarj Alternator Arıza, J1939 ECU Baglanti Alarm,D\x00fcş\x00fck Soğutucu Seviyesi AC,Undefined Shutdown-23";
Это вообще песня... Поскольку по сути это не просто константы, а комбинированные константы, разделенные ",". И для двух языков сразу при одной
нейтральной Culture. За такой код руки вырывают с корнем сразу.Последний раз редактировалось RX1AL; 16.02.2011 в 14:04. Причина: Добавлено сообщение
73! Михаил (OE6MAF) :: HB9/OE6MAF, DL/OE6MAF
-
17.02.2011, 04:07 #7
- Регистрация
- 07.08.2006
- Адрес
- Амурская область
- Возраст
- 70
- Сообщений
- 94
- Поблагодарили
- 7
- Поблагодарил
- 13
Здравствуйте, Михаил. Посмеялся от души, как Вы разносите программеров турецких. Эта программа для мониторинга и управления контроллерами серии DKG от турецкой компании DATAKOM. У нас это используется в резервном источнике электропитания (дизель-генератор YANMAR). В целом программа(хоть и написана криво) с основной задачей справляется: т.е. и мониторит, и управляет. XML-ную часть программы, т.е. перевод надписей под приборами сделал примитивно в AkelPad. Работа с программой понятна, но хотелось, чтобы уж все на русском. Вот последовательно скрины (не все, а только те, что нужны для мониторинга)
С этой программой, похоже, все очень "сильно запущено", в плане существующих правил написания и оптимизации кода. Наверное и PIC-контроллер прошит соответствующим образом. Хотя в программе предусмотрено оперативное изменение различных параметров по их уровням. А также можно слить в файл прошивку, можно из файла залить. Ну, а в-общем, Михаил, Вам большой респект, чувствуется настоящий программер. А я так, чуть-чуть для себя. Еще раз спасибо. 73 de UA0JFY.
PS Скрины последовательно не легли, смотреть 3-1-2Последний раз редактировалось UA0JFY; 17.02.2011 в 04:13.
Александр (UA0JFY)
-
17.02.2011, 06:34 #8
- Регистрация
- 12.03.2007
- Адрес
- Грац, Австрия - Санкт-Петербург, Россия
- Возраст
- 60
- Сообщений
- 1,749
- Поблагодарили
- 374
- Поблагодарил
- 160
UA0JFY:
Александр, тут смеяться то, вообщем нечему - плакать надо... Вас можно в "" поздравить, что связались с Datakom Electronic
Engineering Ltd. Очень знакомая компания, бывали мы у них в Стамбуле не раз. Дело там даже нe в программерах, а в менеджерах
или технических лидерах, как они себя называют. Ни знаний, ничего, но пальцы крутить перед заказчиком - на ура! Правда, были
весьма разочарованы, когда резко обломались. Тоже начали нам "вкручивать", как все здорово у них работает. Потом мы взглянули
на их исходный код - разнесли его в пух и прах всей командой - надо было видеть лица. Естесственно, такое г... покупать никто не
стал. В европах между прочим, тоже самое - плююсь уже который год от здешних программеров (не только студентов) на фирмах.
Тихий ужас! Но оставим лирику, перейдем к прозе. Я ничего не могу сказать про прошивку EEPROM для PIC - всяко может быть,
скорее всего там один турецкий будет. Но вот чего вам делать, реально не знаю. Один путь (правда, затратный по времени
я вижу в полной декомпиляции исходного кода. Черт с ним, что он не оптимизирован - дело десятое! Я просмотрел уже весь код,
там структуры нет вообще, так к слову. На коленке писали. Однако, имея весь исходный код, а он писался на VB.NET 2.0, то есть
достаточно уже старенький (не 3.5 или 4.0), его можно легко превратить в рабочее состояние. Никаких супер-пупер визуальных
контролей там нет. Используются стандартные, плюс пара типов Gauge. Без исходного кода - вы никогда не сможете локализовать
данную программу, а имея исходники - сможете. Бенефит в том, что вы ее и модифицировать сами сможете, а также перевести и
на новую платформу 3.5 или 4.0 (с WPF), если потребуется. Исходники наша группа может вам подготовить в течение месяца. Не
безвозмездно конечно, но договориться всегда по договору можно. Если хотите, то можем заключить договор и на саппорт, а также
на оптимизацию данного кода - ТЗ нам, и в принципе, препятствий нет. Тем более HMI+SCADA для промышленной автоматики,
включая нефть, газ и т.д. - наш (и мой) основной профиль. Решайте. Ответ можно в ЛС, чтобы не забивать топик.
PS Да, особенно убило наповал изменение языка через перезагрузку программы. Это кто же там шибко грамотный такой?
Даже не в курсе, что на дотнете локализация работает давным-давно по принципу on-the-fly (на лету), ничего делать не
надо - одно из серьезных преимуществ перед стандартными прогами с мульти-языковой поддержкой.Последний раз редактировалось RX1AL; 17.02.2011 в 06:42.
73! Михаил (OE6MAF) :: HB9/OE6MAF, DL/OE6MAF
|
Социальные закладки