Russian Qt Forum
Ноябрь 22, 2024, 21:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: получить ts из qm?  (Прочитано 15303 раз)
Hellenna
Гость
« : Апрель 05, 2005, 14:30 »

можно ли как-нибудь сделать сабж?
Спасибо.
Записан
Sergeich
Гость
« Ответ #1 : Апрель 05, 2005, 15:24 »

Если qm генерен с помощью Qt 2.x можно применить утилиту qm2ts.
Записан
Hellenna
Гость
« Ответ #2 : Апрель 05, 2005, 20:23 »

Цитата: "Sergeich"
Если qm генерен с помощью Qt 2.x можно применить утилиту qm2ts.

это я знаю, но у меня qm сденный Qt 3.x.x.
можно как-нибудь по другому?
Записан
Sergeich
Гость
« Ответ #3 : Апрель 06, 2005, 14:01 »

Попробуй через QTranslator::load(), QTranslator::messages(), а после преобразовать QTranslatorMessage в XML
Записан
Twin
Гость
« Ответ #4 : Май 16, 2005, 12:39 »

Доброго всем дня!

Простите меня не грамотного, возникла ситуация.
Нужно русифицировать один QM файлик.
3 часа поисков в инете хоть какой нибудь утилиты неувенчались успехом, чисто случайно нашёл переписку в этом форуме.

Исходя из этого сообщения

Цитата: "Sergeich"
Попробуй через QTranslator::load(), QTranslator::messages(), а после преобразовать QTranslatorMessage в XML

я могу qm конвертнуть в ts, перевести его на русский, а потом опять создать qm.

Немоглибы вы описать всю эту процедуру детально?
Как чем и где?

Заранее спасибо.
Записан
Sergeich
Гость
« Ответ #5 : Май 16, 2005, 15:33 »

Как я понял у тебя есть qm-файл к приложению, которое поставляется без исходников( скорее всего под винды, под Linux почти всегда есть исходники ). У тебя два варианта :
1. Достать исходники ( если это возможно ) и сгенерить ts файл из них.
2. Сгенерить ts файл из qm. ИХМО, судя по доке к QTranslator это возможно. Для этого придеться разобраться с форматом ts и написать небольшую прогу. Поскольку форматы qm и ts зависят от версии
тебе надо узнать версию QT на которой написано данное приложение.
Записан
Sergeich
Гость
« Ответ #6 : Май 16, 2005, 20:41 »

Я тут покопался в кутовых исходниках, и понял что сделать сабж можно только в 2 случаях:
1. Приложение создано в QT2
2. Приложение создано в QT3 и lrelease запускался с экзотической опцией -nocompress.
 Так что добавить или изменить перевод, не имея ts файла невозможно Грустный , за исключением описанных случаев.
Записан
Twin
Гость
« Ответ #7 : Май 17, 2005, 08:00 »

Спасибо за ответ.  Веселый
Так точно, есть qm виндового приложения Kerio WinRoute Forewall 6.0.9, исходников к сожалению нет и никто их мне не даст :cry: .
А перевести его, ну очень хочется.
Так что, если есть такая возможность, то буду биться головой об стену, плясать с бубном около компа, но сделаю...
К сожалению я не программер и несовсем всё понимаю...

Как узнать версию qt которым генерился qm?
Записан
Sergeich
Гость
« Ответ #8 : Май 17, 2005, 13:52 »

Если приложение честно куплено  Веселый  можешь попросить ts файл у разработчика, вряд ли они будут жаться.
  С приложением должна поставляться dll-ка типа qt-mt???.dll ( если конечно его не скомпилили статически  ). Три цифры после mt и есть версия Qt.
Записан
Twin
Гость
« Ответ #9 : Май 20, 2005, 05:45 »

Да, есть такая DLL.
Теперь понятно....
На врятли они дадут ts  :?
Записан
i9
Гость
« Ответ #10 : Июль 15, 2005, 18:43 »

Делал недавно утилзу для получения ts из компресированных qm (под линуховый телефон, там в qm был перевод английского в английский)
может кто разберет (запускается баш файл, тот компилит срр, из каталога берет qm файлы, скармливает их бинарнику - на выходе ts):

rmzeros.cpp:
Код:

#include <fstream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define MAXN 5000

using namespace std;


