Рейтинг темы:
  • Голосов: 0 - Средняя оценка: 0. Если голосов меньше 5 оценка не показывается.
  • 1
  • 2
  • 3
  • 4
  • 5
Для переводчиков - вытаскиваем текст из игры
#1
Здравствуйте! Хотел рассказать вам как упростить перевод игры на платформе RPG MAKER, в частности об инструментарии. Для RPG MAKER есть скрипты позволяющие выполнить экспорт всего текста в отдельные файлы, а затем импорт. То есть мы при переводе будем работать не с редактором игры, а с обычным текстом, что дает нам возможность использовать программы для перевода и т.д., а так же последовательно обновлять перевод и распространять его в виде файлов текста, а не всей игры. Проверял я это все на RPG MAKER VX Ace, а в качестве подопытного выбрана Urban xLife, о работоспособности на других версиях RPG MAKER ничего не могу сказать, не проверял.
Итак, по порядку:
1 - Распаковка ресурсов
1.1 - Так как ресурсы большинства игр на RPG MAKER мы получаем в зашифрованном виде - файл " Game.rgss3a ", то нам нужна программа дешифратор " rgssad - rgss2a - rgss3a decrypter "!
1.2 - Копируем дешифратор в паку с игрой и запускаем.
1.3 - В окне программы нажимаем File -> Open File и открываем файл Game, затем нажимаем Tools -> Extract All Files, после распаковки нажимаем Generate Game.rvproj2,  закрываем дешифратор. В папке с игрой у нас появилась папка "Extract" содержащая папки: "Data" и "Graphics" и файл проекта RPG MAKER VX Ace - "Game.rvproj2".
1.4 - Папки "Data" и "Graphics" переносим в корневую папку игры, после папку "Extract" можно удалить, так же нужно удалить файл зашифрованных ресурсов "Game.rgss3a". В итоге мы должны получить такую структуру файлов и папок -
1.5 - Запускаем игру для проверки, все должно работать.
2 - Вставка скриптов
2.1 - Нам потребуется средство разработки RPG MAKER VX Ace, запускаем, выбираем Файл -> Открыть проект... и открываем наш проект "Game.rvproj2".
2.2 - Далее в меню выбираем Инструменты -> Редактор скриптов...
Теперь нам нужно вставить скрипты для вытаскивания текста (за скрипты отдельное спасибо товарищам: DeadElf79 и caveman). По разным рекомендациям скрипты нужно вставлять либо в начале, либо в конце всех скриптов. У меня в Urban xLife заработало только когда я вставил в секцию "▼ MENUS ▼", поехали...
2.3 - Идем в секцию "▼ MENUS ▼", нажимаем правой кнопкой на пустом месте в конце секции и добавляем 3 пустые строки  кнопкой "Добавить".
2.3 - Теперь добавляем скрипты в следующем порядке: Dial_Export, Dials module и Dial_Import. Становимся на пустую сроку в секции "▼ MENUS ▼", внизу есть поле для ввода названия скрипта, затем справа вставляем сам код скрипта!
Dial_Export
Код:
#===============================================================================
=begin
DIAL_EXPORT
Экспортер
Этот скрипт извлекает все сообщения и слова БД из проекта и записывает
в файл dials_<язык>.txt или же в несколько файлов
Авторы: DeadElf79, caveman
Версия: 1.07
История версий:
1.08 - добавлен экспорт закладки Terms
1.07 - изменен формат экспорта;
- добавлен экспорт для Общих событий (Common Events);
- добавлен экспорт базы данных;
- опционально: экспорт каждой карты в отдельный файл;
- опционально: экспорт базы данных в отдельный файл;
- опционально: экспорт общих событий в отдельный файл;
- добавлен модуль настроек Dials.
1.06 - оригинальный скрипт, вывод имени карты и сообщений построчно.
Ограничения:
- На одном из проектов не нашлось записи Vocab::surprise, что привело к
падению, решил добавлением в Vocab этой строки
=end
#===============================================================================
class Dial_Extract
attr_accessor :done
attr_accessor :error
def initialize
DataManager.init
$dials=Dials.new if $dials==nil

@file=File.open("dials_#{$dials.do_language}.txt","w")
if $dials.do_save_db
if $dials.do_db_is_file==false
export_database
else
@file.close
@file=File.open("dials_#{$dials.do_language}_DATABASE.txt","w")
export_database
@file.close
@file=File.open("dials_#{$dials.do_language}.txt","w")
end
end
if $dials.do_save_common
if $dials.do_common_is_file==false
export_common_events
else
@file.close
@file=File.open("dials_#{$dials.do_language}_COMMONEVENTS.txt","w")
export_common_events
@file.close
@file=File.open("dials_#{$dials.do_language}.txt","w")
end
end

if $dials.do_map_is_file!=false
@file.close
File.delete("dials_#{$dials.do_language}.txt")
end
for map in 1..$max_maps
if FileTest.exist?(sprintf("Data/Map%03d.rvdata2",map))
if $dials.do_map_is_file==false
export_map(map)
else
@file.close if @file.closed?!=true
$counter=0
@file=File.open(sprintf("dials_#{$dials.do_language}_Map%03d_"+
"#{$data_mapinfos[map].name}.txt",map),"w")
export_map(map)
@file.close
end
else
next
end
end
@file.close if @file.closed?!=true
@done=true
end

