modpack_localizer 0.2.2 → 0.4.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: 3c06947242fa41e3168f31ff9a7fac602258607b98967523606ca9d2063af614
4
- data.tar.gz: b8ea9b7c99e8b916c0d21e8b6bad01c3a9fe633febe26895439c267f1cb27a9c
3
+ metadata.gz: bd0e40db750b08a99dbfd2dc80874dd7b1d4d261c056065cd5c75b7170df3bca
4
+ data.tar.gz: 7519fd5249a41610da57bfdaad1a9f8c3b72c368bc91b010a933a46b90e28948
5
5
  SHA512:
6
- metadata.gz: 96ca4f0d01d40e217af463fd844a313ddfbf9947734e00af95fc133510edac760d629302a45bebaa05d657d934a9a8cf705528a9e3c897d1581ec86c748a765f
7
- data.tar.gz: 589430e04193506f1f1088cd4664997caaa7a6e6db57b4a0905e5d83c80aba2f76d44759951df6f8942d9a06ded7683de4ba4511dd0de5d48378a28c2ffae589
6
+ metadata.gz: 6b8a6941c0f3d19401f474af07b946aedc816ba570735f0172deed0cc5963894dd7393ced1f69a8403b4c2975b5ae2f907856990f73c11304147f85a6e65c068
7
+ data.tar.gz: '04508e54b5f5a2237e00d39693d1b48b37fcdc9b144df426b5693d3a2cba3203086093559187501c279640beb81086011300c318410bdee554f4503f763865e4'
data/CHANGELOG.md CHANGED
@@ -78,4 +78,18 @@
78
78
 
79
79
  ## [0.2.2] - 2025-08/03
80
80
 
81
- - コネクションがエラーになった場合にリトライするように改善
81
+ - コネクションがエラーになった場合にリトライするように改善
82
+
83
+ ## [0.3.0] - 2025-11/10
84
+
85
+ - gem更新
86
+ - TranslationAPIの扱いが変わったのに伴い、コードを修正
87
+
88
+ ## [0.4.0] - 2025-11/20
89
+
90
+ - 翻訳APIの呼び出しが失敗した場合にリトライする機能を強化
91
+ - 指数関数バックオフを導入
92
+ - 最大リトライ回数を増加
93
+ - IO::TimeoutError以外の例外もリトライ対象に追加
94
+ - 翻訳APIの独自エラーとかに対応するため
95
+ - いくつかのライブラリを最新化
data/README.md CHANGED
@@ -17,7 +17,7 @@ or if no specific configs required
17
17
  1. Download [release](https://github.com/milkeclair/modpack_localizer/releases)
18
18
  2. Make `.env` file
19
19
  3. Add `OPENAI_API_KEY=your_api_key` to `.env`
20
- 4. Optional: Add `OPENAI_MODEL=some_openai_model` to `.env` **(default: gpt-4o-mini)**
20
+ 4. Optional: Add `OPENAI_MODEL=some_openai_model` to `.env`
21
21
  5. Add `some.snbt` or `quests` directory contents to `quests` directory
22
22
  6. Add `some.jar` files to `mods` directory
23
23
  7. Double click `start.bat` file
data/dist/example.rb CHANGED
@@ -1,13 +1,5 @@
1
- # require "modpack_localizer"
1
+ require "modpack_localizer"
2
2
 
3
- # ModpackLocalizer.omakase(language: "English")
3
+ ModpackLocalizer.omakase(language: "English")
4
4
  # or
5
- # ModpackLocalizer.omakase(language: "Japanese", country: "Japan", locale_code: "ja_jp", threadable: true)
6
-
7
- require_relative "../lib/modpack_localizer"
8
-
9
- file_path = "dist/quests"
10
- language = "japanese"
11
-
12
- performer = ModpackLocalizer::SNBT::Performer.new(language: language)
13
- performer.perform_directory(dir_path: file_path)
5
+ ModpackLocalizer.omakase(language: "Japanese", country: "Japan", locale_code: nil, threadable: true)
@@ -8,6 +8,10 @@ module ModpackLocalizer
8
8
  module JAR
9
9
  # .jarの翻訳を実行するクラス
10
10
  class Performer
11
+ MAX_RETRIES = 8
12
+ BASE_DELAY = 5
13
+ MAX_SLEEP = 256
14
+
11
15
  # locale_codeを指定する場合、countryの指定は不要
12
16
  #
13
17
  # @param [Boolean] output_logs APIのログを出力するか
@@ -21,12 +25,13 @@ module ModpackLocalizer
21
25
  output_logs: true, except_words: [], language: "Japanese",
22
26
  country: "Japan", locale_code: nil, display_help: true
23
27
  )
24
- @translator = TranslationAPI::Mediator.new(
25
- output_logs: output_logs,
26
- except_words: except_words,
27
- language: language,
28
- agent: :openai
29
- )
28
+ TranslationAPI.configure do |config|
29
+ config.output_logs = output_logs
30
+ config.language = language
31
+ config.except_words = except_words
32
+ config.provider = :openai
33
+ end
34
+
30
35
  @language, @country_name, @locale_code = language, country, locale_code
31
36
  @reader, @writer, @progress_bar, @loggable, @tierdown = nil
32
37
 
@@ -116,13 +121,14 @@ module ModpackLocalizer
116
121
  lang_data.json.each do |key, value|