main(int argc, char **argv){
  char *forms[MAXN];//массив названий форм
  char *strs[MAXN];//массив названий слов
  int idform[MAXN];//индекс в forms
  int other_forms;//номер скоторого формы в forms[] попадают под 'other'
  char str[250];//буфер для слова
  char form[250];//буфер для формы
  int stri=0;//текущий символ в слове
  int formi=0;//текущий символ в форме
  int count_str=0;//кол-во слов
  int count_form=0;//кол-во форм

//очистка массивов
  for(int i=0;i<MAXN;i++){
    forms[i]=NULL;
    strs[i]=NULL;
    idform[i]=0;
    other_forms=0;
    str[i]=0;
    form[i]=0;
  }


  int cntF=0,cntW=0,flagEndForms=-1,last=0;
  unsigned char c=0,c1=0,c2=0,c3=0;

  while(read(0,&c,1)){
    if(flagEndForms>=0){//получение конечных форм
      if((c>='0' && c<='9') || (c>='a' && c<='z') || (c>='A' && c<='Z') || c=='_'){
          form[formi]=c;
          form[formi+1]=0;
          formi++;
      }else{
        if(formi>5 && last==strlen(form)){
          forms[count_form]=strdup(form);
          count_form++;
        }
        formi=0;
        last=c;//Последний не буквенный символ, если мы нашли то, что искали, то он равен длине
      }
      continue;
    }

    if(cntF>0){//чтение формы
      form[formi]=c;
      formi++;
      cntF--;
      if(cntF==0){//конец формы
        form[formi]=0;
        forms[count_form]=strdup(form);
        idform[count_str-1]=count_form;
        count_form++;
      }
    }

    if(cntW>0){//чтение слова
      cntW--;
      if(c && c!=38){
        str[stri]=c;
        stri++;
      }
      if(cntW==0){//конец слова
        str[stri]=0;
        strs[count_str]=strdup(str);
        idform[count_str]=-1;
        count_str++;
      }
    }

    if(cntF==-1){cntF=c;formi=0;}
    if(cntW==-1){cntW=c;stri=0;}
    if((c3==7)&&(c2==0)&&(c1==0)&&(c==0))cntF=-1; //далее форма
    if((c3==3)&&(c2==0)&&(c1==0)&&(c==0))cntW=-1; //далее слово
    if((c3==151)&&(c2==0)&&(c1==0)&&(c==0) || (c3==1)&&(c2==0xF7)&&(c1==0)&&(c==0 || c==1) || (c3==151)&&(c2==0)&&(c1==1)&&(c==0)) {
      flagEndForms=count_form;
      form[0]=0;
      formi=0;
    }
    c3=c2; c2=c1; c1=c;//сдвиг
  }
//  print

for(int i=0;i<count_form;i++)
  if(i>=flagEndForms) printf("= %s\n",forms[i]);
  else  printf("  %s\n",forms[i]);
for(int i=0;i<count_str;i++)
  printf("s [%d]\t%s\n",idform[i],strs[i]);


  ofstream f("tmp.ts", ios::app);
  f << "<!DOCTYPE TS><TS>" << endl;
  for(int i=0;i<count_str;i++){
    f << "<context>" << endl;
    if(idform[i] != -1) f << "\t<name>" << forms[idform[i]] << "</name>" << endl;
    else{
printf("flagEndForms [%d]\n",flagEndForms);
      f << "\t<name>" << forms[flagEndForms] << "</name>" << endl;
      if( flagEndForms<count_form-1 ) flagEndForms++;
    }
    f << "\t<message>" << endl;
    f << "\t\t<source>" << strs[i] << "</source>" << endl;
    f << "\t\t<translation type=\"unfinished\">" << "</translation>" << endl;
    f << "\t</message>" << endl;
    f << "</context>" << endl;
  }
  f << "</TS>" << endl;
  f.close();

//очистка массивов
  for(int i=0;i<MAXN;i++){
    free(forms[i]);
    free(strs[i]);
  }
}


Код:

#!/bin/sh

rm -f rmzeros
g++-3.3 rmzeros.cpp
mv a.out rmzeros

dir=qm

rm -r $dir"_ts"/*
rm -r $dir"_qm"/*
rm -r $dir"_log"/*
mkdir $dir"_ts"
mkdir $dir"_qm"
mkdir $dir"_log"

list=`ls -1 $dir ; echo /`

while [ "$list" != "/" ] ; do
  fname=${list%%
*}
  list=${list#*
}
  echo $fname
  mkdir $dir"_ts"/$fname
  cat $dir/$fname | ./rmzeros >> $dir"_log"/$fname.log
  cp tmp.ts $dir"_ts"/$fname/$fname.ts
  /usr/lib/qt3/bin/lrelease $dir"_ts"/$fname/$fname".ts" -qm $dir"_qm"/$fname
  rm tmp.ts
  echo "#!/bin/bash" > $dir"_ts"/$fname/zzz
  echo ""            >> $dir"_ts"/$fname/zzz
  echo "/usr/lib/qt3/bin/linguist "$fname.ts >> $dir"_ts"/$fname/zzz
  echo "/usr/lib/qt3/bin/lrelease "$fname.ts" -qm "$fname >> $dir"_ts"/$fname/zzz
  chmod 777 $dir"_ts"/$fname/zzz
done


rm -f rmzeros

ЗЫ не знаю куда тут прикреплять файлы, да и можно ли, если не получится разобраться - постараюсь выслать файлики...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 20.