def export_database
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("||||||||||||||DATABASE||||||||||||||" + "\n")
else
@file.write("||||||||||||||База данных||||||||||||||" + "\n")
end
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== ACTORS ===================" + "\n")
else
@file.write("=================== ГЕРОИ ===================" + "\n")
end
end
if $data_actors.size>2
for i in 1...$data_actors.size
text = i.to_s + ":" + $data_actors[i].name
@file.write(text + "\n")
end
else
if $data_actors[1].name.size>1
text = 1.to_s + ":" + $data_actors[1].name
@file.write(text + "\n")
else
@file.write("Ни одного героя не было создано" + "\n")
end
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== CLASSES ===================" + "\n")
else
@file.write("=================== КЛАССЫ ===================" + "\n")
end
end
if $data_classes.size>2
for i in 1...$data_classes.size
text = i.to_s + ":" + $data_classes[i].name
@file.write(text + "\n")
end
else
if $data_classes[1].name.size>1
text = 1.to_s + ":" + $data_classes[1].name
@file.write(text + "\n")
else
@file.write("Ни одного класса не было создано" + "\n")
end
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== SKILLS ===================" + "\n")
else
@file.write("=================== НАВЫКИ ===================" + "\n")
end
end
for i in 1...$data_skills.size
text = i.to_s + ":" + $data_skills[i].name
@file.write(text + "\n")
@file.write($data_skills[i].description + "\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== ITEMS ===================" + "\n")
else
@file.write("=================== ПРЕДМЕТЫ ===================" + "\n")
end
end
for i in 1...$data_items.size
text = i.to_s + ":" + $data_items[i].name
@file.write(text + "\n")
@file.write($data_items[i].description + "\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
file.write("=================== WEAPONS ===================" + "\n")
else
@file.write("=================== ОРУЖИЕ ===================" + "\n")
end
end
for i in 1...$data_weapons.size
text = i.to_s + ":" + $data_weapons[i].name
@file.write(text + "\n")
@file.write($data_weapons[i].description + "\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== ARMORS ===================" + "\n")
else
@file.write("=================== БРОНЯ ===================" + "\n")
end
end
for i in 1...$data_armors.size
text = i.to_s + ":" + $data_armors[i].name
@file.write(text + "\n")
@file.write($data_armors[i].description + "\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== ENEMIES ===================" + "\n")
else
@file.write("=================== ПРОТИВНИКИ ===================" + "\n")
end
end
for i in 1...$data_enemies.size
text = i.to_s + ":" + $data_enemies[i].name
@file.write(text + "\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== TROOPS ===================" + "\n")
else
@file.write("=================== ГРУППЫ ВРАГОВ ===================" + "\n")
end
end
for i in 1...$data_troops.size
text = i.to_s + ":" + $data_troops[i].name
@file.write(text + "\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== STATES ===================" + "\n")
else
@file.write("=================== СТАТУСЫ ===================" + "\n")
end
end
for i in 1...$data_states.size
text = i.to_s + ":" + $data_states[i].name
@file.write(text + "\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== ANIMATIONS ===================" + "\n")
else
@file.write("=================== ИМЕНА АНИМАЦИЙ ===================" + "\n")
end
end
for i in 1...$data_animations.size
text = i.to_s + ":" + $data_animations[i].name
@file.write(text + "\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== TILESETS ===================" + "\n")
else
@file.write("=================== ТАЙЛСЕТЫ ===================" + "\n")
end
end
for i in 1...$data_tilesets.size
text = i.to_s + ":" + $data_tilesets[i].name
@file.write(text + "\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== SYSTEM ===================" + "\n")
else
@file.write("=================== СИСТЕМНЫЕ СТРОКИ ===================\n")
end
end
@file.write("ShopBuy:#{Vocab::ShopBuy}\n")
@file.write("ShopSell:#{Vocab::ShopSell}\n")
@file.write("ShopCancel:#{Vocab::ShopCancel}\n")
@file.write("Possession:#{Vocab::Possession}\n")
@file.write("ExpTotal:#{Vocab::ExpTotal}\n")
@file.write("ExpNext:#{Vocab::ExpNext}\n")
@file.write("SaveMessage:#{Vocab::SaveMessage}\n")
@file.write("LoadMessage:#{Vocab::LoadMessage}\n")
@file.write("File:#{Vocab::File}\n")
@file.write("PartyName:#{Vocab::PartyName}\n")
@file.write("Emerge:#{Vocab::Emerge}\n")
@file.write("Preemptive:#{Vocab::Preemptive}\n")
@file.write("Surprise:#{Vocab::Surprise}\n")
@file.write("EscapeStart:#{Vocab::EscapeStart}\n")
@file.write("EscapeFailure:#{Vocab::EscapeFailure}\n")
@file.write("Victory:#{Vocab::Victory}\n")
@file.write("Defeat:#{Vocab::Defeat}\n")
@file.write("ObtainExp:#{Vocab::ObtainExp}\n")
@file.write("ObtainGold:#{Vocab::ObtainGold}\n")
@file.write("ObtainItem:#{Vocab::ObtainItem}\n")
@file.write("LevelUp:#{Vocab::LevelUp}\n")
@file.write("ObtainSkill:#{Vocab::ObtainSkill}\n")
@file.write("UseItem:#{Vocab::UseItem}\n")
@file.write("CrticalToEnemy:#{Vocab::CriticalToEnemy}\n")
@file.write("CriticalToActor:#{Vocab::CriticalToActor}\n")
@file.write("ActorDamage:#{Vocab::ActorDamage}\n")
@file.write("ActorRecovery:#{Vocab::ActorRecovery}\n")
@file.write("ActorGain:#{Vocab::ActorGain}\n")
@file.write("ActorLoss:#{Vocab::ActorLoss}\n")
@file.write("ActorDrain:#{Vocab::ActorDrain}\n")
@file.write("ActorNoDamage:#{Vocab::ActorNoDamage}\n")
@file.write("ActorNoHit:#{Vocab::ActorNoHit}\n")
@file.write("EnemyDamage:#{Vocab::EnemyDamage}\n")
@file.write("EnemyRecovery:#{Vocab::EnemyRecovery}\n")
@file.write("EnemyGain:#{Vocab::EnemyGain}\n")
@file.write("EnemyLoss:#{Vocab::EnemyLoss}\n")
@file.write("EnemyDrain:#{Vocab::EnemyDrain}\n")
@file.write("EnemyNoDamage:#{Vocab::EnemyNoDamage}\n")
@file.write("EnomyNoHit:#{Vocab::EnemyNoHit}\n")
@file.write("Evasion:#{Vocab::Evasion}\n")
@file.write("MagicEvasion:#{Vocab::MagicEvasion}\n")
@file.write("MagicReflection:#{Vocab::MagicReflection}\n")
@file.write("CounterAttack:#{Vocab::CounterAttack}\n")
@file.write("Substitute:#{Vocab::Substitute}\n")
@file.write("BuffAdd:#{Vocab::BuffAdd}\n")
@file.write("DebuffAdd:#{Vocab::DebuffAdd}\n")
@file.write("BuffRemove:#{Vocab::BuffRemove}\n")
@file.write("ActionFailure:#{Vocab::ActionFailure}\n")
@file.write("PlayerPosError:#{Vocab::PlayerPosError}\n")
@file.write("EventOverflow:#{Vocab::EventOverflow}\n")

if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("=================== TERMINS ===================" + "\n")
else
@file.write("=================== ТЕРМИНЫ ===================" + "\n")
end
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("ELEMENTS:" + "\n")
else
@file.write("ЭЛЕМЕНТЫ:" + "\n")
end
end
for i in 1...$data_system.elements.size
@file.write("#{i.to_s}:#{$data_system.elements[i]}\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("SKILL TYPES:" + "\n")
else
@file.write("ТИПЫ СКИЛЛОВ:" + "\n")
end
end
for i in 1...$data_system.skill_types.size
@file.write("#{i.to_s}:#{$data_system.skill_types[i]}\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("WEAPON TYPES:" + "\n")
else
@file.write("ТИПЫ ОРУЖИЯ:" + "\n")
end
end
for i in 1...$data_system.weapon_types.size
@file.write("#{i.to_s}:#{$data_system.weapon_types[i]}\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("ARMOR TYPES:" + "\n")
else
@file.write("ТИПЫ БРОНИ:" + "\n")
end
end
for i in 1...$data_system.armor_types.size
@file.write("#{i.to_s}:#{$data_system.armor_types[i]}\n")
end
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("TERMS:" + "\n")
else
@file.write("ТЕРМИНЫ:" + "\n")
end
end
# basic
@file.write("Level:#{$data_system.terms.basic[0]}\n")
@file.write("Level (short):#{$data_system.terms.basic[1]}\n")
@file.write("HP:#{$data_system.terms.basic[2]}\n")
@file.write("HP (short):#{$data_system.terms.basic[3]}\n")
@file.write("MP:#{$data_system.terms.basic[4]}\n")
@file.write("MP (short):#{$data_system.terms.basic[5]}\n")
@file.write("TP:#{$data_system.terms.basic[6]}\n")
@file.write("TP (short):#{$data_system.terms.basic[7]}\n")
# params
@file.write("MHP:#{$data_system.terms.params[0]}\n")
@file.write("MMP:#{$data_system.terms.params[1]}\n")
@file.write("ATK:#{$data_system.terms.params[2]}\n")
@file.write("DEF:#{$data_system.terms.params[3]}\n")
@file.write("MAT:#{$data_system.terms.params[4]}\n")
@file.write("MDF:#{$data_system.terms.params[5]}\n")
@file.write("AGI:#{$data_system.terms.params[6]}\n")
@file.write("LUK:#{$data_system.terms.params[7]}\n")
# etypes
@file.write("Weapon:#{$data_system.terms.etypes[0]}\n")
@file.write("Shield:#{$data_system.terms.etypes[1]}\n")
@file.write("Head:#{$data_system.terms.etypes[2]}\n")
@file.write("Body:#{$data_system.terms.etypes[3]}\n")
@file.write("Accessory:#{$data_system.terms.etypes[4]}\n")
# commands
@file.write("Fight:#{$data_system.terms.commands[0]}\n")
@file.write("Escape:#{$data_system.terms.commands[1]}\n")
@file.write("Attack:#{$data_system.terms.commands[2]}\n")
@file.write("Defend:#{$data_system.terms.commands[3]}\n")
@file.write("Item:#{$data_system.terms.commands[4]}\n")
@file.write("Skill:#{$data_system.terms.commands[5]}\n")
@file.write("Equip:#{$data_system.terms.commands[6]}\n")
@file.write("Status:#{$data_system.terms.commands[7]}\n")
@file.write("Sort:#{$data_system.terms.commands[8]}\n")
@file.write("Save:#{$data_system.terms.commands[9]}\n")
@file.write("Exit Game:#{$data_system.terms.commands[10]}\n")
@file.write("(not used):#{$data_system.terms.commands[11]}\n")
@file.write("Weapon:#{$data_system.terms.commands[12]}\n")
@file.write("Armor:#{$data_system.terms.commands[13]}\n")
@file.write("Key Item:#{$data_system.terms.commands[14]}\n")
@file.write("Change Equipment:#{$data_system.terms.commands[15]}\n")
@file.write("Ultimate Equipment:#{$data_system.terms.commands[16]}\n")
@file.write("Remove All:#{$data_system.terms.commands[17]}\n")
@file.write("New Game:#{$data_system.terms.commands[18]}\n")
@file.write("Continue:#{$data_system.terms.commands[19]}\n")
@file.write("Shut Down:#{$data_system.terms.commands[20]}\n")
@file.write("Go to Title:#{$data_system.terms.commands[21]}\n")
@file.write("Cancel:#{$data_system.terms.commands[22]}\n")

@file.write("\n\n")
end

def export_common_events
if $dials.do_comments
if $dials.do_comments_lang==false
@file.write("||||||||||||||COMMON EVENTS||||||||||||||" + "\n")
else
@file.write("||||||||||||||ОБЩИЕ СОБЫТИЯ||||||||||||||" + "\n")
end
end
for i in 1...$data_common_events.size
if $dials.do_comments_lang==false
ev_text = "common_event_id:" + i.to_s
else
ev_text = "Номер:" + i.to_s
end
@file.write(ev_text + "\n")

if $dials.do_comments_lang==false
ev_text = "common_event_name:" + $data_common_events[i].name
else
ev_text = "Название:" + $data_common_events[i].name
end
@file.write(ev_text + "\n")

list = $data_common_events[i].list
if list != nil
for command in list
str4=""
case command.code
when 101
wait_flag = true
$counter+=1
@file.write((sprintf("%07d",$counter))+":")
@file.write("#{command.parameters[0]}"+"\n")
when 401 #message
if wait_flag
@file.write("#{command.parameters[0]}"+"\n")
end
when 102 #choices
wait_flag = false
$counter+=1
@file.write((sprintf("%07d",$counter))+":")
if $dials.do_comments_lang==false
@file.write("CHOICE:"+"\n")
else
@file.write("Варианты выбора:\n")
end
for j in 0...command.parameters[0].size
@file.write("#{command.parameters[0][j]}"+"\n")
end
else
wait_flag = false
end
end
end
end

@file.write("\n\n")
end

#=============================================================================
#=============================================================================
#========================САМОЕ ГЛАВНОЕ В ЭТОМ СКРИПТЕ!========================
#=============================================================================
#=============================================================================
def export_map(map_id)
if $dials.do_comments_lang==false
@file.write(sprintf("||||||||||||||MAP %03d||||||||||||||",map_id) + "\n")
else
@file.write(sprintf("||||||||||||||КАРТА %03d||||||||||||||",map_id) + "\n")
end
if $dials.do_comments_lang==false
str4="[map name in editor=\"#{$data_mapinfos[map_id].name}\"]"
#str4="[map name in game=\"#{$data_maps[map_id].name}\"]"
else
str4="[имя карты в редакторе=\"#{$data_mapinfos[map_id].name}\"]"
#str4="[имя карты в игре=\"#{$data_mapinfos[map_id].display_name}\"]"
end
@file.write((sprintf("%07d",$counter))+":#{str4}\n")

$game_map = Game_Map.new
$game_map.setup(map_id)
events=$game_map.events

wait_flag = true

for i in 1..9999
if events[i]!=nil
if $dials.do_comments_lang==false
ev_text = "event_id:" + i.to_s
else
#name="smthng"
ev_text = "Событие №:" + i.to_s# + ":"+name#events[i].name
end
@file.write(ev_text + "\n")

for page in events[i].g_event.pages
unless page.list.nil?
for command in page.list
str4=""
case command.code
when 101
wait_flag = true
$counter+=1
@file.write((sprintf("%07d",$counter))+":")
@file.write("#{command.parameters[0]}"+"\n")
when 401 #message
if wait_flag
@file.write("#{command.parameters[0]}"+"\n")
end
when 102 #choices
wait_flag = false
$counter+=1
@file.write((sprintf("%07d",$counter))+":")
if $dials.do_comments_lang==false
@file.write("CHOICE:"+"\n")
else
@file.write("Варианты выбора:\n")
end
for j in 0...command.parameters[0].size
@file.write("#{command.parameters[0][j]}"+"\n")
end
else
wait_flag = false
end
end
end
end
end
end
@file.write("\n\n")
end
end
Dial_Import
Код:
#===============================================================================
=begin
DIAL_IMPORT
Импортер
Этот скрипт анализирует файлы экспорта и ипмортирует их,
заменяя текст сообщений и БД проекта на содержимое файлов.
Автор: DeadElf79, caveman
Версия: 1.02 Импорт БД, общих событий и карт
Ограничения:
- Импорт многострочных описаний в БД пока без переноса
- Нет импорта названий тайлсетов (да и не стоит)
- Нет импорта Vocab
=end
#===============================================================================

class Dial_Import
attr_accessor :done
attr_accessor :error

def initialize
DataManager.init
$dials=Dials.new if $dials==nil
@lines = []
@lines_db = []
@lines_common = []
@lines_map = []
@line_all = 0

if !FileTest.exist?("dials_#{$dials.do_language}.txt")
p "Файл с общими данными не найден"
@error = true
return
end

@file=File.open("dials_#{$dials.do_language}.txt","r")
@lines = @file.readlines
@file.close

if $dials.do_load_db
if !$dials.do_db_is_file
import_database
else
if !FileTest.exist?("dials_#{$dials.do_language}_DATABASE.txt")
p "Файл _DATABASE не найден"
@error = true
return
end
@file=File.open("dials_#{$dials.do_language}_DATABASE.txt","r")
@lines_db = @file.readlines
@file.close

import_database
end
end

if $dials.do_load_common
if !$dials.do_common_is_file
import_common_events
else
@file.close if @file.closed?!=true
if !FileTest.exist?("dials_#{$dials.do_language}_COMMONEVENTS.txt")
p "Файл _COMMONEVENTS не найден"
@error = true
return
end
@file=File.open("dials_#{$dials.do_language}_COMMONEVENTS.txt","r")
@lines_common = @file.readlines
@file.close

import_common_events
end
save_data($data_common_events, "Data/CommonEvents.rvdata2")
end

for map in 1..$max_maps
if FileTest.exist?(sprintf("Data/Map%03d.rvdata2",map))
if !$dials.do_map_is_file
import_map(map)
else
@file.close if @file.closed?!=true
if !FileTest.exist?(sprintf("dials_#{$dials.do_language}_Map%03d_"+
"#{$data_mapinfos[map].name}.txt",map))
p = "Файл карты" + map + ' не найден'
@error = true
return
end

@file=File.open(sprintf("dials_#{$dials.do_language}_Map%03d_"+
"#{$data_mapinfos[map].name}.txt",map),"r")
@lines_map = @file.readlines
@file.close

import_map(map)
end
save_data($game_map.g_map, sprintf("Data/Map%03d.rvdata2", map))
else
next
end
end
save_data($data_mapinfos, "Data/MapInfos.rvdata2")
@file.close if @file.closed?!=true
@done=true
end

def import_database
l = $dials.do_db_is_file ? 0 : @line_all
data = $dials.do_db_is_file ? @lines_db : @lines

l += 1 if $dials.do_comments #DATABASE

l += 1 if $dials.do_comments #ACTORS
for i in 1...$data_actors.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_actors[i].name = $2.to_s
end
l += 1
end

l += 1 if $dials.do_comments #CLASSES
for i in 1...$data_classes.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_classes[i].name = $2.to_s
end
l += 1
end

l += 1 if $dials.do_comments #SKILLS
for i in 1...$data_skills.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_skills[i].name = $2.to_s
end
l += 1
text = ""
while !data[l].include?(":") and !data[l].include?("==")
text += data[l] + " \n"
l += 1
end
$data_skills[i].description = text
end

l += 1 if $dials.do_comments #ITEMS
for i in 1...$data_items.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_items[i].name = $2.to_s
end
l += 1
text = ""
while !data[l].include?(":") and !data[l].include?("==")
text += data[l] + " \n"
l += 1
end
$data_items[i].description = text
end

l += 1 if $dials.do_comments #WEAPONS
for i in 1...$data_weapons.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_weapons[i].name = $2.to_s
end
l += 1
text = ""
while !data[l].include?(":") and !data[l].include?("==")
text += data[l] + " \n"
l += 1
end
$data_weapons[i].description = text
end

l += 1 if $dials.do_comments #ARMORS
for i in 1...$data_armors.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_armors[i].name = $2.to_s
end
l += 1
text = ""
while !data[l].include?(":") and !data[l].include?("==")
text += data[l] + " \n"
l += 1
end
$data_armors[i].description = text
end

l += 1 if $dials.do_comments #ENEMIES
for i in 1...$data_enemies.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_enemies[i].name = $2.to_s
end
l += 1
end

l += 1 if $dials.do_comments #TROOPS
for i in 1...$data_troops.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_troops[i].name = $2.to_s
end
l += 1
end

l += 1 if $dials.do_comments #STATES
for i in 1...$data_states.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_states[i].name = $2.to_s
end
l += 1
end

l += 1 if $dials.do_comments #ANIMATIONS
for i in 1...$data_animations.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_animations[i].name = $2.to_s
end
l += 1
end

l += 1 if $dials.do_comments #TILESETS
for i in 1...$data_tilesets.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_tilesets[i].name = $2.to_s
end
l += 1
end

l += 1 if $dials.do_comments #SYSTEM
l += 50 # словарь не импортим

l += 1 if $dials.do_comments #TERMS
l += 1 if $dials.do_comments #ELEMENTS
for i in 1...$data_system.elements.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.elements[i] = $2.to_s
end
l += 1
end
l += 1 if $dials.do_comments #SKILL TYPES
for i in 1...$data_system.skill_types.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.skill_types[i] = $2.to_s
end
l += 1
end
l += 1 if $dials.do_comments #WEAPON TYPES
for i in 1...$data_system.weapon_types.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.weapon_types[i] = $2.to_s
end
l += 1
end
l += 1 if $dials.do_comments #ARMOR TYPES
for i in 1...$data_system.armor_types.size
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.armor_types[i] = $2.to_s
end
l += 1
end

l += 1 if $dials.do_comments #TERMS
# basic
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.basic[0] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.basic[1] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.basic[2] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.basic[3] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.basic[4] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.basic[5] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.basic[6] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.basic[7] = $2.to_s
end
l += 1
# params
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.params[0] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.params[1] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.params[2] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.params[3] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.params[4] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.params[5] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.params[6] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.params[7] = $2.to_s
end
l += 1
# etypes
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.etypes[0] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.etypes[1] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.etypes[2] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.etypes[3] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.etypes[4] = $2.to_s
end
l += 1
# commands
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[0] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[1] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[2] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[3] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[4] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[5] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[6] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[7] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[8] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[9] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[10] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[11] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[12] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[13] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[14] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[15] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[16] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[17] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[18] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[19] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[20] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[21] = $2.to_s
end
l += 1
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_system.terms.commands[22] = $2.to_s
end
l += 3 # \n\n

save_data($data_actors, "Data/Actors.rvdata2")
save_data($data_classes, "Data/Classes.rvdata2")
save_data($data_skills, "Data/Skills.rvdata2")
save_data($data_items, "Data/Items.rvdata2")
save_data($data_weapons, "Data/Weapons.rvdata2")
save_data($data_armors, "Data/Armors.rvdata2")
save_data($data_enemies, "Data/Enemies.rvdata2")
save_data($data_troops, "Data/Troops.rvdata2")
save_data($data_states, "Data/States.rvdata2")
save_data($data_animations, "Data/Animations.rvdata2")
save_data($data_system, "Data/System.rvdata2")


@line_all = l if !$dials.do_db_is_file
end

def import_common_events
l = $dials.do_common_is_file ? 0 : @line_all
data = $dials.do_common_is_file ? @lines_common : @lines
l += 1 if $dials.do_comments #COMMON EVENTS
has_dials = false

choices = []
for i in 1...$data_common_events.size
l += 1 # common_event_id

# common_event_name
data[l].gsub(/\A(.+?)\:(.+?)\Z/) do
$data_common_events[i].name = $2.to_s
end
l += 1

list = $data_common_events[i].list
if list != nil
for command in list
case command.code
when 101 #message start
wait_flag = true
l += 1 # counter id
when 401 #message continue
if wait_flag
data[l].gsub(/\A(.+?)\n\Z/) do
command.parameters[0] = data[l] = $1.to_s
end
l += 1
has_dials = true
end
when 102 #choices list
wait_flag = false
p data[l]
l += 1 # counter id

for j in 0...command.parameters[0].size
data[l].gsub(/\A(.+?)\Z/) do
command.parameters[0][j] = $1.to_s
choices.push($1.to_s)
end
l += 1
end
choices.reverse! # нам нужен не стек, а очередь!
when 402 #choice
wait_flag = false
command.parameters[1] = choices.pop

else
wait_flag = false
end
end
end
end
l += 2 #\n\n
@line_all = l if !$dials.do_common_is_file
p @line_all
end

def import_map(map)
l = $dials.do_map_is_file ? 0 : @line_all
data = $dials.do_map_is_file ? @lines_map : @lines

l += 1 # == MAP map_id ==
$game_map = Game_Map.new
$game_map.setup(map)
events=$game_map.events
choices = []

p 'map: ' + data[l]
data[l].gsub(/\A(.+?)\:\[(.+?)\=\"(.+?)\"]\Z/) do
$data_mapinfos[map].name = $3.to_s
end
l += 1

wait_flag = false

for i in 1..9999
if events[i]!=nil
l += 1 # event_id

for page in events[i].g_event.pages
unless page.list.nil?
for command in page.list
case command.code
when 101 #message start
wait_flag = true
l += 1 # counter id
when 401 #message continue
if wait_flag
data[l].gsub(/\A(.+?)\n\Z/) do
command.parameters[0] = data[l] = $1.to_s
end
l += 1
end
when 102 #choices list
wait_flag = false
p data[l]
l += 1 # counter id

for j in 0...command.parameters[0].size
data[l].gsub(/\A(.+?)\Z/) do
command.parameters[0][j] = $1.to_s
choices.push($1.to_s)
end
l += 1
end
choices.reverse! # нам нужен не стек, а очередь!
when 402 #choice
wait_flag = false
command.parameters[1] = choices.pop

else
wait_flag = false
end
end
end
end
end
end
l += 2 #\n\n
@line_all = l if !$dials.do_map_is_file
end
end
Dials module
Код:
#===============================================================================
=begin
DIALS module
Экстрактор диалогов, часть третья
Этот скрипт необходим для настройки работы экспорта и импорта.
Автор: DeadElf79
Версия: 1.01 Добавлены настройки для импорта (caveman)
=end
#===============================================================================
class Dials
def initialize
#==========МЕНЯЕМ ТОЛЬКО ЗДЕСЬ==========
#возможность экспорта (true-вкл, false-выкл)
@do_export=true
#возможность импорта
@do_import=true
#включить экспорт базы данных
@do_save_db=true
#включить импорт базы данных
@do_load_db=true
#экспорт карт в отдельные файлы (сколько карт, столько и файлов)
#а также импорт из них
@do_map_is_file=false
#экспорт базы данных в отдельный файл(если do_save_db=true)
#а также импорт из него (если do_load_db=true)
@do_db_is_file=true
#экспорт данных из Общих событий
@do_save_common=true
#импорт данных из Общих событий
@do_load_common=true
#экспорт общих событий в отдельные файлы
#а также импорт из них
@do_common_is_file=false
#комментарии в файлах
@do_comments=true
#язык комментариев в файлах (true-русский, false-английский)
#только если do_comments=true
@do_comments_lang=true
#язык, на котором написаны данные в экспортируемом
#файле. необходимо для запуска в игре одного из нескольких
#по выбору.
#может быть одним из вариантов:
#rus eng deu fre jap
@do_language="rus"
#возможность экспорта/импорта прямо из титульного экрана
#если проект был запущен из редактора (то есть $DEBUG=true)
@do_title_debug=true
#==========ДАЛЬШЕ НЕ ТРОГАЕМ============
@options_button_name="Настройки"
@options_extractor_name="Экспортировать"
@options_import_name="Импортировать"
@options_cancel_name="Отмена"
end

attr_accessor :do_title_debug
attr_accessor :do_export
attr_accessor :do_import
attr_accessor :do_save_db
attr_accessor :do_load_db
attr_accessor :do_map_is_file
attr_accessor :do_db_is_file
attr_accessor :do_save_common
attr_accessor :do_load_common
attr_accessor :do_common_is_file
attr_accessor :do_comments_lang
attr_accessor :do_comments
attr_accessor :do_language
attr_reader :options_button_name
attr_reader :options_extractor_name
attr_reader :options_import_name
attr_reader :options_cancel_name
attr_reader :do_dir
end

$max_maps=999
$counter=0
class Game_Event
attr_accessor :erased
def g_event
return @event
end
end

class Game_Map
def g_map
return @map
end
end

class Window_TitleCommand
def make_command_list
add_command(Vocab::new_game, :new_game)
add_command(Vocab::continue, :continue, continue_enabled)
if $dials.do_title_debug
add_command($dials.options_button_name, :extractor)
end
add_command(Vocab::shutdown, :shutdown)
end
end

class Window_DialsCommand<Window_TitleCommand
def make_command_list
add_command($dials.options_extractor_name,:extract,$dials.do_export)
add_command($dials.options_import_name,:import,$dials.do_import)
add_command($dials.options_cancel_name,:cancel)
end
end

class Scene_Title
def start
super
SceneManager.clear
Graphics.freeze
create_background
create_foreground
$dials=Dials.new
create_command_window
create_extra_window
play_title_music
end

def create_command_window
@command_window = Window_TitleCommand.new
@command_window.set_handler(:new_game, method(:command_new_game))
@command_window.set_handler(:continue, method(:command_continue))
if $dials.do_title_debug
@command_window.set_handler(:extractor, method(:command_extractor))
end
@command_window.set_handler(:shutdown, method(:command_shutdown))
end

def create_extra_window
@extra=Window_DialsCommand.new
@extra.visible=false
@extra.x = (Graphics.width - @command_window.width) / 2+@extra.width
@extra.y = (Graphics.height * 1.6 - @command_window.height) / 2
@extra.set_handler(:extract, method(:command_extract))
@extra.set_handler(:import, method(:command_import))
@extra.set_handler(:cancel, method(:command_cancel))
end

def command_extractor
@extra.visible=true
@extra.openness=0
@extra.open
@command_window.active=false
@extra.active=true
end

def command_extract
extract=Dial_Extract.new
if extract.done then
@extra.close
msgbox "Операция успешно завершена!"
update until @extra.close?
@command_window.active=true
@extra.active=false
end
end

def command_import
extract=Dial_Import.new
if extract.done then
@extra.close
msgbox "Операция успешно завершена!"
update until @extra.close?
@command_window.active=true
@extra.active=false
end
end

def command_cancel
@extra.close
update until @extra.close?
@command_window.active=true
@extra.active=false
end
end
В итоге у нас должна получится вот такая картина -
Применяем, нажимаем "Ок" и выходим в основное окно редактора.
2.4 Сохраняем проект и запускаем, можно прям из окна редактора.
3 - Экспорт/Импорт
В главном меню игры появился пункт "Настройки", а в нём подпункты "Экспортировать" и "Импортировать".
3.1 При нажатии на "Экспортировать" в корневой папке игры появятся два файла со всем текстом игры: "dials_rus.txt" и "dials_rus_DATABASE.txt".
Вот эти файлы уже можно переводить, только сохраняйте структуру, иначе при импорте могут возникнуть проблемы!
3.1 При нажатии на "Импортировать" из файлов "dials_rus.txt" и "dials_rus_DATABASE.txt" происходит импорт текста в игру и сохранение проекта, импортировать достаточно один раз.
Ну вот вроде и все по основным моментам, если будут какие-то вопросы не стесняйтесь.
Спасибо!
p.s. Чуть позже сделаю пост по инструментарию переводчика на основе сегментации текста и "памяти переводов".

 
Измотав противника беспорядочным отступлением, окончательно деморализуем его, безоговорочной капитуляцией!
Ответить
#2
http://www.ulmf.org/bbs/showthread.php?t=26944
и всё. для 90% игр этого достаточно...

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#3
Gorb, хорошая и подробная инструкция, но ты знаешь про прогу RPGMakerTrans?
All Decrypter я описывал отдельной темой вот здесь:
Установка переводов с помощью ALL Decrypter
А дальнейший перевод и работа с файлами карт, вытянутых с помощью RPGMakerTrans описаны здесь:
Переводчикам игр RPGMaker

 


Ответить
#4
b6badda7 писал(а):Gorb, хорошая и подробная инструкция, но ты знаешь про прогу RPGMakerTrans?
Век живи, век учись! Только узнал, из сообщения ntcntl. Прога проще, удобнее и она раскидывает текст по файлам, а не сливает все в один. В общем must have!

 
Измотав противника беспорядочным отступлением, окончательно деморализуем его, безоговорочной капитуляцией!
Ответить
#5
Ладно, чуть позже сделаю пост про OmegaT

 
Измотав противника беспорядочным отступлением, окончательно деморализуем его, безоговорочной капитуляцией!
Ответить
#6
dab92885 писал(а):Век живи, век учись! Только узнал, из сообщения ntcntl. Прога проще, удобнее и она раскидывает текст по файлам, а не сливает все в один. В общем must have!
Там её чувак с 2011-го года пилит и допиливает разные фишки, удобства и финтифлюшечки:
http://rpgmakertrans.bitbucket.org/
Но твой способ тоже хорош для некоторых игр, которые не берёт RPGMakerTrans. Как альтернатива.
dab92885 писал(а):Ладно, чуть позже сделаю пост про OmegaT
А вот это было бы очень интересно.
Я давно задумывался, учитывая современное развитие компов и устройств хранения инфы, не было бы логичней пилить автопереводчики не с помощью каких-то базовых скриптов и словарей, а заливать в базы данных целые предложения и словосочетания из разных источников, что в итоге давало бы весьма точный перевод, а с набором всё большего количества предложений в базе данных, точность только повышалась бы.

 


Ответить
#7
b6badda7 писал(а):А вот это было бы очень интересно.
Я давно задумывался, учитывая современное развитие компов и устройств хранения инфы, не было бы логичней пилить автопереводчики не с помощью каких-то базовых скриптов и словарей, а заливать в базы данных целые предложения и словосочетания из разных источников, что в итоге давало бы весьма точный перевод, а с набором всё большего количества предложений в базе данных, точность только повышалась бы.
Там немного другой принцип, текст делится на сегменты и в процессе перевода каждого сегмента в "память переводов" сохраняется как ты перевел какой сегмент и сегменты со 100% совпадением переводятся автоматически, а при меньшем проценте программа предлагает варианты т.е. чем больше перевел тем проще. Так же очень удобно когда начал переводить раннюю версию игры, при выходе новых версий ты добавляешь в проект перевода с памятью новый файл и через минуту, тебе осталось перевести только новые сегменты.

 
Измотав противника беспорядочным отступлением, окончательно деморализуем его, безоговорочной капитуляцией!
Ответить
#8
Так же удобно вести совместный перевод, т.к. общая "память переводов" и "глоссарий".
Вот пример окна программы где видно и совпадения и Яндексовкий машинный перевод

 
Измотав противника беспорядочным отступлением, окончательно деморализуем его, безоговорочной капитуляцией!
Ответить
#9
dab92885 писал(а):Так же удобно вести совместный перевод, т.к. общая "память переводов" и "глоссарий".
Вот пример окна программы где видно и совпадения и Яндексовкий машинный перевод
И правда удобно.
А мы на гуглодоках переводим)

 


Ответить
#10
dab92885 писал(а):Ладно, чуть позже сделаю пост про OmegaT
Попробовал упомянутую программу.
Из личных впечатлений: перевод происходит путем замены текста, так что использование с RPGMaker Trans довольно неудобно.
Так же проверил вариант со скриптами из первого сообщения: сам процесс перевода идет нормально, но когда доходит до оформления начинаю вылезать ошибки при необходимости заменить одну строку японского текста на две русского.

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#11
ebe3a6c0 писал(а):Попробовал упомянутую программу.
Из личных впечатлений: перевод происходит путем замены текста, так что использование с RPGMaker Trans довольно неудобно.
Так же проверил вариант со скриптами из первого сообщения: сам процесс перевода идет нормально, но когда доходит до оформления начинаю вылезать ошибки при необходимости заменить одну строку японского текста на две русского.
Тот случай, когда в попытках сделать очень
удобную прогу перемудрили и создали трость для слепца с лазерным прицелом.

 


Ответить
#12
Кстати скрипты при извлечении текста вполне себе извлекаю и метки, но при этом при импорте обратно в игру берет текст не по ним, а построчно. Соответственно происходит сдвиг и полная фигня.
Программа для перевода же видимо начинает становиться полезной набрав достаточный объем пользовательского перевода. Но для этого нужно именно переводить по словам/предложениям, а не ориентироваться практически на одну смысловую нагрузку эпизода.

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#13
Кстати, ntcntl, слышал, что на ПЛе планируют создать с помощью администрации группу переводчиков?

 


Ответить
#14
b6badda7 писал(а):Кстати, ntcntl, слышал, что на ПЛе планируют создать с помощью администрации группу переводчиков?
Я там даже отписался, что считаю стоящим туда набирать хотя бы со второго перевода, а то у меня к примеру за пол года после первой штуки 4 начатых, а достаточного для демонстрации результата (как с моей точки зрения) так пока и нет...

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#15
ebe3a6c0 писал(а):Я там даже отписался, что считаю стоящим туда набирать хотя бы со второго перевода, а то у меня к примеру за пол года после первой штуки 4 начатых, а достаточного для демонстрации результата (как с моей точки зрения) так пока и нет...
Субъективная штука это количество переводов. Можно ж переводить игрушки по 2-3к блоков, а можно переводить на 150-200к блоков))))

 


Ответить
#16
4GunZ
ну это ты загнул "собираются",пока только дарк бучу поднимает smile
ntcntl
2 соло перевода - это вы батенька жестити,игры все же бывают разные по обьему,к примеру текста в опале2 раз в 20-30(а может и ещё больше), больше чем в рио4
так же ты забываешь,про групповые переводы,как было с опалой 2

 
Мои переводы
перевожу: Ochi mono RPG ~50%
Ответить
#17
cc5f18c4 писал(а):2 соло перевода - это вы батенька жестити,игры все же бывают разные по обьему,к примеру текста в опале2 раз в 20-30(а может и ещё больше), больше чем в рио4
так же ты забываешь,про групповые переводы,как было с опалой 2
Ну за соло я и не утверждал, сложившиеся команды всё же в любом случае эффективней. Да и индивидуальный подход тоже рулит: к примеру те, кто переводит VH вполне заработали на признание вне зависимости от степени завершенности.

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#18
ntcntl
тогда извини,не правильно понял твою мысль

 
Мои переводы
перевожу: Ochi mono RPG ~50%
Ответить
#19
ebe3a6c0 писал(а):Ну за соло я и не утверждал, сложившиеся команды всё же в любом случае эффективней. Да и индивидуальный подход тоже рулит: к примеру те, кто переводит VH вполне заработали на признание вне зависимости от степени завершенности.
VH щас переживает сложный период)) За месяц или два всего один процент перевели)
ИМХО, если администрация ПЛа возьмётся за дело, то уж правила приёма в эти группы они уж как-нибудь придумают. Главное, чтоб они собрались вообще.

 


