modpack_localizer 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Rakefile +1 -37
- data/how_to_publish.txt +2 -2
- data/lib/modpack_localizer/quest_giver/performer.rb +120 -0
- data/lib/modpack_localizer/quest_giver/reader.rb +30 -0
- data/lib/modpack_localizer/quest_giver/writer.rb +51 -0
- data/lib/modpack_localizer/util/version.rb +1 -1
- data/lib/modpack_localizer.rb +2 -0
- metadata +4 -2
- data/rake_helper.rb +0 -29
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d6f6f78477a00a2dccb3a91ac06b4ae16eef6a6e9183e7c439ed20c6d3756311
|
|
4
|
+
data.tar.gz: 6eaf4b967aa2b9203b05f52d963054f86df9a3549dee9cc4ec9a8db8f4a4e54a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ff6c2808e247f65516ffa0e18751715562950c347683114979411ad32aaa5ff459d48684e2d0d2110f50210a4a8d13651414ff5c06e4fd61c4f9593285586ca3
|
|
7
|
+
data.tar.gz: 75be66f8d7d0b074c355921072cfbede46a2f687893d6c4d4e7ec79e2b75f799e1d5edc458f5023ec8f532e73f8943912f999f0e17c4eafde00b41e0f44c345d
|
data/CHANGELOG.md
CHANGED
data/Rakefile
CHANGED
|
@@ -1,39 +1,3 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "
|
|
4
|
-
require "rspec/core/rake_task"
|
|
5
|
-
require "rubocop/rake_task"
|
|
6
|
-
require "yard"
|
|
7
|
-
require_relative "rake_helper"
|
|
8
|
-
|
|
9
|
-
desc "analysis"
|
|
10
|
-
task :analysis do
|
|
11
|
-
sh "bundle install"
|
|
12
|
-
|
|
13
|
-
RakeHelper.init_rake_tasks
|
|
14
|
-
|
|
15
|
-
puts "--- rspec ---"
|
|
16
|
-
Rake::Task[:spec].invoke
|
|
17
|
-
|
|
18
|
-
puts "--- rubocop ---"
|
|
19
|
-
Rake::Task[:rubocop].invoke
|
|
20
|
-
|
|
21
|
-
puts "--- yard ---"
|
|
22
|
-
Rake::Task[:yard].invoke
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
desc "push to github packages and rubygems"
|
|
26
|
-
task :push do
|
|
27
|
-
sh "bundle install"
|
|
28
|
-
|
|
29
|
-
puts "--- build ---"
|
|
30
|
-
RakeHelper.build_gem
|
|
31
|
-
|
|
32
|
-
puts "--- push to github packages ---"
|
|
33
|
-
RakeHelper.push_to_github_packages
|
|
34
|
-
|
|
35
|
-
puts "--- push to rubygems ---"
|
|
36
|
-
RakeHelper.push_to_rubygems
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
task default: :analysis
|
|
3
|
+
require "push_gem"
|
data/how_to_publish.txt
CHANGED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
require "dotenv"
|
|
2
|
+
require "translation_api"
|
|
3
|
+
require_relative "../util/help"
|
|
4
|
+
require_relative "../util/error"
|
|
5
|
+
require_relative "reader"
|
|
6
|
+
require_relative "writer"
|
|
7
|
+
|
|
8
|
+
module ModpackLocalizer
|
|
9
|
+
module QuestGiver
|
|
10
|
+
# Quest GiverのJSONファイルの翻訳を実行するクラス
|
|
11
|
+
class Performer
|
|
12
|
+
Dotenv.load
|
|
13
|
+
|
|
14
|
+
MAX_RETRIES = 8
|
|
15
|
+
BASE_DELAY = 5
|
|
16
|
+
MAX_SLEEP = 256
|
|
17
|
+
|
|
18
|
+
# @param [Boolean] output_logs APIのログを出力するか
|
|
19
|
+
# @param [Array<String>] except_words 翻訳しない単語
|
|
20
|
+
# @param [String] language 言語
|
|
21
|
+
# @param [Boolean] display_help ヘルプを表示するか
|
|
22
|
+
# @return [ModpackLocalizer::QuestGiver::Performer]
|
|
23
|
+
def initialize(output_logs: true, except_words: [], language: "Japanese", display_help: true)
|
|
24
|
+
TranslationAPI.configure do |config|
|
|
25
|
+
config.output_logs = output_logs
|
|
26
|
+
config.language = language.downcase
|
|
27
|
+
config.except_words = except_words
|
|
28
|
+
config.provider = ENV["PROVIDER"]&.to_sym || :openai
|
|
29
|
+
config.custom_prompt = "Never translate property access. Example: obj.property.child"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
@reader, @writer, @progress_bar, @loggable = nil
|
|
33
|
+
|
|
34
|
+
ModpackLocalizer.help if display_help
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Quest GiverのJSONファイルを翻訳して出力する
|
|
38
|
+
#
|
|
39
|
+
# @param [String] file_path ファイルのパス
|
|
40
|
+
# @param [Boolean] loggable 翻訳ログを出力するか
|
|
41
|
+
# @return [void]
|
|
42
|
+
def perform(file_path, loggable: true)
|
|
43
|
+
@loggable = loggable
|
|
44
|
+
file_path = File.expand_path(file_path)
|
|
45
|
+
validate_path(file_path)
|
|
46
|
+
|
|
47
|
+
@reader = ModpackLocalizer::QuestGiver::Reader.new
|
|
48
|
+
@writer = ModpackLocalizer::QuestGiver::Writer.new(file_path)
|
|
49
|
+
results = @reader.extract_all(file_path)
|
|
50
|
+
init_progress_bar(file_path, results.length) if @loggable
|
|
51
|
+
|
|
52
|
+
results.each do |result|
|
|
53
|
+
result[:text] = retryable_translate(result[:text])
|
|
54
|
+
@writer.overwrites(result)
|
|
55
|
+
@progress_bar.increment if @loggable
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
puts "Quest translation completed!"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# ディレクトリ内のJSONファイルを翻訳して出力する
|
|
62
|
+
#
|
|
63
|
+
# @param [String] dir_path ディレクトリのパス
|
|
64
|
+
# @param [Boolean] loggable 翻訳ログを出力するか
|
|
65
|
+
# @return [void]
|
|
66
|
+
def perform_directory(dir_path: "quest_giver", loggable: true)
|
|
67
|
+
puts "Performing directory: #{dir_path}" unless loggable
|
|
68
|
+
dir_path = File.expand_path(dir_path)
|
|
69
|
+
validate_path(dir_path)
|
|
70
|
+
|
|
71
|
+
json_files = Dir.glob("#{dir_path}/**/*.json")
|
|
72
|
+
if json_files.empty?
|
|
73
|
+
puts "JSON files not found in: #{dir_path}"
|
|
74
|
+
return
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
json_files.each { |file_path| perform(file_path, loggable: loggable) }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# ファイルの存在性のバリデーション
|
|
81
|
+
#
|
|
82
|
+
# @param [String] path ファイルのパス
|
|
83
|
+
# @return [void]
|
|
84
|
+
def validate_path(path)
|
|
85
|
+
path = File.expand_path(path)
|
|
86
|
+
raise ModpackLocalizer::PathNotFoundError.new(path) unless File.exist?(path)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
private
|
|
90
|
+
|
|
91
|
+
def retryable_translate(text)
|
|
92
|
+
retries = 0
|
|
93
|
+
begin
|
|
94
|
+
TranslationAPI.translate(text)
|
|
95
|
+
rescue StandardError => e
|
|
96
|
+
retries += 1
|
|
97
|
+
raise e unless retries <= MAX_RETRIES
|
|
98
|
+
|
|
99
|
+
sleep_time = sleep_time(retries)
|
|
100
|
+
puts "Translation failed, retrying... (#{retries}/#{MAX_RETRIES}) waiting #{sleep_time.round(2)} seconds"
|
|
101
|
+
sleep(sleep_time)
|
|
102
|
+
retry
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def sleep_time(retries)
|
|
107
|
+
[BASE_DELAY * (retries**2), MAX_SLEEP].min
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# プログレスバーを初期化する
|
|
111
|
+
#
|
|
112
|
+
# @param [String] file_path ファイルのパス
|
|
113
|
+
# @param [Integer] length プログレスバーの長さ
|
|
114
|
+
# @return [void]
|
|
115
|
+
def init_progress_bar(file_path, length)
|
|
116
|
+
@progress_bar = ModpackLocalizer.create_progress_bar(file_path, length)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
|
|
3
|
+
module ModpackLocalizer
|
|
4
|
+
module QuestGiver
|
|
5
|
+
# Quest GiverのJSONファイルから翻訳対象テキストを抽出するクラス
|
|
6
|
+
class Reader
|
|
7
|
+
TRANSLATABLE_PATHS = [
|
|
8
|
+
%w[start title text],
|
|
9
|
+
%w[start description text],
|
|
10
|
+
%w[complete title text],
|
|
11
|
+
%w[complete description text]
|
|
12
|
+
].freeze
|
|
13
|
+
|
|
14
|
+
# JSONファイルから翻訳対象テキストを抽出する
|
|
15
|
+
#
|
|
16
|
+
# @param [String] file_path ファイルのパス
|
|
17
|
+
# @return [Array<Hash>] 翻訳対象テキストの配列
|
|
18
|
+
def extract_all(file_path)
|
|
19
|
+
json = JSON.parse(File.read(file_path))
|
|
20
|
+
|
|
21
|
+
TRANSLATABLE_PATHS.filter_map do |keys|
|
|
22
|
+
value = json.dig(*keys)
|
|
23
|
+
next unless value
|
|
24
|
+
|
|
25
|
+
{ type: :quest_giver, path: keys.join("."), text: value }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
|
|
3
|
+
module ModpackLocalizer
|
|
4
|
+
module QuestGiver
|
|
5
|
+
# Quest GiverのJSONファイルに翻訳済みテキストを書き戻すクラス
|
|
6
|
+
class Writer
|
|
7
|
+
# @param [String] file_path ファイルのパス
|
|
8
|
+
# @return [ModpackLocalizer::QuestGiver::Writer]
|
|
9
|
+
def initialize(file_path)
|
|
10
|
+
@input_file_path = file_path
|
|
11
|
+
@output_file_path = file_path.gsub("quest_giver/", "output/quest_giver/")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# 翻訳済みテキストでJSONを上書きする
|
|
15
|
+
#
|
|
16
|
+
# @param [Hash] translated_content 翻訳済みの内容
|
|
17
|
+
# @return [void]
|
|
18
|
+
def overwrites(translated_content)
|
|
19
|
+
FileUtils.mkdir_p(File.dirname(@output_file_path))
|
|
20
|
+
|
|
21
|
+
json = JSON.parse(File.read(first_overwrite? ? @input_file_path : @output_file_path))
|
|
22
|
+
keys = translated_content[:path].split(".")
|
|
23
|
+
dig_and_set(json, keys, translated_content[:text])
|
|
24
|
+
|
|
25
|
+
File.open(@output_file_path, "w") do |file|
|
|
26
|
+
file.puts JSON.pretty_generate(json)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
# ネストされたハッシュの指定パスに値をセットする
|
|
33
|
+
#
|
|
34
|
+
# @param [Hash] hash 対象のハッシュ
|
|
35
|
+
# @param [Array<String>] keys パスのキー配列
|
|
36
|
+
# @param [String] value セットする値
|
|
37
|
+
# @return [void]
|
|
38
|
+
def dig_and_set(hash, keys, value)
|
|
39
|
+
parent = hash.dig(*keys[0..-2])
|
|
40
|
+
parent[keys.last] = value
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# 最初の上書きかどうか
|
|
44
|
+
#
|
|
45
|
+
# @return [Boolean]
|
|
46
|
+
def first_overwrite?
|
|
47
|
+
!File.exist?(@output_file_path)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
data/lib/modpack_localizer.rb
CHANGED
|
@@ -5,6 +5,7 @@ require_relative "modpack_localizer/util/version"
|
|
|
5
5
|
require_relative "modpack_localizer/util/help"
|
|
6
6
|
require_relative "modpack_localizer/snbt/performer"
|
|
7
7
|
require_relative "modpack_localizer/jar/performer"
|
|
8
|
+
require_relative "modpack_localizer/quest_giver/performer"
|
|
8
9
|
|
|
9
10
|
# SNBT形式のファイルを翻訳する
|
|
10
11
|
# 翻訳できるプロパティ
|
|
@@ -25,6 +26,7 @@ module ModpackLocalizer
|
|
|
25
26
|
performers << ModpackLocalizer::JAR::Performer.new(
|
|
26
27
|
language:, country:, locale_code:, display_help: false
|
|
27
28
|
)
|
|
29
|
+
performers << ModpackLocalizer::QuestGiver::Performer.new(language:, display_help: false)
|
|
28
30
|
|
|
29
31
|
if threadable
|
|
30
32
|
threads = performers.map { Thread.new { it.perform_directory(loggable: false) } }
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: modpack_localizer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- milkeclair
|
|
@@ -144,6 +144,9 @@ files:
|
|
|
144
144
|
- lib/modpack_localizer/jar/performer.rb
|
|
145
145
|
- lib/modpack_localizer/jar/reader.rb
|
|
146
146
|
- lib/modpack_localizer/jar/writer.rb
|
|
147
|
+
- lib/modpack_localizer/quest_giver/performer.rb
|
|
148
|
+
- lib/modpack_localizer/quest_giver/reader.rb
|
|
149
|
+
- lib/modpack_localizer/quest_giver/writer.rb
|
|
147
150
|
- lib/modpack_localizer/snbt/description_extractor.rb
|
|
148
151
|
- lib/modpack_localizer/snbt/formatter.rb
|
|
149
152
|
- lib/modpack_localizer/snbt/performer.rb
|
|
@@ -155,7 +158,6 @@ files:
|
|
|
155
158
|
- lib/modpack_localizer/util/help.rb
|
|
156
159
|
- lib/modpack_localizer/util/indent_helper.rb
|
|
157
160
|
- lib/modpack_localizer/util/version.rb
|
|
158
|
-
- rake_helper.rb
|
|
159
161
|
- sig/jp_quest.rbs
|
|
160
162
|
homepage: https://github.com/milkeclair/modpack_localizer
|
|
161
163
|
licenses:
|
data/rake_helper.rb
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
class RakeHelper
|
|
4
|
-
GITHUB_PACKAGES_PUSH_COMMAND =
|
|
5
|
-
"gem push --key github --host https://rubygems.pkg.github.com/milkeclair " \
|
|
6
|
-
"pkg/modpack_localizer-#{ModpackLocalizer::VERSION}.gem".freeze
|
|
7
|
-
|
|
8
|
-
RUBYGEMS_PUSH_COMMAND =
|
|
9
|
-
"gem push --host https://rubygems.org " \
|
|
10
|
-
"pkg/modpack_localizer-#{ModpackLocalizer::VERSION}.gem".freeze
|
|
11
|
-
|
|
12
|
-
def self.init_rake_tasks
|
|
13
|
-
RSpec::Core::RakeTask.new(:spec) { |task| task.verbose = false }
|
|
14
|
-
RuboCop::RakeTask.new
|
|
15
|
-
YARD::Rake::YardocTask.new
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def self.build_gem
|
|
19
|
-
abort("gemのビルドに失敗しました") unless system("rake build")
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def self.push_to_github_packages
|
|
23
|
-
abort("githubへのgemのpushに失敗しました") unless system(GITHUB_PACKAGES_PUSH_COMMAND)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def self.push_to_rubygems
|
|
27
|
-
abort("rubygemsへのgemのpushに失敗しました") unless system(RUBYGEMS_PUSH_COMMAND)
|
|
28
|
-
end
|
|
29
|
-
end
|