117
122
  retries = 0
118
123
  begin
119
- lang_data.json[key] = @translator.translate(value)
120
- rescue IO::TimeoutError => e
124
+ lang_data.json[key] = TranslationAPI.translate(value)
125
+ rescue StandardError => e
121
126
  retries += 1
122
- raise e unless retries <= 3
127
+ raise e unless retries <= MAX_RETRIES
123
128
 
124
- puts "Connection failed, retrying... (#{retries}/3)"
125
- sleep(2)
129
+ sleep_time = sleep_time(retries)
130
+ puts "Translation failed, retrying... (#{retries}/#{MAX_RETRIES}) waiting #{sleep_time.round(2)} seconds"
131
+ sleep(sleep_time)
126
132
  retry
127
133
  end
128
134
  @progress_bar.increment if @loggable
@@ -152,6 +158,10 @@ module ModpackLocalizer
152
158
  "#{camelize(lang_data.mod_name)} already has #{@reader.extract_file_name(lang_data.file_name)} file."
153
159
  end
154
160
 
161
+ def sleep_time(retries)
162
+ [BASE_DELAY * (retries**2), MAX_SLEEP].min
163
+ end
164
+
155
165
  def camelize(str)
156
166
  str.split("_").map(&:capitalize).join
157
167
  end
@@ -8,18 +8,23 @@ module ModpackLocalizer
8
8
  module SNBT
9
9
  # .snbtの翻訳を実行するクラス
10
10
  class Performer
11
+ MAX_RETRIES = 8
12
+ BASE_DELAY = 5
13
+ MAX_SLEEP = 256
14
+
11
15
  # @param [Boolean] output_logs APIのログを出力するか
12
16
  # @param [Array<String>] except_words 翻訳しない単語
13
17
  # @param [String] language 言語
14
18
  # @param [Boolean] display_help ヘルプを表示するか
15
19
  # @return [ModpackLocalizer::SNBT::Performer]
16
20
  def initialize(output_logs: true, except_words: [], language: "Japanese", display_help: true)
17
- @translator = TranslationAPI::Mediator.new(
18
- output_logs: output_logs,
19
- except_words: except_words,
20
- language: language,
21
- agent: :openai
22
- )
21
+ TranslationAPI.configure do |config|
22
+ config.output_logs = output_logs
23
+ config.language = language
24
+ config.except_words = except_words
25
+ config.provider = :openai
26
+ end
27
+
23
28
  @reader, @writer, @progress_bar, @loggable = nil
24
29
 
25
30
  ModpackLocalizer.help if display_help
@@ -40,7 +45,7 @@ module ModpackLocalizer
40
45
  init_progress_bar(file_path, results.length) if @loggable
41
46
 
42
47
  results.each do |result|
43
- result[:text] = @translator.translate(result[:text])
48
+ result[:snbt] = retryable_translate(result[:text])
44
49
  @writer.overwrites(result)
45
50
  @progress_bar.increment if @loggable
46
51
  end
@@ -79,6 +84,25 @@ module ModpackLocalizer
79
84
 
80
85
  private
81
86
 
87
+ def retryable_translate(text)
88
+ retries = 0
89
+ begin
90
+ TranslationAPI.translate(text)
91
+ rescue StandardError => e
92
+ retries += 1
93
+ raise e unless retries <= MAX_RETRIES
94
+
95
+ sleep_time = sleep_time(retries)
96
+ puts "Translation failed, retrying... (#{retries}/#{MAX_RETRIES}) waiting #{sleep_time.round(2)} seconds"
97
+ sleep(sleep_time)
98
+ retry
99
+ end
100
+ end
101
+
102
+ def sleep_time(retries)
103
+ [BASE_DELAY * (retries**2), MAX_SLEEP].min
104
+ end
105
+
82
106
  # プログレスバーを初期化する
83
107
  #
84
108
  # @param [String] file_path ファイルのパス
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ModpackLocalizer
4
- VERSION = "0.2.2"
4
+ VERSION = "0.4.0"
5
5
  end
@@ -21,13 +21,13 @@ module ModpackLocalizer
21
21
  # @param [Boolean] threadable quests, modsの翻訳を並列で行うか
22
22
  # @return [void]
23
23
  def self.omakase(language: "Japanese", country: "Japan", locale_code: nil, threadable: false)
24
- performers = [] << ModpackLocalizer::SNBT::Performer.new(language: language)
24
+ performers = [] << ModpackLocalizer::SNBT::Performer.new(language:)
25
25
  performers << ModpackLocalizer::JAR::Performer.new(
26
- language: language, country: country, locale_code: locale_code, display_help: false
26
+ language:, country:, locale_code:, display_help: false
27
27
  )
28
28
 
29
29
  if threadable
30
- threads = performers.map { |pfm| Thread.new { pfm.perform_directory(loggable: false) } }
30
+ threads = performers.map { Thread.new { it.perform_directory(loggable: false) } }
31
31
  threads.each(&:join)
32
32
  else
33
33
  performers.each(&:perform_directory)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modpack_localizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - milkeclair
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-08-02 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: countries
@@ -165,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  requirements: []
168
- rubygems_version: 3.6.2
168
+ rubygems_version: 3.6.9
169
169
  specification_version: 4
170
170
  summary: localize minecraft modpack
171
171
  test_files: []