gen_lang.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/usr/bin/env python3
  2. import argparse
  3. import json
  4. import os
  5. HEADER_TEMPLATE = """// Auto-generated language config
  6. #pragma once
  7. #include <string_view>
  8. #ifndef {lang_code_for_font}
  9. #define {lang_code_for_font} // 預設語言
  10. #endif
  11. namespace Lang {{
  12. // 语言元数据
  13. constexpr const char* CODE = "{lang_code}";
  14. // 字符串资源
  15. namespace Strings {{
  16. {strings}
  17. }}
  18. // 音效资源
  19. namespace Sounds {{
  20. {sounds}
  21. }}
  22. }}
  23. """
  24. def generate_header(input_path, output_path):
  25. with open(input_path, 'r', encoding='utf-8') as f:
  26. data = json.load(f)
  27. # 验证数据结构
  28. if 'language' not in data or 'strings' not in data:
  29. raise ValueError("Invalid JSON structure")
  30. lang_code = data['language']['type']
  31. # 生成字符串常量
  32. strings = []
  33. sounds = []
  34. for key, value in data['strings'].items():
  35. value = value.replace('"', '\\"')
  36. strings.append(f' constexpr const char* {key.upper()} = "{value}";')
  37. # 生成音效常量
  38. for file in os.listdir(os.path.dirname(input_path)):
  39. if file.endswith('.p3'):
  40. base_name = os.path.splitext(file)[0]
  41. sounds.append(f'''
  42. extern const char p3_{base_name}_start[] asm("_binary_{base_name}_p3_start");
  43. extern const char p3_{base_name}_end[] asm("_binary_{base_name}_p3_end");
  44. static const std::string_view P3_{base_name.upper()} {{
  45. static_cast<const char*>(p3_{base_name}_start),
  46. static_cast<size_t>(p3_{base_name}_end - p3_{base_name}_start)
  47. }};''')
  48. # 生成公共音效
  49. for file in os.listdir(os.path.join(os.path.dirname(output_path), 'common')):
  50. if file.endswith('.p3'):
  51. base_name = os.path.splitext(file)[0]
  52. sounds.append(f'''
  53. extern const char p3_{base_name}_start[] asm("_binary_{base_name}_p3_start");
  54. extern const char p3_{base_name}_end[] asm("_binary_{base_name}_p3_end");
  55. static const std::string_view P3_{base_name.upper()} {{
  56. static_cast<const char*>(p3_{base_name}_start),
  57. static_cast<size_t>(p3_{base_name}_end - p3_{base_name}_start)
  58. }};''')
  59. # 填充模板
  60. content = HEADER_TEMPLATE.format(
  61. lang_code=lang_code,
  62. lang_code_for_font=lang_code.replace('-', '_').lower(),
  63. strings="\n".join(sorted(strings)),
  64. sounds="\n".join(sorted(sounds))
  65. )
  66. # 写入文件
  67. os.makedirs(os.path.dirname(output_path), exist_ok=True)
  68. with open(output_path, 'w', encoding='utf-8') as f:
  69. f.write(content)
  70. if __name__ == "__main__":
  71. parser = argparse.ArgumentParser()
  72. parser.add_argument("--input", required=True, help="输入JSON文件路径")
  73. parser.add_argument("--output", required=True, help="输出头文件路径")
  74. args = parser.parse_args()
  75. generate_header(args.input, args.output)