cocoapods-aqara-localzedLoader 0.1.16 → 0.1.18
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 +4 -4
- data/lib/cocoapods-aqara-localzedLoader/DownloadNewLanguage.py +12 -89
- data/lib/cocoapods-aqara-localzedLoader/__pycache__/DownloadNewLanguage.cpython-310.pyc +0 -0
- data/lib/cocoapods-aqara-localzedLoader/gem_version.rb +1 -1
- data/lib/cocoapods-aqara-localzedLoader/ios_bundle_generate.rb +11 -16
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 117721b779a2b5b9b4248aec75a4686764850213a52bfbff7ee030da4c9db6c2
|
|
4
|
+
data.tar.gz: 62ab2138d5a2b2feeeae988fb3c9708246f8127a4a5ed6abb315a56fd177481f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4e4a48cb30a6165fd27c3a093527a3833e01563bc531cd2e62d4c05a864fa0670d054637ec4fcccd0e5710b6d42cdd76f088d76c7e5f3f52fd6d74e5d1fd3c00
|
|
7
|
+
data.tar.gz: 2f2ace5ab90667ec0929e8c5e66126839696d40bd69f4b8dc76f46271edb47586edb6039bdc9c5bb17ac6a55af19d276d6106589f592a5835526e8b894d19e65
|
|
@@ -3,9 +3,7 @@ import os, sys, stat
|
|
|
3
3
|
import time
|
|
4
4
|
import requests
|
|
5
5
|
import zipfile
|
|
6
|
-
import csv
|
|
7
6
|
from typing import Optional
|
|
8
|
-
from openpyxl import Workbook
|
|
9
7
|
|
|
10
8
|
|
|
11
9
|
######### 火山多语言 #############
|
|
@@ -268,30 +266,32 @@ class CrowdinPlatform():
|
|
|
268
266
|
os.remove(zip_path)
|
|
269
267
|
|
|
270
268
|
if self.project_id == DEFAULT_LIFE_PROJECT_ID:
|
|
271
|
-
|
|
272
|
-
if not csv_path:
|
|
273
|
-
raise FileNotFoundError(f"未找到 Life 项目的 CSV 文件: {output_dir}")
|
|
274
|
-
|
|
269
|
+
life_xlsx_path = os.path.join(output_dir, DEFAULT_LIFE_SOURCE_FILE_NAME)
|
|
275
270
|
xlsx_path = os.path.join(output_dir, DEFAULT_TARGET_FILE_NAME)
|
|
276
|
-
|
|
271
|
+
if not os.path.exists(life_xlsx_path):
|
|
272
|
+
raise FileNotFoundError(f"未找到 Life 项目的 Excel 文件: {life_xlsx_path}")
|
|
273
|
+
os.replace(life_xlsx_path, xlsx_path)
|
|
274
|
+
print(f"已将 Life 多语言文件重命名为: {xlsx_path}")
|
|
277
275
|
|
|
278
276
|
print(f"多语言文件已解压到: {output_dir}APP.xlsx")
|
|
279
277
|
|
|
280
278
|
DEFAULT_LEGACY_PROJECT_ID = "71"
|
|
281
279
|
DEFAULT_LIFE_PROJECT_ID = "85"
|
|
280
|
+
DEFAULT_LIFE_SOURCE_FILE_NAME = "APP_Life_APP.xlsx"
|
|
282
281
|
DEFAULT_TARGET_FILE_NAME = "APP.xlsx"
|
|
283
282
|
|
|
284
283
|
CROWDIN_PROJECTS = (
|
|
285
|
-
("crowdin_life.yml", DEFAULT_LIFE_PROJECT_ID),
|
|
286
|
-
("
|
|
284
|
+
("crowdin_life.yml", DEFAULT_LIFE_PROJECT_ID, "AqaraLife"),
|
|
285
|
+
("crowdin_space.yml", DEFAULT_LIFE_PROJECT_ID, "AqaraSpace"),
|
|
286
|
+
("crowdin.yml", DEFAULT_LEGACY_PROJECT_ID, "AqaraHome"),
|
|
287
287
|
)
|
|
288
288
|
|
|
289
289
|
|
|
290
290
|
def resolve_crowdin_project(localizable_path: str) -> tuple[Optional[str], Optional[str]]:
|
|
291
|
-
for config_name, project_id in CROWDIN_PROJECTS:
|
|
291
|
+
for config_name, project_id, app_dir in CROWDIN_PROJECTS:
|
|
292
292
|
candidate_paths = (
|
|
293
293
|
os.path.join(localizable_path, config_name),
|
|
294
|
-
os.path.join(localizable_path,
|
|
294
|
+
os.path.join(localizable_path, app_dir, "Common", config_name),
|
|
295
295
|
)
|
|
296
296
|
for config_path in candidate_paths:
|
|
297
297
|
if os.path.exists(config_path):
|
|
@@ -314,83 +314,6 @@ def resolve_crowdin_access_token(cli_token: Optional[str] = None) -> str:
|
|
|
314
314
|
return access_token
|
|
315
315
|
|
|
316
316
|
|
|
317
|
-
def find_life_csv_file(output_dir: str) -> Optional[str]:
|
|
318
|
-
preferred_path = os.path.join(output_dir, "APP_Life_APP.csv")
|
|
319
|
-
if os.path.exists(preferred_path):
|
|
320
|
-
return preferred_path
|
|
321
|
-
|
|
322
|
-
fallback_csv_paths = []
|
|
323
|
-
for root, _, file_names in os.walk(output_dir):
|
|
324
|
-
for file_name in sorted(file_names):
|
|
325
|
-
file_path = os.path.join(root, file_name)
|
|
326
|
-
if file_name == "APP_Life_APP.csv":
|
|
327
|
-
return file_path
|
|
328
|
-
if file_name.lower().endswith(".csv"):
|
|
329
|
-
fallback_csv_paths.append(file_path)
|
|
330
|
-
|
|
331
|
-
if fallback_csv_paths:
|
|
332
|
-
return fallback_csv_paths[0]
|
|
333
|
-
return None
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
def convert_csv_to_xlsx(csv_path: str, xlsx_path: str) -> None:
|
|
337
|
-
with open(csv_path, "r", encoding="utf-8-sig", newline="") as csv_file:
|
|
338
|
-
sample = csv_file.read(4096)
|
|
339
|
-
csv_file.seek(0)
|
|
340
|
-
|
|
341
|
-
try:
|
|
342
|
-
dialect = csv.Sniffer().sniff(sample)
|
|
343
|
-
except csv.Error:
|
|
344
|
-
dialect = csv.excel
|
|
345
|
-
|
|
346
|
-
reader = csv.reader(csv_file, dialect)
|
|
347
|
-
workbook = Workbook()
|
|
348
|
-
worksheet = workbook.active
|
|
349
|
-
|
|
350
|
-
rows = list(reader)
|
|
351
|
-
if not rows:
|
|
352
|
-
workbook.save(xlsx_path)
|
|
353
|
-
print(f"已将空 CSV 转换为 Excel: {xlsx_path}")
|
|
354
|
-
return
|
|
355
|
-
|
|
356
|
-
# 统一成旧项目 APP.xlsx 的列结构:
|
|
357
|
-
# keys | source | tag | length limit | context | en-US | ...
|
|
358
|
-
normalized_rows = []
|
|
359
|
-
for row_index, row in enumerate(rows):
|
|
360
|
-
normalized_row = []
|
|
361
|
-
keys_value = row[0] if len(row) > 0 else ""
|
|
362
|
-
source_value = row[1] if len(row) > 1 else ""
|
|
363
|
-
context_value = row[2] if len(row) > 2 else ""
|
|
364
|
-
remaining_values = list(row[3:]) if len(row) > 3 else []
|
|
365
|
-
|
|
366
|
-
if row_index == 0:
|
|
367
|
-
normalized_row = [
|
|
368
|
-
"keys",
|
|
369
|
-
"source",
|
|
370
|
-
"tag",
|
|
371
|
-
"length limit",
|
|
372
|
-
"context",
|
|
373
|
-
"en-US",
|
|
374
|
-
]
|
|
375
|
-
normalized_row.extend(remaining_values[1:])
|
|
376
|
-
else:
|
|
377
|
-
normalized_row = [
|
|
378
|
-
keys_value,
|
|
379
|
-
source_value,
|
|
380
|
-
"",
|
|
381
|
-
"",
|
|
382
|
-
context_value,
|
|
383
|
-
]
|
|
384
|
-
normalized_row.extend(remaining_values)
|
|
385
|
-
normalized_rows.append(normalized_row)
|
|
386
|
-
|
|
387
|
-
for row in normalized_rows:
|
|
388
|
-
worksheet.append(row)
|
|
389
|
-
|
|
390
|
-
workbook.save(xlsx_path)
|
|
391
|
-
print(f"已将 CSV 转换为 Excel: {xlsx_path}")
|
|
392
|
-
|
|
393
|
-
|
|
394
317
|
############################
|
|
395
318
|
|
|
396
319
|
def str_to_bool(v: str) -> bool:
|
|
@@ -406,7 +329,7 @@ if __name__ == '__main__':
|
|
|
406
329
|
if crowdin:
|
|
407
330
|
config_path, project_id = resolve_crowdin_project(localizable_path)
|
|
408
331
|
if not config_path or not project_id:
|
|
409
|
-
raise FileNotFoundError("未找到 crowdin.yml 或
|
|
332
|
+
raise FileNotFoundError("未找到 crowdin.yml、crowdin_life.yml 或 crowdin_space.yml,无法确定 Crowdin project_id")
|
|
410
333
|
|
|
411
334
|
print(f"检测到 Crowdin 配置: {config_path},project_id={project_id}")
|
|
412
335
|
platform = CrowdinPlatform(resolve_crowdin_access_token(crowdin_access_token), project_id)
|
|
Binary file
|
|
@@ -7,12 +7,9 @@ require 'open3'
|
|
|
7
7
|
# require 'colored2'
|
|
8
8
|
class BundleGenerater
|
|
9
9
|
CROWDIN_PROJECTS = {
|
|
10
|
-
"crowdin_life.yml" => "85",
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
PROJECT_APP_DIRS = {
|
|
14
|
-
"85" => "AqaraLife",
|
|
15
|
-
"71" => "AqaraHome"
|
|
10
|
+
"crowdin_life.yml" => { project_id: "85", app_dir: "AqaraLife" },
|
|
11
|
+
"crowdin_space.yml" => { project_id: "85", app_dir: "AqaraSpace" },
|
|
12
|
+
"crowdin.yml" => { project_id: "71", app_dir: "AqaraHome" }
|
|
16
13
|
}.freeze
|
|
17
14
|
|
|
18
15
|
|
|
@@ -61,13 +58,9 @@ class BundleGenerater
|
|
|
61
58
|
|
|
62
59
|
@@download_Count = 1
|
|
63
60
|
|
|
64
|
-
def self.app_dir_name(project_id)
|
|
65
|
-
PROJECT_APP_DIRS.fetch(project_id, "AqaraHome")
|
|
66
|
-
end
|
|
67
|
-
|
|
68
61
|
def self.resolve_crowdin_project(project_path)
|
|
69
|
-
CROWDIN_PROJECTS.each do |config_name,
|
|
70
|
-
app_dir =
|
|
62
|
+
CROWDIN_PROJECTS.each do |config_name, project_info|
|
|
63
|
+
app_dir = project_info[:app_dir]
|
|
71
64
|
[
|
|
72
65
|
"#{project_path}/#{config_name}",
|
|
73
66
|
"#{project_path}/#{app_dir}/Common/#{config_name}"
|
|
@@ -77,7 +70,8 @@ class BundleGenerater
|
|
|
77
70
|
return {
|
|
78
71
|
enabled: true,
|
|
79
72
|
config_path: config_path,
|
|
80
|
-
project_id: project_id
|
|
73
|
+
project_id: project_info[:project_id],
|
|
74
|
+
app_dir: app_dir
|
|
81
75
|
}
|
|
82
76
|
end
|
|
83
77
|
end
|
|
@@ -85,7 +79,8 @@ class BundleGenerater
|
|
|
85
79
|
{
|
|
86
80
|
enabled: false,
|
|
87
81
|
config_path: nil,
|
|
88
|
-
project_id: nil
|
|
82
|
+
project_id: nil,
|
|
83
|
+
app_dir: "AqaraHome"
|
|
89
84
|
}
|
|
90
85
|
end
|
|
91
86
|
|
|
@@ -123,11 +118,11 @@ class BundleGenerater
|
|
|
123
118
|
|
|
124
119
|
crowdin_info = self.resolve_crowdin_project(project_path)
|
|
125
120
|
crowdin = crowdin_info[:enabled]
|
|
126
|
-
app_dir =
|
|
121
|
+
app_dir = crowdin_info[:app_dir]
|
|
127
122
|
|
|
128
123
|
f_path = "#{project_path}/download.xlsx"
|
|
129
124
|
if crowdin
|
|
130
|
-
puts "检测到 Crowdin 配置: #{crowdin_info[:config_path]},project_id=#{crowdin_info[:project_id]}"
|
|
125
|
+
puts "检测到 Crowdin 配置: #{crowdin_info[:config_path]},project_id=#{crowdin_info[:project_id]},app_dir=#{app_dir}"
|
|
131
126
|
crowdin_token = self.resolve_crowdin_token(crowdin_token)
|
|
132
127
|
f_path = "#{project_path}/APP/APP.xlsx"
|
|
133
128
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cocoapods-aqara-localzedLoader
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.18
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- zhaoxifan
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-09-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|