Русские субтитры: Заполнение пустых субтитров - Русские субтитры

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Заполнение пустых субтитров

#1 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 17 Апрель 2007 - 02:25

Не совсем понимаю необходимость данного шедевра, посему приведу комментарий автора:

Цитата

1/ I usually set the initial and final times of all my subtitles before I write them because it's much quicker this way. But you can't save empty subtitles in SW, so you have to fill all your subtitles with at least one character.

2/There's no limitation in the number of characters.

So, I've written this script which fills all your empty subs with the maximum number of characters you're allowed to use. It's based on a 18 characters/sec limit with 0,72 sec minimum length and 5 sec as maximum length. 2 lines max with 37 characters each for the longest subs. But of course you can change the values.





// Fill empty subtitles with maximum number of characters. Made by Malmoth 2007.03.22. Debugged by Tengo.

program FillEmptyLines;

// -----------------------------------------------------------------------------

var
  n: Integer;
  i: Integer;
  j: Integer;

  t: String;


begin
  n := GetSubtitleCount;
  
  for i := 0 to n - 1  do
  begin

	j := GetSubtitleFinalTime(i)-GetSubtitleInitialTime(i);

	if j <= 719 then t:='too short'
	else if ((j >= 720) and (j <= 749)) then t:='13 characters'
	else if ((j >= 750) and (j <= 805)) then t:='14 characters'
	else if ((j >= 806) and (j <= 861)) then t:='15 characters'
	else if ((j >= 862) and (j <= 916)) then t:='16 characters'
	else if ((j >= 917) and (j <= 972)) then t:='17 characters'
	else if ((j >= 973) and (j <= 1027)) then t:='18 characters'
	else if ((j >= 1028) and (j <= 1083)) then t:='19 characters'
	else if ((j >= 1084) and (j <= 1138)) then t:='20 characters'
	else if ((j >= 1139) and (j <= 1194)) then t:='21 characters'
	else if ((j >= 1195) and (j <= 1249)) then t:='22 characters'
	else if ((j >= 1250) and (j <= 1305)) then t:='23 characters'
	else if ((j >= 1306) and (j <= 1361)) then t:='24 characters'
	else if ((j >= 1362) and (j <= 1416)) then t:='25 characters'
	else if ((j >= 1417) and (j <= 1472)) then t:='26 characters'
	else if ((j >= 1473) and (j <= 1527)) then t:='27 characters'
	else if ((j >= 1528) and (j <= 1583)) then t:='28 characters'
	else if ((j >= 1584) and (j <= 1638)) then t:='29 characters'
	else if ((j >= 1639) and (j <= 1694)) then t:='30 characters'
	else if ((j >= 1695) and (j <= 1749)) then t:='31 characters'
	else if ((j >= 1750) and (j <= 1805)) then t:='32 characters'
	else if ((j >= 1806) and (j <= 1861)) then t:='33 characters'
	else if ((j >= 1862) and (j <= 1916)) then t:='34 characters'
	else if ((j >= 1917) and (j <= 1972)) then t:='35 characters'
	else if ((j >= 1973) and (j <= 2027)) then t:='36 characters'
	else if ((j >= 2028) and (j <= 2083)) then t:='37 characters'
	else if ((j >= 2084) and (j <= 2138)) then t:='38 characters'
	else if ((j >= 2139) and (j <= 2194)) then t:='39 characters'
	else if ((j >= 2195) and (j <= 2249)) then t:='40 characters'
	else if ((j >= 2250) and (j <= 2305)) then t:='41 characters'
	else if ((j >= 2306) and (j <= 2361)) then t:='42 characters'
	else if ((j >= 2362) and (j <= 2416)) then t:='43 characters'
	else if ((j >= 2417) and (j <= 2472)) then t:='44 characters'
	else if ((j >= 2473) and (j <= 2527)) then t:='45 characters'
	else if ((j >= 2528) and (j <= 2583)) then t:='46 characters'
	else if ((j >= 2584) and (j <= 2638)) then t:='47 characters'
	else if ((j >= 2639) and (j <= 2694)) then t:='48 characters'
	else if ((j >= 2695) and (j <= 2749)) then t:='49 characters'
	else if ((j >= 2750) and (j <= 2805)) then t:='50 characters'
	else if ((j >= 2806) and (j <= 2861)) then t:='51 characters'
	else if ((j >= 2862) and (j <= 2916)) then t:='52 characters'
	else if ((j >= 2917) and (j <= 2972)) then t:='53 characters'
	else if ((j >= 2973) and (j <= 3027)) then t:='54 characters'
	else if ((j >= 3028) and (j <= 3083)) then t:='55 characters'
	else if ((j >= 3084) and (j <= 3138)) then t:='56 characters'
	else if ((j >= 3139) and (j <= 3194)) then t:='57 characters'
	else if ((j >= 3195) and (j <= 3249)) then t:='58 characters'
	else if ((j >= 3250) and (j <= 3305)) then t:='59 characters'
	else if ((j >= 3306) and (j <= 3361)) then t:='60 characters'
	else if ((j >= 3362) and (j <= 3416)) then t:='61 characters'
	else if ((j >= 3417) and (j <= 3472)) then t:='62 characters'
	else if ((j >= 3473) and (j <= 3527)) then t:='63 characters'
	else if ((j >= 3528) and (j <= 3583)) then t:='64 characters'
	else if ((j >= 3584) and (j <= 3638)) then t:='65 characters'
	else if ((j >= 3639) and (j <= 3694)) then t:='66 characters'
	else if ((j >= 3695) and (j <= 3749)) then t:='67 characters'
	else if ((j >= 3750) and (j <= 3805)) then t:='68 characters'
	else if ((j >= 3806) and (j <= 3861)) then t:='69 characters'
	else if ((j >= 3862) and (j <= 3916)) then t:='70 characters'
	else if ((j >= 3917) and (j <= 3972)) then t:='71 characters'
	else if ((j >= 3973) and (j <= 4027)) then t:='72 characters'
	else if ((j >= 4028) and (j <= 4083)) then t:='73 characters'
	else if ((j >= 4084) and (j <= 5000)) then t:='74 characters'
	else t:='too long';

	if Length(GetSubtitleText(i)) < 1 then
	begin
	SetSubtitleText(i, t);
	end;
  end;
