Module: Pod::MPAAS::Localization

Defined in:
lib/cocoapods-mPaaS/localization.rb

Class Method Summary collapse

Class Method Details

.config_file_pathObject

定义配置文件的路径



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_languageObject



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_languageObject

尝试获取并规范化系统语言



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 开启

Returns:

  • (Boolean)


13
14
15
# File 'lib/cocoapods-mPaaS/localization.rb', line 13

def self.internal_verbose?
  ENV['MPAAS_DEBUG_LOGS'] == 'true'
end

.load_configObject

加载配置



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.message}. 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.message}"
      @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.message}"
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, **options)
  puts "find_language_path: --- 进入 t 方法 ---" if internal_verbose?
  puts "find_language_path: 接收到的键 (key): '#{key}'" if internal_verbose?
  puts "find_language_path: 接收到的选项 (options): #{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, options)
      puts "find_language_path: 成功插值字符串: '#{result}'" if internal_verbose?
      result
    rescue ArgumentError => e
      # 调试输出:sprintf 错误
      puts "find_language_path: !!! 错误: 键 '#{key}' 的 sprintf 插值失败。错误: #{e.message}" if internal_verbose?
      (defined?(Pod::UI) ? Pod::UI : Kernel).warn "MPAAS: 翻译 '#{key}' 的插值失败。错误: #{e.message}"
      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