Ответить
#20
4GunZ
ох,сколько же гемороя эта группа вызовет...

 
Мои переводы
перевожу: Ochi mono RPG ~50%
Ответить
#21
cc5f18c4 писал(а):4GunZ
ох,сколько же гемороя эта группа вызовет...
Ну дак любая деятельность это гемор))

 


Ответить
#22
Gorb
Один момент, строчек не добавлять не удалять нельзя, иначе всё отображаться будет в кривь и вкось)) Убежит строка
Второй момент, иногда в БД одна из строчек переносится на строку ниже какой-то подкласс оружия вроде, ну там смотреть надо)) Описывал в блоге))
Кстати работаешь с Maker'ом ?) Или так на скриптах сидишь)))))
Ничего я не поднимаю))) Пока беседую, с AllMore, а он уже оповещает их))) долгая система)))
OmegaT - не плохо)))
По поводу переводчиков было дело, но суть в том чтобы научить этому) Буду, кстати иметь тебя в виду, как переводчика))))))
ebe3a6c0 писал(а):А что по поводу группы: мое ИМХО если кого и приглашать, то при условии хотя бы двух переведенных игр ;) (а то я, например, вторую уже почти пол года не могу довести до конца, хотя начато штуки четыре, но без току...)

 
Ответить
#23
4GunZ
Кстати, я тут по листал: в разделе получаются 4 темы по автоматическому/ручному переводу. Может закрепишь отдельную тему хотя бы с ссылками на них? Что бы она висела вверху и не уезжала.

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#24
ntcntl, та даже хз. Темы-то все о разных вещах. Вторая и четвертая — это темы по конкретным программам, третья — это для простых игроков — проги для автоперевода переводчикам особо не нужны, а первая — конкретно для переводчиков.

 