end.




Что-то мне подсказывает, что длинную портянку if-ов можно свести к одной-двум несложным формулам. :)
0

#2 Пользователь офлайн   supafly Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Uploader
  • Сообщений: 115
  • Регистрация: 01 Март 06
  • Город:Арад.
  • Страна:
  • Прислал(a) субтитров: 14
  • Своих переводов: 3

Отправлено 11 Октябрь 2007 - 20:01

Просмотр сообщенияBedaZzle (17.4.2007, 0:25) писал:

Не совсем понимаю необходимость данного шедевра

Ну в общем то что SW не сохраняет пустые субы мне доставляло иногда проблемы.
В частности когда работаю в translator mode для перевода титров или для сравнения и подгонки разных версий, то добавляю или убираю строчки в одном из файлов.
А после сохранения обнаруживаю что все что добавил без текста не сохранено...

Цитата

Что-то мне подсказывает, что длинную портянку if-ов можно свести к одной-двум несложным формулам. :)

program FillEmptyLines;

// -----------------------------------------------------------------------------

var
n: Integer;
i: Integer;
j: Integer;

t: String;
begin
n := GetSubtitleCount;

for i := 0 to n - 1 do
begin

j := GetSubtitleFinalTime(i)-GetSubtitleInitialTime(i);

if j <= 719 then t:='too short'
else if ((j >= 720) and (j <= 749)) then t:='13 characters'
else if ((j >= 750) and (j <= 805)) then t:='14 characters'
else if ((j >= 806) and (j <= 861)) then t:='15 characters'
else if ((j >= 862) and (j <= 916)) then t:='16 characters'
else if ((j >= 917) and (j <= 972)) then t:='17 characters'
else if ((j >= 973) and (j <= 1027)) then t:='18 characters'
else if ((j >= 1028) and (j <= 1083)) then t:='19 characters'
else if ((j >= 1084) and (j <= 1138)) then t:='20 characters'
else if ((j >= 1139) and (j <= 1194)) then t:='21 characters'
else if ((j >= 1195) and (j <= 1249)) then t:='22 characters'
else if ((j >= 1250) and (j <= 1305)) then t:='23 characters'
else if ((j >= 1306) and (j <= 1361)) then t:='24 characters'
else if ((j >= 1362) and (j <= 1416)) then t:='25 characters'
else if ((j >= 1417) and (j <= 1472)) then t:='26 characters'
else if ((j >= 1473) and (j <= 1527)) then t:='27 characters'
else if ((j >= 1528) and (j <= 1583)) then t:='28 characters'
else if ((j >= 1584) and (j <= 1638)) then t:='29 characters'
else if ((j >= 1639) and (j <= 1694)) then t:='30 characters'
else if ((j >= 1695) and (j <= 1749)) then t:='31 characters'
else if ((j >= 1750) and (j <= 1805)) then t:='32 characters'
else if ((j >= 1806) and (j <= 1861)) then t:='33 characters'
else if ((j >= 1862) and (j <= 1916)) then t:='34 characters'
else if ((j >= 1917) and (j <= 1972)) then t:='35 characters'
else if ((j >= 1973) and (j <= 2027)) then t:='36 characters'
else if ((j >= 2028) and (j <= 2083)) then t:='37 characters'
else if ((j >= 2084) and (j <= 2138)) then t:='38 characters'
else if ((j >= 2139) and (j <= 2194)) then t:='39 characters'
else if ((j >= 2195) and (j <= 2249)) then t:='40 characters'
else if ((j >= 2250) and (j <= 2305)) then t:='41 characters'
else if ((j >= 2306) and (j <= 2361)) then t:='42 characters'
else if ((j >= 2362) and (j <= 2416)) then t:='43 characters'
else if ((j >= 2417) and (j <= 2472)) then t:='44 characters'
else if ((j >= 2473) and (j <= 2527)) then t:='45 characters'
else if ((j >= 2528) and (j <= 2583)) then t:='46 characters'
else if ((j >= 2584) and (j <= 2638)) then t:='47 characters'
else if ((j >= 2639) and (j <= 2694)) then t:='48 characters'
else if ((j >= 2695) and (j <= 2749)) then t:='49 characters'
else if ((j >= 2750) and (j <= 2805)) then t:='50 characters'
else if ((j >= 2806) and (j <= 2861)) then t:='51 characters'
else if ((j >= 2862) and (j <= 2916)) then t:='52 characters'
else if ((j >= 2917) and (j <= 2972)) then t:='53 characters'
else if ((j >= 2973) and (j <= 3027)) then t:='54 characters'
else if ((j >= 3028) and (j <= 3083)) then t:='55 characters'
else if ((j >= 3084) and (j <= 3138)) then t:='56 characters'
else if ((j >= 3139) and (j <= 3194)) then t:='57 characters'
else if ((j >= 3195) and (j <= 3249)) then t:='58 characters'
else if ((j >= 3250) and (j <= 3305)) then t:='59 characters'
else if ((j >= 3306) and (j <= 3361)) then t:='60 characters'
else if ((j >= 3362) and (j <= 3416)) then t:='61 characters'
else if ((j >= 3417) and (j <= 3472)) then t:='62 characters'
else if ((j >= 3473) and (j <= 3527)) then t:='63 characters'
else if ((j >= 3528) and (j <= 3583)) then t:='64 characters'
else if ((j >= 3584) and (j <= 3638)) then t:='65 characters'
else if ((j >= 3639) and (j <= 3694)) then t:='66 characters'
else if ((j >= 3695) and (j <= 3749)) then t:='67 characters'
else if ((j >= 3750) and (j <= 3805)) then t:='68 characters'
else if ((j >= 3806) and (j <= 3861)) then t:='69 characters'
else if ((j >= 3862) and (j <= 3916)) then t:='70 characters'
else if ((j >= 3917) and (j <= 3972)) then t:='71 characters'
else if ((j >= 3973) and (j <= 4027)) then t:='72 characters'
else if ((j >= 4028) and (j <= 4083)) then t:='73 characters'
else if ((j >= 4084) and (j <= 5000)) then t:='74 characters'
else t:='too long';

