MSI Lab - Форум по русификации
Основные форумы => RusMe - РусМи! => Тема начата: Archiv@rius_31 от 05 Июля 2009, 21:12:55
-
Всем здравствуйте. Занялся переводом программы FarStone VirtualDrive 11, первую, ресурсную, часть перевода выполнил без особых трудностей, а на русификации веб-интерфейса немного застрял.
Так, при редактировании xml-файлов, содержащих нужные строки, вместо русского текста в программе видна казя-базя с китайскими иероглифами. При изменении кодировки в заголовке файла символы меняются, но русского текста по прежнему не видно. Сохранение самого файла в другой кодировке тоже особых результатов не дает. Как быть? Пробовал utf-8, utf-16, cp1251, iso 8859-5, бесполезно.
xml-файл и снимок части окна программы в прикрепленном архиве.
-
Сегодня примерно час убил чтоб разобраться - ни в какую не поддается. Я думаю дело в каком-нибудь веб-компоненте, отвечающем за отрисовку меню, в котором нет поддержки кирилицы в принципе. Плюс там очень много скриптов, может в них надо где-то принудительно эту кодировку вписать? Я с HTML дружу, и в них вроде все в порядке, а вот со скриптами не очень.
-
Вчера все-таки решил, поставил себе на вторую винду глючную 10 версию (чем, правда, изрядно искалечил систему) и русифицировал русификатором от Dr.Ross с бэкапом файлов. Среди русифицированных библиотек там был один xml-файл, и в программе все строки из него отображались корректно. Файл был русифицирован и сохранен в формате utf-8. Попробовал сделать также на 11 версии - не прокатило. Может поддержка русской кодировки отсутствует в самом exe-шнике(ах)? Как это узнать? И если да, то как пропатчить?
Со скриптами я и сам не дружу, хотя открывал их вчера - вроде бы текстов, напоминающих названия кодировок, не нашел.
А вообще, как эту кодировку там поставить, если можно это сделать?
-
Может поддержка русской кодировки отсутствует в самом exe-шнике(ах)? Как это узнать? И если да, то как пропатчить?
Скорее всего не в этом причина. Я так понял, что остальное всё нормально переводится и поддерживается кроме этого меню?! Значит экзешник поддерживает кириллицу, а иначе бы всё остальное тоже было бы иероглифами. Скорее всего где-то в скриптах надо копать.
-
Да, все перевелось нормально. Более того, начал переводить аналогичный строчный xml в другой папке - все отображается корректно.
В скриптах не знаю, где копать, где нужный скрипт лежит, хотя подозреваю, что лежит он в папке в папке mainui\js
На всякий случай прикрепляю архив со скриптами.
Поиском найти в файлах ссылку на требуемый reg0409.xml не получилось - вероятно, зашито в программном коде. Может быть, только если с помощью каких-нибудь утилит поискать... Но имеет ли смысл?
-
Archiv@rius_31
Попробуй этот командник. Он заменяет кодовые страницы в реестре, меняет шрифты на способные к кириллице и сразу же перезагружает систему
-
Попробуй этот командник. Он заменяет кодовые страницы в реестре, меняет шрифты на способные к кириллице и сразу же перезагружает систему
С кодировкой в системе и так у меня вроде бы все в порядке. Но все равно запустил. Не помогло. По прежнему тарабарщина.
-
А может ли быть проблема в файле webmenu.ocx? Еще при ресурсном переводе заметил в нем значки, которые в меню вырисовываются. И рисуночек самого меню есть там, правда в англицком варианте. Зачем - неизвестно.
-
Я на этот файл сразу внимание обратил, из-за имени. Эксперименты с ним результата не дали, и вообще, как я понял он вроде отвечает за меню в трее.
-
shkiper, наверное, нет. Переименовал webmenu.ocx, запустил uiframe.exe - выдал ошибку скрипта в файле main.htm, окно виртуалки не загрузилось, несмотря на то, что процесс продолжал висеть. Тем не менее, значок в панели задач появился вместе с работающим меню.
Буду пока копать main.htm и скрипты, с ним связанные.
Покопал. Вот какой фрагмент скрипта нашел непосредственно в тексте веб-страницы:
//////////////////////////////////////// Globle var for top menu
var sdObj = document.createElement("div")
var menuUpObj = null;
var submenuIsOpen = false;
var currentOpenedTopMenuButton = null;
var fffa;
var globeTopMenuListArray;
fffa=getCloseTopMenuFunction(null);
//////////////////////////////////////// Globle var for top menu end
//add menu list into array
var topMenuListArr=new Array();
//topMenuListArr.push(document.getElementById("[color=#9932CC][i]fileTopMenu[/i][/color]"));
//topMenuListArr.push(document.getElementById("[color=#9932CC][i]toolsTopMenu[/i][/color]"));
//topMenuListArr.push(document.getElementById("[color=#9932CC][i]helpTopMenuA[/i][/color]"));
globeTopMenuListArray = topMenuListArr;
//add menu list into array finish
for (i=0;i<topMenuListArr.length;i++) {
//set every menu mouseover effect
topMenuListArr[i].onmouseover=function() {
isMove=false;
this.style.backgroundColor="#316AC5";
this.style.color="#ffffff";
if(submenuIsOpen) {
try {
currentOpenedTopMenuButton.style.backgroundColor="";
currentOpenedTopMenuButton.style.color="#000000";
currentOpenedTopMenuButton=null;
menuUpObj.style.visibility="hidden";
sdObj.style.visibility="hidden";
}
catch(e){}
iniTopMenu(this);
}
}
//set every menu mouseout effect
topMenuListArr[i].onmouseout=function() {
if (!submenuIsOpen) {
isMove=true;
this.style.backgroundColor="";
this.style.color="#000000";
}
}
}
////////////////////////////////////////////////////////////////
По запросу "fileTopMenu" наткнулся на файл main_only.js с таким вот участком скрипта:
[code]////////////////////webmenu function//////////////////////////////////////
function iniTopMenu(clickedObj)
{
currentOpenedTopMenuButton=clickedObj;
var menuTopLevelObj=document.getElementById(clickedObj.submenuid);
menuUpObj=menuTopLevelObj
appendedTopItem=clickedObj;
//alert(menuTopLevelObj.clientWidth)
menuTopLevelObj.style.left=-clickedObj.clientWidth+"px";
sdObj.className=("menushadow")
sdObj.style.height=menuTopLevelObj.clientHeight+"px";
sdObj.style.width=menuTopLevelObj.clientWidth+"px";
sdObj.style.top=(parseInt(menuTopLevelObj.offsetTop)+4)+"px";
sdObj.style.left=(parseInt(menuTopLevelObj.offsetLeft)+4)+"px";
clickedObj.parentNode.appendChild(sdObj);
menuTopLevelObj.style.visibility="visible";
sdObj.style.visibility="visible";
//alert(menuTopLevelObj.visibility)
var subMenuArr=menuTopLevelObj.childNodes;
for (i=0;i<subMenuArr.length;i++) {
subMenuArr[i].onmouseover=function() {
isMove=false;
var thisMenuSubListArr=this.parentNode.childNodes;
for (i=0;i<thisMenuSubListArr.length;i++) {
if (thisMenuSubListArr[i].className=="upMenuStyle") {
thisMenuSubListArr[i].style.backgroundImage="url(images/topMenuDiv.jpg)";
}
thisMenuSubListArr[i].style.backgroundColor="";
thisMenuSubListArr[i].style.color="#000000";
}
if (this.className=="upMenuStyle") {
this.style.backgroundImage="none";
}
this.style.backgroundColor="#316AC5";
this.style.color="#ffffff";
}
subMenuArr[i].onmouseout=function() {
isMove=true;
if (this.className=="upMenuStyle") {
this.style.backgroundImage="url(images/topMenuDiv.jpg)";
}
this.style.backgroundColor="";
this.style.color="#000000";
}
subMenuArr[i].onclick=function() {
menuFireEvent(this.iid)
}
}
submenuIsOpen=true;
}
function appendSubmenu(clickedObj) {
setTimeout(clickTimeout(clickedObj),20)
}
function clickTimeout(obj) {
return function() {
iniTopMenu(obj);
}
}
//submenu click
function menuFireEvent(id) {
fffa();
alert(id);
// if (id==11) {
// window.external.OnClose();
// }
// if (id==21) {
// if (window.external.IsPendClose()==true) {
// return;
// }
// clickNavButton(1);
// }
// if (id==22) {
// if (window.external.IsPendClose()==true) {
// return;
// }
// clickNavButton(6);
// }
// if (id==23) {
// if (window.external.IsPendClose()==true) {
// return;
// }
// clickNavButton(5);
// }
// if (id==31) { }
// if (id==34) {
// var isDoingThing=window.external.IsPendClose()
// window.external.PendClose(false);
// window.external.Navigate("mainui/about.htm",320,420);
// }
}
function closeTopSubNenu() {
if (currentOpenedTopMenuButton==null) {
return;
}
var parentMenuObj=document.getElementById(currentOpenedTopMenuButton.submenuid);
if (parentMenuObj==null) {
return;
}
var listArray1=parentMenuObj.childNodes;
for(i=0;i<listArray1.length;i++) {
if (listArray1[i].style.backgroundColor=="") { continue; }
listArray1[i].style.backgroundColor="";
listArray1[i].style.color="#000000";
if (listArray1[i].className=="upMenuStyle") {
listArray1[i].style.backgroundImage="url(images/topMenuDiv.jpg)";
}
}
currentOpenedTopMenuButton.style.backgroundColor="";
currentOpenedTopMenuButton.style.color="#000000";
currentOpenedTopMenuButton=null;
menuUpObj.style.visibility="hidden";
sdObj.style.visibility="hidden";
submenuIsOpen=false;
}
function showFileMenu() {
if(currentOpenedTopMenuButton!=null) { closeTopSubNenu(); }
var fileMenuTopObj=document.getElementById("fileTopMenu");
fileMenuTopObj.focus();
currentOpenedTopMenuButton=fileMenuTopObj;
submenuIsOpen=true;
fileMenuTopObj.style.backgroundColor="#316AC5";
fileMenuTopObj.style.color="#ffffff";
setTimeout(clickTimeout(fileMenuTopObj),20)
}
function showToolsMenu() {
if(currentOpenedTopMenuButton!=null) { closeTopSubNenu(); }
var toolsMenuTopObj=document.getElementById("toolsTopMenu");
toolsMenuTopObj.focus();
currentOpenedTopMenuButton=toolsMenuTopObj;
submenuIsOpen=true;
toolsMenuTopObj.style.backgroundColor="#316AC5";
toolsMenuTopObj.style.color="#ffffff";
setTimeout(clickTimeout(toolsMenuTopObj),20)
}
function showHelpMenu() {
if(currentOpenedTopMenuButton!=null) { closeTopSubNenu(); }
var helpMenuTopObj=document.getElementById("helpTopMenuA");
helpMenuTopObj.focus();
currentOpenedTopMenuButton=helpMenuTopObj;
submenuIsOpen=true;
helpMenuTopObj.style.backgroundColor="#316AC5";
helpMenuTopObj.style.color="#ffffff";
setTimeout(clickTimeout(helpMenuTopObj),20)
}
////////////////////webmenu function//////////////////////////////////////
Вопрос: куда дописывать команды, задающие кодировку?
-
Для вашего случая статья:
http://www.javaportal.ru/java/articles/rus...s/ruschars.html (http://www.javaportal.ru/java/articles/ruschars/ruschars.html)
-
Статья не помогла. Искал в файлах поисковиком указанные команды - не нашел. Может быть, существуют какие-нибудь вариации?
Можно было бы, конечно, попытаться принудительно перекодировать - только не знаю, куда и в какое место вставлять нужные команды - в яваскриптах я чайник. Ни в одном скрипте не нашел прямую ссылку на требуемый xml-файл. Нет их и в main.htm.
Может быть, только если попробовать поставить, например, немецкую версию со знаками диакритики, может быть в тех скриптах строчка перекодировки будет?
Не хотелось бы, оставлять меню непереведеным или nuCATb AHI'/|uuCKuMu bYKBAMu.
Как быть? помогите плз!
-
Кое-что нашел в main.htm
var isMove = true;//vindow move flag
document.body.onload=function()
{
//var showpage=globalset.GetShowPageSetting();
//alert(showpage);
//jumpFlag(2);
//if(showpage==0)
//{
//jumpFlag(1);
//changeMenu(1);
//}
//else if(showpage==1)
//{
jumpFlag(2);
//changeMenu(0);
//}
//Marktest.WhetherShow(32707,0);
var version=langobj.GetVersionSign(window.external.GetProductID());
//alert(version);
var prodlang = langobj.GetInstallLanguage(window.external.GetProductID()).toString(16);
if(version!=0)
{
//Marktest.WhetherShow(34, 0);
//Marktest.UpdateItemState(32,0,0);
Marktest.InitWebMenu("WMRes0" + prodlang + ".xml");
}
else
{
//Marktest.WhetherShow(34, 1);
//Marktest.UpdateItemState(32,0,1);
Marktest.InitWebMenu("reg0" + prodlang + ".xml");
}
menuFocus(1);
$("menuflag_1").attachEvent("onclick",menuhit1);
$("menuflag_2").attachEvent("onclick",menuhit2);
$("menuflag_3").attachEvent("onclick",menuhit3);
$("menuflag_4").attachEvent("onclick",menuhit4);
$("top_vcdlibary").attachEvent("onclick",tophit2);
$("top_flist").attachEvent("onclick",tophit1);
window.external.SetBroWindowPos(-1,-1,778,572,0x40);
if(langid!=2052&&langid!=1033&&langid!=1028)
{
$("menuflag_4").style.display="none";
}
showui();
}
Пробовал подставить вот это:
String s = baos.toString();
и это
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class CharsetFilter implements Filter
{
// кодировка
private String encoding;
public void init(FilterConfig config) throws ServletException
{
// читаем из конфигурации
encoding = config.getInitParameter("requestEncoding");
// если не установлена - устанавливаем Cp1251
if( encoding==null ) encoding="Cp1251";
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
throws IOException, ServletException
{
request.setCharacterEncoding(encoding);
next.doFilter(request, response);
}
public void destroy(){}
}
<!--CharsetFilter start-->
<filter>
<filter-name>Charset Filter</filter-name>
<filter-class>CharsetFilter</filter-class>
<init-param requestEncoding='Cp1251'/>
</filter>
<filter-mapping>
<filter-name>Charset Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--CharsetFilter end-->
- пока не получилось.
Может быть есть еще какие-нибудь варианты?
-
Тема перемещена в новый форум, специально созданный для решения подобных проблем.
-
Слава Богу!!! Перевел!!!
Русифицировать получилось не совсем обычным, но в то же время довольно простым (хотя мне до сих пор не совсем понятным из-за поведения...) способом. Обо всем по порядку.
Одно хочу сказать: скрипты тут были ни при чем. Как я и предполагал насчет версии с другим языком, помогла французская версия. После ее установки на свежую систему обнаружил в одном из пунктов меню букву "й". Заинтересовался, ибо не должно такой буквы быть во французском языке . Полез в языковой xml. Там эта же буква спокойненько так себе стояла, никого не трогая... К слову, сам xml-файл редактор AkelPad открыл с кодировкой Windows-1251. После замены строк и сохранения "французского" файла в той же кодировке в программе отобразилось нормальное русскоязычное меню. Оставалось только то же самое проделать с файлом для триальной версии и заменить "тарабароязычные" файлы.
Проделал. Заменил. Перезагрузился. Все заработало.
Непонятно только одно: и англоязычный и франкоязычный файлы редактор открывал в русской кодировке. В той же и сохранял, причем строка "<?xml version="1.0" encoding="UTF-8"?>" нигде не затрагивалась. Так почему английские файлы стали выдавать тарабарщину, а французские отобразили нормальную кириллицу? Загадка.
-
Вот нашел интересный сабж по этому поводу: http://www.opennet.ru/openforum/vsluhforumID9/5979.html (http://www.opennet.ru/openforum/vsluhforumID9/5979.html).
-
Последний вопрос касаемо этой программы (топик вроде бы ей посвящен, поэтому создавать новый не хочу) - русифицировал все, но в главном окне названия каталогов Cabinet, Music, Movies, Games и Software остались на английском языке. Ни в одном файле таких строк Тоталом не нашел. Radialix отображает в проекте жестко-закодированные строки, но слов этих там не находит. В ресурсной части все в порядке - переведено. В принципе, можно оставить так как есть, только в некоторых сообщениях упоминание этих каталогов идет на русском языке. Посоветуйте, как можно русифицировать эти строки и откуда их выдернуть?
(2administrators: если можно, переименуйте, пожалуйста, тему в FarStone VirtualDrive Pro v11.7)
-
В жестко-закодированных мне довольно часто встречались разрезанные фразы и слова. Например, в одной строчке "Soft", а в другой "ware". Может это тот самый случай. Второй вариант - они где-то в виде картинок лежат. И третий - как в ACDSee - у нее список каталогов после установки на русский не переводится. Поэтому поставь программу на чистой системе и замени файлы на русские до запуска. Если все будет на русском - это третий вариант. Если же нет - один из первых двух или вообще неизвестный мне
-
Скорее всего, информация о них заложена в реестре или в файлах конфигурации этой программы в каталоге Roaming. Сто пудова, поскольку эти папки можно переименовывать.
На успешный поиск вас могут вывести эти файлы:
[WIN9X]
fcdabus.inf=%Inf%\fcdabus.inf
FCDABUS.vxd=%System%\FCDABUS.vxd
fvdscsi.inf=%Inf%\fvdscsi.inf
fvdscsi.mpd=%Drivers%\fvdscsi.mpd
VDI08X.dat=%System%\VDI08X.dat
VPlay801.exe=%Windows%\VPlay801.exe
Driver.ico=%Windows%\Driver.ico
[WINNT]
fvdscsi.inf=%Inf%\fvdscsi.inf
fvdscsi.sys=%Drivers%\fvdscsi.sys
VDI08X.dat=%System%\VDI08X.dat
VPlay801.exe=%Windows%\VPlay801.exe
Driver.ico=%Windows%\Driver.ico
[WIN2KXP]
Fcdabus.inf=%Inf%\Fcdabus.inf
fcdabus.sys=%Drivers%\fcdabus.sys
Fvdscsi.inf=%Inf%\Fvdscsi.inf
fvxscsi.sys=%Drivers%\fvxscsi.sys
VDI08X.dat=%System%\VDI08X.dat
Driver.ico=%Windows%\Driver.ico
fcdabus.cat=%Inf%\fcdabus.cat
Fvdscsi.cat=%Inf%\Fvdscsi.cat
-
shkiper, VIPer, спасибо. Это был третий случай. Нашел в папке «%USERPROFILE%\Application Data\FarStone\VirtualDrive\Data Files\ два файла: VCDList.dat и VCDList.dat.bak, в которых WinHEX-ом обнаружил англоязычные строки. Правда, замена их русскими в VCDList.dat не помогла, однако после удаления этих двух файлов и перезапуска программы названия русифицировались. Правда, содержимое Каталога оказалось стертым, но, думаю, даже если бы я перекопал все два файла и результат получился бы нормальным, на машине конечного пользователя пропатчить эти файлы вряд ли удалось бы - ибо Каталоги у каждого свои, и CRC файлов тоже различны. Поэтому просто указал в мануале к русификатору о необходимости (если надо) удаления этих файлов.
Русификатор собрал и выложил. Тестируйте!
_____________
Всем огромное спасибо!
-
Опубликовано:
Русификатор VirtualDrive 11.7 pro от Archiv@rius_31
http://msilab.net/rus.5353 (http://msilab.net/rus.5353)
-
Archiv@rius_31,
Проблемма решена, но вот нашёл второе простое решение.
Решение проблеммы с кодировкой. При анализе файла reg0409.xml и reg0407.xml в строке <parameter indexno="13" ResFlag="0"></parameter> последнего указан параметр ResFlag="0", а у первого указан параметр ResFlag="950". При замене "950" на "0" русские буквы отображаются нормально.
Да и есчо. Сохранить файл нужно в кодировке "Windows-1251". И открывать также.