diff --git a/.editorconfig b/.editorconfig index df88abb..3ceb8e2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,18 +1,210 @@ # EditorConfig is awesome: https://EditorConfig.org +# 来源: https://github.com/dotnet/runtime/blob/main/.editorconfig # top-most EditorConfig file root = true -# Unix-style newlines with a newline ending every file + +# Default settings: +# A newline ending every file +# Use 4 spaces as indentation [*] end_of_line = lf +insert_final_newline = true indent_style = space +trim_trailing_whitespace = true [*.cfg] charset = utf-8 indent_size = 4 insert_final_newline = true -[*.cs] +# Specify UTF-8 without byte-order mark +[*.{csproj,locproj,nativeproj,proj,resx,slnx,vbproj}] charset = utf-8 + +# Generated code +[*{_AssemblyInfo.cs,.notsupported.cs,AsmOffsets.cs}] +generated_code = true + +# C# files +[*.cs] indent_size = 4 -insert_final_newline = true +charset = utf-8 + +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = false +csharp_indent_switch_labels = true +csharp_indent_labels = one_less_than_current + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async:suggestion + +# avoid this. unless absolutely necessary +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Types: use keywords instead of BCL types, and permit var only when the type is clear +csharp_style_var_for_built_in_types = false:suggestion +csharp_style_var_when_type_is_apparent = false:none +csharp_style_var_elsewhere = false:suggestion +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# static fields should have s_ prefix +dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion +dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields +dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static +dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected +dotnet_naming_style.static_prefix_style.required_prefix = s_ +dotnet_naming_style.static_prefix_style.capitalization = camel_case + +# internal and private fields should be _camelCase +dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion +dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields +dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style +dotnet_naming_symbols.private_internal_fields.applicable_kinds = field +dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal +dotnet_naming_style.camel_case_underscore_style.required_prefix = _ +dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case + +# Code style defaults +csharp_using_directive_placement = outside_namespace:suggestion +dotnet_sort_system_directives_first = true +csharp_prefer_braces = true:silent +csharp_preserve_single_line_blocks = true:none +csharp_preserve_single_line_statements = false:none +csharp_prefer_static_local_function = true:suggestion +csharp_prefer_simple_using_statement = false:none +csharp_style_prefer_switch_expression = true:suggestion +dotnet_style_readonly_field = true:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_prefer_collection_expression = when_types_exactly_match +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +csharp_prefer_simple_default_expression = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:silent +csharp_style_expression_bodied_constructors = true:silent +csharp_style_expression_bodied_operators = true:silent +csharp_style_expression_bodied_properties = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = true:silent + +# Pattern matching +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +# Null checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Other features +csharp_style_prefer_index_operator = false:none +csharp_style_prefer_range_operator = false:none +csharp_style_pattern_local_over_anonymous_function = false:none + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = do_not_ignore +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# License header +# file_header_template = Licensed to the .NET Foundation under one or more agreements.\nThe .NET Foundation licenses this file to you under the MIT license. + +[src/libraries/System.Net.Http/src/System/Net/Http/{SocketsHttpHandler/Http3RequestStream.cs,BrowserHttpHandler/BrowserHttpHandler.cs}] +# disable CA2025, the analyzer throws a NullReferenceException when processing this file: https://github.com/dotnet/roslyn-analyzers/issues/7652 +dotnet_diagnostic.CA2025.severity = none + +# C++ Files +[*.{cpp,h,in}] +curly_bracket_next_line = true +indent_brace_style = Allman + +# Xml project files +[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}] +indent_size = 2 + +# Xml build files +[*.builds] +indent_size = 2 + +# Xml files +[*.{resx,ruleset,slnx,stylecop,xml}] +indent_size = 2 + +# Xml resource files +[*.resx] +# match Visual Studio behavior +insert_final_newline = false +trim_trailing_whitespace = false + +# Xml config files +[*.{props,targets,config,nuspec}] +indent_size = 2 + +# Data serialization +[*.{json,yaml,yml}] +indent_size = 2 + +# Shell scripts +[*.sh] +end_of_line = lf +[*.{cmd,bat}] +end_of_line = crlf diff --git a/CHANGELOG.MD b/CHANGELOG.MD index ab2bc29..6c0b4a3 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,5 +1,11 @@ # 更新日志 | Changelog +## [1.7.5] + +### 修复 + +- 修复了**DPAI(Docking Port Alignment Indicator)** 因支持本地化导致之前翻译失效的问题。 + ## [1.7.4] ### 更新 diff --git a/GameData/0000Tinygrox_CNPatches/DPAI/ZH_DPAI.cfg b/GameData/0000Tinygrox_CNPatches/DPAI/ZH_DPAI.cfg new file mode 100644 index 0000000..c08fbe2 --- /dev/null +++ b/GameData/0000Tinygrox_CNPatches/DPAI/ZH_DPAI.cfg @@ -0,0 +1,34 @@ +Localization +{ + zh-cn + { + // Docking Port Alignment Indicator + #always_use_stock_toolbar = 总是使用原版图标栏 // Always use Stock Toolbar + #display_hud_target_port_icon = 显示目标对接口图标 // Display HUD Target Port Icon + #display_when_using_rpm = 当安装RPM时显示 // Display when using RPM + #dpai = DPAI + #dpai_settings = DPAI设置 // DPAI Settings + #enable_auto_targeting_and_cycling = 自动设置/切换目标 // Enable Auto Targeting (and Cycling) + #exlude_docked_ports = 非对接口 // Exclude Docked Ports + #restrict_docking_ports = 仅对接口 // Restrict Docking Ports + #gui_scale = 界面缩放: // GUI Scale: + #hud_target_port_icon_size = 目标对接口图标大小: // HUD Target Port Icon Size: + #invert_alignment_x = 反转对齐 X 轴 // Invert Alignment X + #invert_alignment_y = 反转对齐 Y 轴 // Invert Alignment Y + #invert_roll_direction = 反转滚动方向 // Invert Roll Direction + #invert_translation_x = 反转平移 X 轴 // Invert Translation X + #invert_translation_y = 反转平移 Y 轴 // Invert Translation Y + #none = 无 // None + #no_port_targeted = 未设置对接口目标 // No Port Targeted + #no_vessel_targeted = 未设置载具为目标 // No Vessel Targeted + #settings = 设 置 // Settings + #target_out_of_range = 目标超出距离 // Target Out Of Range + + // ModuleDockingNodeNamed + #name = 名称: // Name: + #ok = Ok + #port_name = 对接口名称 // Port Name + #rename_docking_port = 重命名对接口 // Rename Docking Port + #rename_port = 重命名对接口 // Rename Port + } +} diff --git a/GameData/0000Tinygrox_CNPatches/_HarmonyCNPatches/KSP_Chinese_Patches.dll b/GameData/0000Tinygrox_CNPatches/_HarmonyCNPatches/KSP_Chinese_Patches.dll index a49c0a5..af3e7c0 100644 Binary files a/GameData/0000Tinygrox_CNPatches/_HarmonyCNPatches/KSP_Chinese_Patches.dll and b/GameData/0000Tinygrox_CNPatches/_HarmonyCNPatches/KSP_Chinese_Patches.dll differ diff --git a/Source/KSP_Chinese_Patches/ModPatches/DPAIPatches.cs b/Source/KSP_Chinese_Patches/ModPatches/DPAIPatches.cs index 683d0a9..cd148d7 100644 --- a/Source/KSP_Chinese_Patches/ModPatches/DPAIPatches.cs +++ b/Source/KSP_Chinese_Patches/ModPatches/DPAIPatches.cs @@ -257,60 +257,60 @@ protected override void LoadAllPatchInfo() new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_createBlizzyButton_Patch)), HarmonyPatchType.Transpiler ), - new HarPatchInfo - ( - AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "determineTargetPortName"), - new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_determineTargetPortName_Patch)), - HarmonyPatchType.Transpiler - ), - new HarPatchInfo - ( - AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "drawRenderedGaugeTexture", new[] { typeof(int) }), - new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_drawRenderedGaugeTexture_Patch)), - HarmonyPatchType.Transpiler - ), + //new HarPatchInfo + //( + // AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "determineTargetPortName"), + // new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_determineTargetPortName_Patch)), + // HarmonyPatchType.Transpiler + //), + //new HarPatchInfo + //( + // AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "drawRenderedGaugeTexture", new[] { typeof(int) }), + // new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_drawRenderedGaugeTexture_Patch)), + // HarmonyPatchType.Transpiler + //), new HarPatchInfo ( AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "drawRPMText", new[] { typeof(int), typeof(int) }), new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_drawRPMText_Patch)), HarmonyPatchType.Transpiler ), - new HarPatchInfo - ( - AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "drawSettingsWindowContents", new[] { typeof(int) }), - new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_drawSettingsWindowContents_Patch)), - HarmonyPatchType.Transpiler - ), - new HarPatchInfo - ( - AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "getReferencePortName"), - new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_getReferencePortName_Patch)), - HarmonyPatchType.Transpiler - ), - new HarPatchInfo - ( - AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "onGaugeDraw"), - new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_onGaugeDraw_Patch)), - HarmonyPatchType.Transpiler - ), + //new HarPatchInfo + //( + // AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "drawSettingsWindowContents", new[] { typeof(int) }), + // new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_drawSettingsWindowContents_Patch)), + // HarmonyPatchType.Transpiler + //), + //new HarPatchInfo + //( + // AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "getReferencePortName"), + // new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_getReferencePortName_Patch)), + // HarmonyPatchType.Transpiler + //), + //new HarPatchInfo + //( + // AccessTools.Method(AccessTools.TypeByName("NavyFish.DockingPortAlignmentIndicator"), "onGaugeDraw"), + // new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.DPAI_onGaugeDraw_Patch)), + // HarmonyPatchType.Transpiler + //), new HarPatchInfo ( AccessTools.Method(AccessTools.TypeByName("NavyFish.ModuleDockingNodeNamed"), "OnAwake"), new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.ModuleDockingNodeNamed_OnAwake_Patch)), HarmonyPatchType.Transpiler ), - new HarPatchInfo - ( - AccessTools.Method(AccessTools.TypeByName("NavyFish.RenameWindow"), "DisplayForNode", new[] { AccessTools.TypeByName("NavyFish.ModuleDockingNodeNamed") }), - new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.ModuleDockingNodeNamed_DisplayForNode_Patch)), - HarmonyPatchType.Transpiler - ), - new HarPatchInfo - ( - AccessTools.Method(AccessTools.TypeByName("NavyFish.RenameWindow"), "onRenameDialogDraw", new[] { typeof(int) }), - new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.ModuleDockingNodeNamed_onRenameDialogDraw_Patch)), - HarmonyPatchType.Transpiler - ), + //new HarPatchInfo + //( + // AccessTools.Method(AccessTools.TypeByName("NavyFish.RenameWindow"), "DisplayForNode", new[] { AccessTools.TypeByName("NavyFish.ModuleDockingNodeNamed") }), + // new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.ModuleDockingNodeNamed_DisplayForNode_Patch)), + // HarmonyPatchType.Transpiler + //), + //new HarPatchInfo + //( + // AccessTools.Method(AccessTools.TypeByName("NavyFish.RenameWindow"), "onRenameDialogDraw", new[] { typeof(int) }), + // new HarmonyMethod(typeof(DPAIPatches), nameof(DPAIPatches.ModuleDockingNodeNamed_onRenameDialogDraw_Patch)), + // HarmonyPatchType.Transpiler + //), }; } } diff --git a/Source/KSP_Chinese_Patches/StaticMethods.cs b/Source/KSP_Chinese_Patches/StaticMethods.cs index 0902d1c..a78101c 100644 --- a/Source/KSP_Chinese_Patches/StaticMethods.cs +++ b/Source/KSP_Chinese_Patches/StaticMethods.cs @@ -162,5 +162,34 @@ public static CodeInstruction[] Action_GuiName_Instructions(string targetAction, new CodeInstruction(OpCodes.Callvirt, AccessTools.PropertySetter(typeof(BaseAction), nameof(BaseEvent.guiName))) }; } + + public static IEnumerable ReplaceLdstr(IEnumerable codeInstructions, string original, string replacement, bool replaceAll = false) + { + var list = codeInstructions.ToList(); + bool replaced = false; + int count = 0; + for (int i = 0; i < list.Count; i++) + { + var ins = list[i]; + if (ins.opcode == OpCodes.Ldstr && ins.operand is string str && str == original) + { + list[i] = new CodeInstruction(OpCodes.Ldstr, replacement) + { + labels = ins.labels, + blocks = ins.blocks + }; + replaced = true; + count++; + if (!replaceAll) break; + } + } + + if (!replaced) + { + UnityEngine.Debug.Log($"未找到字符串 \"{original}\",未进行替换。"); + } + + return list.AsEnumerable(); + } } }