else if j => 5000 then t:='too long'
else t = j / 55;

if Length(GetSubtitleText(i)) < 1 then
begin
SetSubtitleText(i, t);
end;
end;
end.

0

#3 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 11 Октябрь 2007 - 20:57

Просмотр сообщенияsupafly (11.10.2007, 19:01) писал:

program FillEmptyLines;


Кхм... Исправил несколько ошибок, работающая версия:

// Fill empty subtitles with maximum number of characters. Made by Malmoth 2007.03.22. Debugged by Tengo.
// modified by supafly 2007.10.11
// Debugged by Bedazzle 2007.10.11

program FillEmptyLines;

// -----------------------------------------------------------------------------

var
  n: Integer;
  i: Integer;
  j: Integer;
  t: String;

begin
  n := GetSubtitleCount;

  for i := 0 to n - 1 do
  begin
	j := GetSubtitleFinalTime(i)-GetSubtitleInitialTime(i);

	if j < 720 then t:= 'too short'
	else if j > 5000 then t := 'too long'
	else t := IntToStr(j / 55) + ' characters';

	if Length(GetSubtitleText(i)) < 1 then
	  SetSubtitleText(i, t);

  end;
end.

0

#4 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 46
  • Своих переводов: 19

Отправлено 12 Октябрь 2007 - 13:26

