modpack_localizer 0.3.0 → 0.5.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: 7f13f2c6fd8dc427ef0ded277221af4bb2a7a8164fe6c6806b201191019895da
4
- data.tar.gz: ef0bf6ac23c510d803cf475bbd182fc363d7ff0b5f0ad61a6751a404e1984cf2
3
+ metadata.gz: e9147b02f5b6012f60cce0708bd2431b16983e857b1b1e91dcde22bb0d83734b
4
+ data.tar.gz: fd66110285400a00d87421ba9ad2927b6fb5a036037ab56cda2354963bf44407
5
5
  SHA512:
6
- metadata.gz: 1b50f988c2ae70627ba364af939f5f1449dbd6e08da679f27d7d0de4b347938f616ebe624ac22056f3ae9789576aa50bff145fb375f01d63f81e8306e3012090
7
- data.tar.gz: e7081706ed393f3ce188b89dd5b2f0f6a2f2c2d02f0484665b4ef59e771dfc5722bb832851a7f4baf3e0a650e84b061bc7e86b2c8ec8f8310af01e0b95743d32
6
+ metadata.gz: '07348b4470777efd7ede2f88b1ed6eb0d18b4fed4b982eff8a87d1edde93b4860a45fbaea50570e9b0603e98822b77d523b3e0de507c13f7967e9f54989962ab'
7
+ data.tar.gz: e0afb02710d8da14e886d9dd9e69f8909b32a408424d734a26e41a24a1176f29a47260a66486f515733225fe253bc2e71f405d5333ef1ad90b7b6b98112c5567
data/CHANGELOG.md CHANGED
@@ -84,3 +84,19 @@
84
84
 
85
85
  - gem更新
86
86
  - TranslationAPIの扱いが変わったのに伴い、コードを修正
87
+
88
+ ## [0.4.0] - 2025-11/20
89
+
90
+ - 翻訳APIの呼び出しが失敗した場合にリトライする機能を強化
91
+ - 指数関数バックオフを導入
92
+ - 最大リトライ回数を増加
93
+ - IO::TimeoutError以外の例外もリトライ対象に追加
94
+ - 翻訳APIの独自エラーとかに対応するため
95
+ - いくつかのライブラリを最新化
96
+
97
+ ## [0.5.0] - 2025-11-23
98
+
99
+ - プロバイダーを選べるようにdotenvを追加
100
+ - TranslationAPIの設定にカスタムプロンプトを追加できるようにした
101
+ - プロンプトに「プロパティアクセスは翻訳しないでください。例: obj.property.child」を追加するように変更
102
+ - これにより、ftbquestのプロパティアクセスが翻訳されてしまう問題を軽減
data/README.md CHANGED
@@ -16,12 +16,11 @@ or if no specific configs required
16
16
 
17
17
  1. Download [release](https://github.com/milkeclair/modpack_localizer/releases)
18
18
  2. Make `.env` file
19
- 3. Add `OPENAI_API_KEY=your_api_key` to `.env`
20
- 4. Optional: Add `OPENAI_MODEL=some_openai_model` to `.env`
21
- 5. Add `some.snbt` or `quests` directory contents to `quests` directory
22
- 6. Add `some.jar` files to `mods` directory
23
- 7. Double click `start.bat` file
24
- 8. Check `output` directory
19
+ 3. Add your API keys to `.env` file [see](https://github.com/milkeclair/translation_api)
20
+ 4. Add `some.snbt` or `quests` directory contents to `quests` directory
21
+ 5. Add `some.jar` files to `mods` directory
22
+ 6. Double click `start.bat` file
23
+ 7. Check `output` directory
25
24
 
26
25
  ## Options for omakase method
27
26
 
data/dist/example.rb CHANGED
@@ -1,5 +1,10 @@
1
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: nil, threadable: true)
5
+ begin
6
+ ModpackLocalizer.omakase
7
+ rescue StandardError => e
8
+ puts e
9
+ puts e.backtrace
10
+ end
@@ -1,3 +1,4 @@
1
+ require "dotenv"
1
2
  require "translation_api"
2
3
  require_relative "../util/help"
3
4
  require_relative "../util/error"
@@ -8,6 +9,12 @@ module ModpackLocalizer
8
9
  module JAR
9
10
  # .jarの翻訳を実行するクラス
10
11
  class Performer
12
+ Dotenv.load
13
+
14
+ MAX_RETRIES = 8
15
+ BASE_DELAY = 5
16
+ MAX_SLEEP = 256
17
+
11
18
  # locale_codeを指定する場合、countryの指定は不要
12
19
  #
13
20
  # @param [Boolean] output_logs APIのログを出力するか
@@ -21,12 +28,7 @@ module ModpackLocalizer
21
28
  output_logs: true, except_words: [], language: "Japanese",
22
29
  country: "Japan", locale_code: nil, display_help: true
23
30
  )
24
- TranslationAPI.configure do |config|
25
- config.output_logs = output_logs
26
- config.language = language
27
- config.except_words = except_words
28
- config.provider = :openai
29
- end
31
+ configure_translation_api(output_logs:, except_words:, language:)
30
32
 
31
33
  @language, @country_name, @locale_code = language, country, locale_code
32
34
  @reader, @writer, @progress_bar, @loggable, @tierdown = nil
@@ -83,6 +85,18 @@ module ModpackLocalizer
83
85
 
84
86
  private
85
87
 
88
+ def configure_translation_api(
89
+ output_logs: true, except_words: [], language: "Japanese"
90
+ )
91
+ TranslationAPI.configure do |config|
92
+ config.output_logs = output_logs
93
+ config.language = language.downcase
94
+ config.except_words = except_words
95
+ config.provider = ENV["PROVIDER"]&.to_sym || :openai
96
+ config.custom_prompt = "Never translate property access. Example: obj.property.child"
97
+ end
98
+ end
99
+
86
100
  # ReaderとWriterを初期化する
87
101
  #
88
102
  # @params [String] file_path ファイルのパス
@@ -118,12 +132,13 @@ module ModpackLocalizer
118
132
  retries = 0
119
133
  begin
120
134
  lang_data.json[key] = TranslationAPI.translate(value)
121
- rescue IO::TimeoutError => e
135
+ rescue StandardError => e
122
136
  retries += 1
123
- raise e unless retries <= 3
137
+ raise e unless retries <= MAX_RETRIES
124
138
 
125
- puts "Connection failed, retrying... (#{retries}/3)"
126
- sleep(2)
139
+ sleep_time = sleep_time(retries)
140
+ puts "Translation failed, retrying... (#{retries}/#{MAX_RETRIES}) waiting #{sleep_time.round(2)} seconds"
141
+ sleep(sleep_time)
127
142
  retry
128
143
  end
129
144
  @progress_bar.increment if @loggable
@@ -153,6 +168,10 @@ module ModpackLocalizer
153
168
  "#{camelize(lang_data.mod_name)} already has #{@reader.extract_file_name(lang_data.file_name)} file."
154
169
  end
155
170
 
171
+ def sleep_time(retries)
172
+ [BASE_DELAY * (retries**2), MAX_SLEEP].min
173
+ end
174
+
156
175
  def camelize(str)
157
176
  str.split("_").map(&:capitalize).join
158
177
  end
@@ -1,3 +1,4 @@
1
+ require "dotenv"
1
2
  require "translation_api"
2
3
  require_relative "../util/help"
3
4
  require_relative "../util/error"
@@ -8,6 +9,12 @@ module ModpackLocalizer
8
9
  module SNBT
9
10
  # .snbtの翻訳を実行するクラス
10
11
  class Performer
12
+ Dotenv.load
13
+
14
+ MAX_RETRIES = 8
15
+ BASE_DELAY = 5
16
+ MAX_SLEEP = 256
17
+
11
18
  # @param [Boolean] output_logs APIのログを出力するか
12
19
  # @param [Array<String>] except_words 翻訳しない単語
13
20
  # @param [String] language 言語
@@ -15,10 +22,11 @@ module ModpackLocalizer
15
22
  # @return [ModpackLocalizer::SNBT::Performer]
16
23
  def initialize(output_logs: true, except_words: [], language: "Japanese", display_help: true)
17
24
  TranslationAPI.configure do |config|
18
- config.output_logs = output_logs
19
- config.language = language
20
- config.except_words = except_words
21
- config.provider = :openai
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"
22
30
  end
23
31
 
24
32
  @reader, @writer, @progress_bar, @loggable = nil
@@ -41,7 +49,7 @@ module ModpackLocalizer
41
49
  init_progress_bar(file_path, results.length) if @loggable
42
50
 
43
51
  results.each do |result|
44
- result[:text] = TranslationAPI.translate(result[:text])
52
+ result[:snbt] = retryable_translate(result[:text])
45
53
  @writer.overwrites(result)
46
54
  @progress_bar.increment if @loggable
47
55
  end
@@ -80,6 +88,25 @@ module ModpackLocalizer
80
88
 
81
89
  private
82
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
+
83
110
  # プログレスバーを初期化する
84
111
  #
85
112
  # @param [String] file_path ファイルのパス
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ModpackLocalizer
4
- VERSION = "0.3.0"
4
+ VERSION = "0.5.0"
5
5
  end
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.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - milkeclair
@@ -23,6 +23,20 @@ dependencies:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: dotenv
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
26
40
  - !ruby/object:Gem::Dependency
27
41
  name: iso-639
28
42
  requirement: !ruby/object:Gem::Requirement