1

Тема: Переклад вибіркового тексту

Виникла необхідність перекласти мовні файли для сайта. Хотілось би автоматизувати цей процес. Звичайно, перекладач неточний, потім потрібно редагувати, та, всеодно, потрібно це зробити.
Потрібно перекласти текст в лапках зліва від "=>". Переклад відбувається у "Pragma":
1. виділяється текст
2. Ctrl+C
3. Відбувається переклад і результат заноситься у буфер обміну
4. Ctrl+V
5. Виділений текст заміняється
Приклад файла:

Прихований текст

<?php

$lang_poll = array(

'Form legend'    =>    'Опрос',
'Form enable'    =>    'Включить опрос в эту тему',
'Form question'    =>    'Вопрос %d',
'Form choice'    =>    'Ответ %d',

);

Як пробував:
1. Зчитуємо рядка
2. Перевіряємо чи існує символ ">"
3. Якщо так, то
  а. Розділяв на 3 a,b,c: " 'Form legend'    =>    ' "    " Опрос "    " ', "
  б. Середній копіював в Edit1.Text
  в. Edit1.SetFocus; Edit1.SelectAll;
  г. Clipboard.AsText:= Edit1.Text;
      //ShowMessage('1');
  д. Пауза на спрацювання програми перекладач
  е. Edit1.PasteFromClipboard;
  є. b:=Edit1.Text;
  ж. str:=a+b+c;
     //ShowMessage('2');
Тупик... Не получається записати у файл. Чи треба створювати іншого файла
І ще одне: навпряму не працює, тільки із зупинками на ShowMessage('1');
Буду вдячний, якщо хтось допоможе. Вже переклав би вручну, та для чого люди придумали комп'ютери?

2

Re: Переклад вибіркового тексту

vitalica написав:

Тупик... Не получається записати у файл. Чи треба створювати іншого файла

Дивлячись як ви його читаєте.

vitalica написав:

І ще одне: навпряму не працює, тільки із зупинками на ShowMessage('1');

Значить затримку треба більшу зробити. Як варіант зробити кілька затримок, а між ними Application.ProcessMessages.

3

Re: Переклад вибіркового тексту

Ну ось. Файл переписується, переклад іде, та з помилками. Це файл із Application.ProcessMessages;, іде точно, але через один рядок

Прихований текст

<?php

$lang_poll = array(

'Form legend'    =>    '',
'Form enable'    =>    'Включить опрос в эту тему', 
'Form question'    =>    '',
'Form choice'    =>    'Питання %d',
'Form type' => '',
'Form result' => 'Максимальна кількість варіантів вибору відповіді :',

'No question'    =>    '',
'Question too long'    =>    'Немає жодного питання',
'Choice too long'    =>    '',
'Not enough choices'    =>    'Питання %d : Відповідь %d занадто довга',
'Max variant'    =>    '',

А це без. Спочатку пропуски і зміщення, а далі - нормально.

Прихований текст

<?php

$lang_poll = array(

'Form legend'    =>    '',
'Form enable'    =>    '',
'Form question'    =>    'Опитування',
'Form choice'    =>    'Відповідь %d',
'Form type' => 'Максимальна кількість варіантів вибору відповіді :',
'Form result' => 'Приховати результат голосування до %d голосів',

'No question'    =>    'Немає жодного питання',
'Question too long'    =>    'Питання %d занадто довге',
'Choice too long'    =>    'Питання %d : Відповідь %d занадто довга',
'Not enough choices'    =>    'Питання %d : Відповідей повинно бути не менше двох',

Даю код:

Прихований текст

procedure TForm1.Button2Click(Sender: TObject);
var
  f: TextFile;
  mas:array of String;
  fname,a,b,c:String;
  znak,n,m,l: integer;
begin
   n:=0;
  fname:=Edit1.Text;
  fname:='1/poll1.php';
  SetLength(mas, 400); //Виділяємо пам'ять для масива

  if FileExists(fname) then begin //якщо файл існує
  AssignFile(f, fname);
  Reset(f); //приготувати для читання
    While not Eof(f) do begin
      ReadLn(f, mas[n]);   //створюємо масив
      Inc(n); //кількість елементів масива
    end;
  CloseFile(f); //Закриваємо файл
  end;

  AssignFile(f, fname);
  Rewrite(f); //приготувати для перезапису
  for m:=0 to n do begin
  znak:=Pos('>',mas[m]);

    if znak=0 then begin
      mas[m]:=mas[m];
    end
    else if znak<>0 then begin
      l:=Length(mas[m]);
      a:=Copy(mas[m],1,znak+2);
      b:=Copy(mas[m],znak+3,l-znak-4);
      c:=Copy(mas[m],l-1,2);

      Edit1.Text:=b;
      Edit1.SetFocus;
      Edit1.SelectAll;
      //Application.ProcessMessages;
      Clipboard.AsText:= Edit1.Text;
      Sleep(2000);
      Edit1.PasteFromClipboard;
      b:=Edit1.Text;
      mas[m]:=a+b+c;
    end;
      Append(f);
      WriteLn(f, mas[m]);
  end;
  CloseFile(f); //Закриваємо файл
end;

4

Re: Переклад вибіркового тексту

Схоже, іноді не встигає за 2 секунди. Зробіть якось так (ліньки дивитися, як правильно, тому скористаюся вашими напрацюваннями):

var oldText : string;
...
oldText := Edit1.Text;
Clipboard.AsText := oldText;
repeat
  Sleep(100);
  Edit1.PasteFromClipboard;
until oldText <> Edit1.Text;

І не забувайте про теги code!

Подякували: Torbins1

5 Востаннє редагувалося Chemist-i (09.05.2014 23:24:59)

Re: Переклад вибіркового тексту

vitalica
Для дельфі:

FileMode := fmOpenReadWrite;

Чи гляньте яке вам підійде
після AssignFile зразу.
Тут.
А це з офіційної доки.

6

Re: Переклад вибіркового тексту

Нічого не виходить автоматом. Тільки із зупинками на ShowMessage('1');. Зато працює чітко. Якщо нічого іншого не придумаю, то скористаюсь цим способом. Все-таки, програма одноразова, але хотілося б "розкусити цей горіх".

          ...
      Edit1.Text:=b;
      Edit1.SetFocus;
      Edit1.SelectAll;

      Clipboard.AsText:= Edit1.Text;
          //Sleep(3000);
      ShowMessage('1');
      Edit1.PasteFromClipboard;

      b:=Edit1.Text;
      mas[m]:=a+b+c;
      ShowMessage(mas[m]);
    end;

      Append(f);
      WriteLn(f, mas[m]);
  end;
  CloseFile(f); //Закриваємо файл
end;