@Bedazzle: Нужно заполнять только пустые? Тогда, вот так пошустрее должно работать... Нет?
var
  n: Integer;
  i: Integer;
  j: Integer;
  t: String;
begin
  n := GetSubtitleCount;
  for i := 0 to n - 1 do
  begin
		if Length(GetSubtitleText(i)) < 1 then
		begin
			j := GetSubtitleFinalTime(i)-GetSubtitleInitialTime(i);
			t := IntToStr(j / 55) + ' characters';
			SetSubtitleText(i, t);
		end;
  end;
end.

0

#5 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 12 Октябрь 2007 - 14:31

Просмотр сообщенияНуПогоди (12.10.2007, 12:26) писал:

@Bedazzle: Нужно заполнять только пустые? Тогда, вот так пошустрее должно работать... Нет?


Не совсем так, порушил функциональность. :)
Вот так будет совсем карашо:

for i := 0 to n - 1 do
  begin
	if Length(GetSubtitleText(i)) < 1 then
	begin
	  j := GetSubtitleFinalTime(i)-GetSubtitleInitialTime(i);

	  if j < 720 then t:= 'too short'
	  else if j > 5000 then t := 'too long'
	  else t := IntToStr(j / 55) + ' characters';

	  SetSubtitleText(i, t);
	end;
  end;

0

#6 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 46
  • Своих переводов: 19

Отправлено 12 Октябрь 2007 - 17:06

Поразвлекался со случаем 'too short' :D
var
  n: Integer;
  i: Integer;
  j: Integer;
  min: Integer;
  gap: Integer;
  t: String;
  begin
  min := 720; 
// minimal allowed empty subtitle duration in milliseconds
  gap := 1; 	
// minimal allowed distance of the empty subtitle to the next one
  n := GetSubtitleCount;
  for i := 0 to n - 1 do
  begin
	if Length(GetSubtitleText(i)) < 1 then
		begin
			j := GetSubtitleFinalTime(i) - GetSubtitleInitialTime(i);
			if j < min then
// if the empty subtitle is too short
				begin
				if (GetSubtitleInitialTime(i+1) - GetSubtitleInitialTime(i)) > min then		
// check a distance to the next subtitle
					SetSubtitleFinalTime(i,GetSubtitleInitialTime(i) + min)					
// set the minimum subtitle duration
				else SetSubtitleFinalTime(i,GetSubtitleInitialTime(i+1) - gap);				
// unless the next subtitle is overlaped
				if i = n-1 then SetSubtitleFinalTime(i,GetSubtitleInitialTime(i) + min);	
// correcting a problem with the last subtitle
				j := GetSubtitleFinalTime(i) - GetSubtitleInitialTime(i);
				end;
			if j > 5000 then t := 'too long'
			else t := IntToStr(j / 55) + ' characters';
			SetSubtitleText(i, t);
		end;
  end;
end.

PS. A eсть ли в этом странном языке Pascal возможность пользоваться логическими операциями И / ИЛИ? И писать условие, как в человеческом Си if ((a>B)||(c=d)&&(e!=f)) then ...?
0

#7 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 12 Октябрь 2007 - 20:06

Просмотр сообщенияНуПогоди (12.10.2007, 16:06) писал:

Поразвлекался со случаем 'too short' :D


кхм... нужно ещё проверять, чтобы субтитр не был последним в списке, иначе будет вылетать с ошибкой

Просмотр сообщенияНуПогоди (12.10.2007, 16:06) писал:

PS. A eсть ли в этом странном языке Pascal возможность пользоваться логическими операциями И / ИЛИ? И писать условие, как в человеческом Си if ((a>B)||(c=d)&&(e!=f)) then ...?


А что - AND и OR уже не работают?
0

#8 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 46
  • Своих переводов: 19

Отправлено 15 Октябрь 2007 - 12:31

Просмотр сообщенияBedaZzle (12.10.2007, 17:06) писал:

кхм... нужно ещё проверять, чтобы субтитр не был последним в списке, иначе будет вылетать с ошибкой
У меня не вылетает. Я эту проблему вроде решил проверкой if j = n-1 ...

Просмотр сообщенияBedaZzle (12.10.2007, 17:06) писал:

А что - AND и OR уже не работают?
Я в Паскалевском синтаксисе не силён, потому и спрашивал. Больше не буду... Ибо выкачал книженцию "Turbo Pascal Reference: A Free Book" by Ed Mitchell.
Да... A можно убрать слово "авторитет" из моего профиля? Я вроде его не писал, это кто-то из администрации, не иначе, постарался ещё до того, когда меня причислили с сонму святых (VIP). Пытался сделать это сам, но чтой-то не найду где именно это самое гнусное словечко хранится...
0

#9 Пользователь офлайн   Zvark Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 6
  • Регистрация: 21 Январь 10
  • Пол:Мужчина
  • Страна:

Отправлено 16 Февраль 2011 - 15:25

что-то не работает, пустые>пустые.
после загрузки перевод отстаёт...
вот этот пробовал:
// Fill empty subtitles with maximum number of characters. Made by Malmoth 2007.03.22. Debugged by Tengo.
// modified by supafly 2007.10.11
// Debugged by Bedazzle 2007.10.11

program FillEmptyLines;

// -----------------------------------------------------------------------------

var
  n: Integer;
  i: Integer;
  j: Integer;
  t: String;

begin
  n := GetSubtitleCount;

  for i := 0 to n - 1 do
  begin
        j := GetSubtitleFinalTime(i)-GetSubtitleInitialTime(i);

        if j < 720 then t:= 'too short'
        else if j > 5000 then t := 'too long'
        else t := IntToStr(j / 55) + ' characters';

        if Length(GetSubtitleText(i)) < 1 then
          SetSubtitleText(i, t);

  end;
end.


мда и надпись
- Не переведено -
"пустая" или нет?
0

#10 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 46
  • Своих переводов: 19

Отправлено 16 Февраль 2011 - 17:38

Просмотр сообщенияZvark (16 Февраль 2011 - 12:25) писал:

что-то не работает, пустые>пустые.
после загрузки перевод отстаёт...
---
мда и надпись
- Не переведено -
"пустая" или нет?

У меня всё прекрасно работает: пустые строки в поле Текст действительно заполняются текстом вида "ХY characters", где XY считается из длины показа... Можно внятно объяснить, чего вы ждёте от данного скрипта? И к чёму тут фраза "после загрузки перевод отстаёт"?

[EDIT]
Пустое = 0 букв.
'- Не переведено -' = 17 букв.
0

#11 Пользователь офлайн   Zvark Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 6
  • Регистрация: 21 Январь 10
  • Пол:Мужчина
  • Страна:

Отправлено 17 Февраль 2011 - 23:06

НуПогоди
загружаю проект(оригинал с переводом) запускаю скрипт - ничего.
если загрузить только перевод - работает.
0

#12 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 46
  • Своих переводов: 19

Отправлено 18 Февраль 2011 - 00:32

Просмотр сообщенияZvark (17 Февраль 2011 - 20:06) писал:

загружаю проект(оригинал с переводом) запускаю скрипт - ничего.

Вы ничего не путаете? Этому скрипту не важно загружен ли только оригинал ('Текст') или оригинал с переводом, сколько букв в переводе и тд... он проверяет длину строк только в оригинале (колонка 'Текст') и в случае нулевой длины (0 букв) меняет текст только оригинала на "XY characters" / "too short" и тд. У меня всё именно так и работает. Да и не может не работать, тк в скрипте всего 2 строчки, абсолютно "прозрачных" с точки зрения действий...
if Length(GetSubtitleText(i)) < 1 then // если длина строки оригинального текста <1, т.е. говоря по русски = 0
SetSubtitleText(i, t); // его текст заменяется стрингом t, который был определён из длины показа титра

0

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему