Module: Pod::MPAAS::Localization
- Defined in:
- lib/cocoapods-mPaaS/localization.rb
Class Method Summary collapse
-
.config_file_path ⇒ Object
定义配置文件的路径.
- .current_language ⇒ Object
-
.detect_system_language ⇒ Object
尝试获取并规范化系统语言.
-
.internal_verbose? ⇒ Boolean
用于控制内部调试日志的开关,通过环境变量 MPAAS_DEBUG_LOGS=true 开启.
-
.load_config ⇒ Object
加载配置.
-
.load_translations(language_code) ⇒ Object
————————————————————- 以下是语言加载和设置逻辑 ————————————————————-.
-
.save_config(config_data) ⇒ Object
保存配置.
- .set_language(language_code) ⇒ Object
-
.t(key, **options) ⇒ Object
查找本地化字符串的核心方法.
Class Method Details
.config_file_path ⇒ Object
定义配置文件的路径
18 19 20 |
# File 'lib/cocoapods-mPaaS/localization.rb', line 18 def self.config_file_path Pathname.new(Dir.home) + '.cocoapods' + 'mpaas_config.yml' end |
.current_language ⇒ Object
148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/cocoapods-mPaaS/localization.rb', line 148 def self.current_language return @current_language if @current_language config = load_config saved_language = config['language'] return saved_language if saved_language && !saved_language.empty? system_language = detect_system_language return system_language if system_language @fallback_language end |
.detect_system_language ⇒ Object
尝试获取并规范化系统语言
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/cocoapods-mPaaS/localization.rb', line 57 def self.detect_system_language # Use debug logs for tracing language detection puts "find_language_detect: --- Entering detect_system_language method ---" if internal_verbose? lang_env = ENV['LANG'] || ENV['LC_ALL'] || ENV['LANGUAGE'] puts "find_language_detect: Raw language environment variable: '#{lang_env}'" if internal_verbose? if lang_env base_lang = lang_env.split('.').first.split('_').first.downcase puts "find_language_detect: Detected base language: '#{base_lang}'" if internal_verbose? case base_lang when 'zh' lang_region = lang_env.split('.').first.split('_').last.downcase puts "find_language_detect: Detected Chinese region: '#{lang_region}'" if internal_verbose? # Explicitly choose Simplified Chinese if ['cn', 'hans', 'tw', 'hk', 'hant'].include?(lang_region) # Treat all Chinese variants as Simplified Chinese for now puts "find_language_detect: Normalized Chinese to 'zh-Hans'." if internal_verbose? 'zh-Hans' else puts "find_language_detect: Unrecognized Chinese region, defaulting to 'zh-Hans'." if internal_verbose? 'zh-Hans' # Default all other Chinese to Simplified Chinese end when 'en' puts "find_language_detect: Detected English: 'en'." if internal_verbose? 'en' else # If the detected base language is neither 'zh' nor 'en', default to 'en' puts "find_language_detect: Unsupported base language '#{base_lang}', defaulting to 'en'." if internal_verbose? 'en' end else # If no language environment variable is found, default to 'en' puts "find_language_detect: No language environment variable found, defaulting to 'en'." if internal_verbose? 'en' end ensure puts "find_language_detect: --- Exiting detect_system_language method ---" if internal_verbose? end |
.internal_verbose? ⇒ Boolean
用于控制内部调试日志的开关,通过环境变量 MPAAS_DEBUG_LOGS=true 开启
13 14 15 |
# File 'lib/cocoapods-mPaaS/localization.rb', line 13 def self.internal_verbose? ENV['MPAAS_DEBUG_LOGS'] == 'true' end |
.load_config ⇒ Object
加载配置
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/cocoapods-mPaaS/localization.rb', line 23 def self.load_config path = config_file_path if path.exist? begin config_data = YAML.load_file(path.to_s) || {} # 内部调试信息,使用 Ruby puts puts "MPAAS (Internal): Loaded config from '#{path}'." if internal_verbose? config_data rescue Psych::SyntaxError => e # 用户可见的警告信息,使用防御性写法 (defined?(Pod::UI) ? Pod::UI : Kernel).warn "MPAAS: Failed to parse config file '#{path}': #{e.}. Using default settings." {} end else puts "MPAAS (Internal): Config file not found at '#{path}'." if internal_verbose? {} end end |
.load_translations(language_code) ⇒ Object
以下是语言加载和设置逻辑
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/cocoapods-mPaaS/localization.rb', line 102 def self.load_translations(language_code) return if @translations[language_code] locales_dir = Pathname.new(__FILE__).dirname + 'locales' file_path = locales_dir + "#{language_code}.yml" if file_path.exist? begin @translations[language_code] = YAML.load_file(file_path.to_s) puts "MPAAS (Internal): Loaded translations for '#{language_code}'." if internal_verbose? rescue Psych::SyntaxError => e (defined?(Pod::UI) ? Pod::UI : Kernel).warn "MPAAS: Failed to parse locale file '#{file_path}': #{e.}" @translations[language_code] = {} end else (defined?(Pod::UI) ? Pod::UI : Kernel).warn "MPAAS: No locale file found for '#{language_code}' at '#{file_path}'." @translations[language_code] = {} end end |
.save_config(config_data) ⇒ Object
保存配置
43 44 45 46 47 48 49 50 |
# File 'lib/cocoapods-mPaaS/localization.rb', line 43 def self.save_config(config_data) path = config_file_path FileUtils.mkdir_p(path.dirname) unless path.dirname.exist? # 确保目录存在 File.write(path.to_s, config_data.to_yaml) puts "MPAAS (Internal): Saved config to '#{path}'." if internal_verbose? rescue => e (defined?(Pod::UI) ? Pod::UI : Kernel).warn "MPAAS: Failed to save config to '#{path}': #{e.}" end |
.set_language(language_code) ⇒ Object
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/cocoapods-mPaaS/localization.rb', line 122 def self.set_language(language_code) normalized_language = language_code.to_s if @translations[normalized_language].nil? load_translations(normalized_language) end if @translations[normalized_language].nil? || @translations[normalized_language][normalized_language].nil? (defined?(Pod::UI) ? Pod::UI : Kernel).warn "MPAAS: Language '#{language_code}' not fully supported, falling back to '#{@fallback_language}'." load_translations(@fallback_language) unless @translations[@fallback_language] @current_language = @fallback_language else @current_language = normalized_language end config = load_config config['language'] = @current_language save_config(config) # 这里的日志可以根据需要决定是否也使用 internal_verbose? # 如果你希望用户在 --verbose 模式下也能看到这个确认信息,那就用 Pod::UI.puts # 否则就用 puts internal_verbose? # 这里我暂时保持为 internal_verbose? puts "MPAAS (Internal): Current plugin language set to '#{@current_language}'." if internal_verbose? end |
.t(key, **options) ⇒ Object
查找本地化字符串的核心方法
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/cocoapods-mPaaS/localization.rb', line 162 def self.t(key, **) puts "find_language_path: --- 进入 t 方法 ---" if internal_verbose? puts "find_language_path: 接收到的键 (key): '#{key}'" if internal_verbose? puts "find_language_path: 接收到的选项 (options): #{.inspect}" if internal_verbose? path_elements = key.to_s.split('.') puts "find_language_path: 从键中解析出的路径元素: #{path_elements.inspect}" if internal_verbose? actual_current_lang = current_language puts "find_language_path: 确定的实际当前语言: '#{actual_current_lang}'" if internal_verbose? # 获取当前语言或回退语言的原始已加载翻译数据 loaded_translations_for_lang = @translations[actual_current_lang] if loaded_translations_for_lang.nil? # 如果当前语言未加载,尝试回退语言 puts "find_language_path: '#{actual_current_lang}' 的翻译未直接加载。尝试回退语言。" if internal_verbose? loaded_translations_for_lang = @translations[@fallback_language] end # --- 关键修复在这里 --- # 'en:' 或 'zh-Hans:' 这样的键是加载的 YAML 文件的根。 # 我们需要进入这个键内部,才能获取实际用于查找的内容。 if loaded_translations_for_lang.is_a?(Hash) && loaded_translations_for_lang.key?(actual_current_lang) current_hash = loaded_translations_for_lang[actual_current_lang] puts "find_language_path: 初始查找哈希设置为 '#{actual_current_lang}' 键的内容: #{current_hash.inspect[0..100]}..." if internal_verbose? elsif loaded_translations_for_lang.is_a?(Hash) && loaded_translations_for_lang.key?(@fallback_language) && actual_current_lang != @fallback_language # 如果使用了回退语言且它也有自己的根键 current_hash = loaded_translations_for_lang[@fallback_language] puts "find_language_path: 初始查找哈希设置为回退语言 '#{@fallback_language}' 键的内容: #{current_hash.inspect[0..100]}..." if internal_verbose? else # 如果无论如何都找不到有效的根语言键 puts "find_language_path: !!! 错误: 在加载的翻译中,找不到 '#{actual_current_lang}' 或回退语言的有效根语言键。" if internal_verbose? (defined?(Pod::UI) ? Pod::UI : Kernel).warn "MPAAS: 在加载的翻译中,找不到 '#{key}' 的有效根语言键。" return "MISSING_TRANSLATION_ROOT_#{key}" # 添加一个更明确的错误提示 end # --- 关键修复结束 --- path_elements.each_with_index do |elem, index| puts "find_language_path: 级别 #{index + 1}: 查找元素 '#{elem}'" if internal_verbose? if current_hash.is_a?(Hash) && current_hash.key?(elem) current_hash = current_hash[elem] puts "find_language_path: 找到元素 '#{elem}'。当前哈希/值: #{current_hash.inspect[0..100]}..." if internal_verbose? else # 调试输出:找不到键时的详细信息 puts "find_language_path: !!! 错误: 在此级别未找到键元素 '#{elem}'。" if internal_verbose? puts "find_language_path: !!! 查找失败时的当前哈希: #{current_hash.inspect}" if internal_verbose? puts "find_language_path: !!! 完整的键查找路径: '#{key}'" if internal_verbose? (defined?(Pod::UI) ? Pod::UI : Kernel).warn "MPAAS: 语言 '#{actual_current_lang}' 缺少翻译键 '#{key}'。" return "MISSING_TRANSLATION_#{key}" end end # 调试输出:最终找到的值 puts "find_language_path: 为键 '#{key}' 找到的最终值: #{current_hash.inspect}" if internal_verbose? if current_hash.is_a?(String) begin result = sprintf(current_hash, ) puts "find_language_path: 成功插值字符串: '#{result}'" if internal_verbose? result rescue ArgumentError => e # 调试输出:sprintf 错误 puts "find_language_path: !!! 错误: 键 '#{key}' 的 sprintf 插值失败。错误: #{e.}" if internal_verbose? (defined?(Pod::UI) ? Pod::UI : Kernel).warn "MPAAS: 翻译 '#{key}' 的插值失败。错误: #{e.}" current_hash # 返回原始字符串,作为备用 end else # 调试输出:翻译类型错误 puts "find_language_path: !!! 错误: 键 '#{key}' 的翻译不是字符串。类型: #{current_hash.class}" if internal_verbose? (defined?(Pod::UI) ? Pod::UI : Kernel).warn "MPAAS: 翻译 '#{key}' 不是字符串。" "INVALID_TRANSLATION_TYPE_#{key}" end ensure puts "find_language_path: --- 退出 t 方法 ---" if internal_verbose? end |