Ответить
#25
b6badda7 писал(а):Темы-то все о разных вещах.
Ну так я и не предлагаю что-то делать с темами, просто собрать ссылки на них в одном месте. А ту тему можно будет и закрыть, просто что бы новички быстро могли найти где обсуждается конкретный вопрос.

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#26
ebe3a6c0 писал(а):Ну так я и не предлагаю что-то делать с темами, просто собрать ссылки на них в одном месте. А ту тему можно будет и закрыть, просто что бы новички быстро могли найти где обсуждается конкретный вопрос.
Думаешь, что раздел на какие-то 37 тем уже требует отдельной тему с навигацией по темам раздела?

 


Ответить
#27
4GunZ
Ну к примеру Gorb создав эту тему про RPGMaker Trans тему видимо не видел, пока про него тут не написали... Проблема не в сложности поиска, а в том, что пока не ткнуть - никто и не пытается смотреть по сторонам :(

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#28
ebe3a6c0 писал(а):4GunZ
Ну к примеру Gorb создав эту тему про RPGMaker Trans тему видимо не видел, пока про него тут не написали... Проблема не в сложности поиска, а в том, что пока не ткнуть - никто и не пытается смотреть по сторонам
Дык, может, банить всех, кто не пользуется поиском?))) Норм же тема получится)))

 


Ответить
#29
Ну если отсеять тех, кто не знает что искать, от тех кто и не хочет пытаться - то почему бы и да? ;)

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#30
ebe3a6c0 писал(а):Ну так я и не предлагаю что-то делать с темами, просто собрать ссылки на них в одном месте. А ту тему можно будет и закрыть, просто что бы новички быстро могли найти где обсуждается конкретный вопрос.
Я сделаль!
Быстрая навигация по разделу
ebe3a6c0 писал(а):Ну если отсеять тех, кто не знает что искать, от тех кто и не хочет пытаться - то почему бы и да?
Мечты...)))

 


Ответить


Похожие темы
Тема: Автор Ответов: Просмотров: Посл. сообщение
Information Список работ команды переводчиков PL и некоторых других b6badda7 249 40168 18.05.2019, 17:53
Посл. сообщение: 52396519
  Обсуждение:  Флудилка переводчиков e7d3b4f3 17 1243 30.04.2019, 07:59
Посл. сообщение: 12c76ce4

Переход:


Просматривают эту тему: 1 Гость(ей)