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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 432e408e2125a8379f22bafaac9978bd66a49d8b1a5f28b67ceeffa798072b19
4
- data.tar.gz: 7246397c776845ef002ef257e622378062383976a27389d50b202cc1b8292a35
3
+ metadata.gz: d6f6f78477a00a2dccb3a91ac06b4ae16eef6a6e9183e7c439ed20c6d3756311
4
+ data.tar.gz: 6eaf4b967aa2b9203b05f52d963054f86df9a3549dee9cc4ec9a8db8f4a4e54a
5
5
  SHA512:
6
- metadata.gz: 0a86d37bdaa62557cf9d3334c8ff38fc6d22b70ac2d24eda086585bf8ac6cf0ef8158bdbfeb8166b73b4d14b1e0841203cec2f093e565fe73a50499c9f59c7fd
7
- data.tar.gz: 60b55d5f89a29403d3a269bd96d11132a39916b183b197123292256348496e0edcbbdf5cfc233a57ac9307b9b80fe224d59ab8fca53e095529b531aec1a10105
6
+ metadata.gz: ff6c2808e247f65516ffa0e18751715562950c347683114979411ad32aaa5ff459d48684e2d0d2110f50210a4a8d13651414ff5c06e4fd61c4f9593285586ca3
7
+ data.tar.gz: 75be66f8d7d0b074c355921072cfbede46a2f687893d6c4d4e7ec79e2b75f799e1d5edc458f5023ec8f532e73f8943912f999f0e17c4eafde00b41e0f44c345d
data/CHANGELOG.md CHANGED
@@ -104,3 +104,8 @@
104
104
  ## [0.5.1] - 2025-11-23
105
105
 
106
106
  - snbtの上書きをするとき、取得するテキストのプロパティ名が間違っていたのを修正
107
+
108
+ ## [0.6.0] - 2025-11-24
109
+
110
+ - quest giverの翻訳機能を追加
111
+ - DawnCraftなどのmodpackに対応
data/Rakefile CHANGED
@@ -1,39 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
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
@@ -2,9 +2,9 @@ some code change
2
2
  version.rb change
3
3
  changelog.md change
4
4
 
5
- $rake analysis
5
+ $rake gem:check
6
6
 
7
7
  $git commit
8
8
  $git push
9
9
 
10
- $rake push
10
+ $rake gem:push
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ModpackLocalizer
4
- VERSION = "0.5.1"
4
+ VERSION = "0.6.0"
5
5
  end
@@ -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.5.1
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