Skip to content

Commit 5b6c453

Browse files
committed
feat(本地化): 为Utility模块添加多语言支持
添加资源文件和本地化键常量 修改异常消息为使用本地化服务 添加中文和英文资源文件 添加项目引用到本地化模块
1 parent 22a23fb commit 5b6c453

6 files changed

Lines changed: 195 additions & 7 deletions

File tree

GameFrameX.Foundation.Utility/DistributedSystem/Snowflake/IdWorker.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
* per process
88
*/
99

10+
using GameFrameX.Foundation.Localization.Core;
11+
using GameFrameX.Foundation.Utility.Localization;
12+
1013
namespace GameFrameX.Foundation.Utility.DistributedSystem.Snowflake;
1114

1215
/// <summary>
@@ -135,12 +138,12 @@ public IdWorker(long workerId, long dataCenterId, long baseTime = 1288834974657L
135138
// sanity check for workerId
136139
if (workerId > MaxWorkerId || workerId < 0)
137140
{
138-
throw new ArgumentException($"worker Id can't be greater than {MaxWorkerId} or less than 0");
141+
throw new ArgumentException(LocalizationService.GetString(LocalizationKeys.Exceptions.WorkerIdOutOfRange, MaxWorkerId));
139142
}
140143

141144
if (dataCenterId > MaxDatacenterId || dataCenterId < 0)
142145
{
143-
throw new ArgumentException($"datacenter Id can't be greater than {MaxDatacenterId} or less than 0");
146+
throw new ArgumentException(LocalizationService.GetString(LocalizationKeys.Exceptions.DatacenterIdOutOfRange, MaxDatacenterId));
144147
}
145148
}
146149

@@ -234,7 +237,7 @@ public virtual long NextId()
234237
{
235238
//exceptionCounter.incr(1);
236239
//log.Error("clock is moving backwards. Rejecting requests until %d.", _lastTimestamp);
237-
throw new InvalidSystemClock($"服务器时间出现回退你可以使用StaticConfig.CustomSnowFlakeTimeErrorFunc=【自定义方法】处理让他不报错返回新ID,Clock moved backwards. Refusing to generate id for {_lastTimestamp - timestamp} milliseconds");
240+
throw new InvalidSystemClock(LocalizationService.GetString(LocalizationKeys.Exceptions.ClockMovedBackwards, _lastTimestamp - timestamp));
238241
}
239242

240243
if (_lastTimestamp == timestamp)

GameFrameX.Foundation.Utility/GameFrameX.Foundation.Utility.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
</PropertyGroup>
3535
<ItemGroup>
3636
<Folder Include="DistributedSystem\" />
37+
<Folder Include="Localization\Messages\" />
38+
</ItemGroup>
39+
<ItemGroup>
40+
<ProjectReference Include="..\GameFrameX.Foundation.Localization\GameFrameX.Foundation.Localization.csproj" />
3741
</ItemGroup>
3842
<ItemGroup>
3943
<None Include="..\logo.png">
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// GameFrameX 组织下的以及组织衍生的项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
2+
//
3+
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE 文件。
4+
//
5+
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
6+
7+
using System;
8+
9+
namespace GameFrameX.Foundation.Utility.Localization;
10+
11+
/// <summary>
12+
/// Utility 模块本地化资源键常量定义
13+
/// </summary>
14+
/// <remarks>
15+
/// 这个类定义了 Utility 模块中所有可本地化字符串的键常量。
16+
/// 使用常量可以避免字符串硬编码,提高代码的可维护性和类型安全性。
17+
/// </remarks>
18+
/// <example>
19+
/// <code>
20+
/// // 在代码中使用本地化键常量
21+
/// throw new ArgumentOutOfRangeException(
22+
/// nameof(timestamp),
23+
/// LocalizationService.GetString(LocalizationKeys.Exceptions.TimestampOutOfRange));
24+
/// </code>
25+
/// </example>
26+
public static class LocalizationKeys
27+
{
28+
/// <summary>
29+
/// 异常消息资源键
30+
/// </summary>
31+
public static class Exceptions
32+
{
33+
/// <summary>
34+
/// 时间戳超出范围的错误消息
35+
/// </summary>
36+
/// <remarks>
37+
/// 键名: Utility.Exceptions.TimestampOutOfRange
38+
/// 用途: 当传入的时间戳无法转换为有效的DateTime时使用
39+
/// </remarks>
40+
public const string TimestampOutOfRange = "Utility.Exceptions.TimestampOutOfRange";
41+
42+
/// <summary>
43+
/// 系统时钟回退的错误消息
44+
/// </summary>
45+
/// <remarks>
46+
/// 键名: Utility.Exceptions.ClockMovedBackwards
47+
/// 用途: 当检测到系统时钟回退时,雪花算法ID生成器抛出此异常
48+
/// 参数: {0} - 回退的毫秒数
49+
/// </remarks>
50+
public const string ClockMovedBackwards = "Utility.Exceptions.ClockMovedBackwards";
51+
52+
/// <summary>
53+
/// Worker ID 超出范围的错误消息
54+
/// </summary>
55+
/// <remarks>
56+
/// 键名: Utility.Exceptions.WorkerIdOutOfRange
57+
/// 用途: 当创建IdWorker时传入的WorkerId超出有效范围时使用
58+
/// 参数: {0} - 最大允许的WorkerId值
59+
/// </remarks>
60+
public const string WorkerIdOutOfRange = "Utility.Exceptions.WorkerIdOutOfRange";
61+
62+
/// <summary>
63+
/// Datacenter ID 超出范围的错误消息
64+
/// </summary>
65+
/// <remarks>
66+
/// 键名: Utility.Exceptions.DatacenterIdOutOfRange
67+
/// 用途: 当创建IdWorker时传入的DatacenterId超出有效范围时使用
68+
/// 参数: {0} - 最大允许的DatacenterId值
69+
/// </remarks>
70+
public const string DatacenterIdOutOfRange = "Utility.Exceptions.DatacenterIdOutOfRange";
71+
}
72+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<root>
3+
<!-- Utility module exception messages -->
4+
<data name="Utility.Exceptions.TimestampOutOfRange" xml:space="preserve">
5+
<value>Timestamp is out of valid range and cannot be converted to DateTime.</value>
6+
</data>
7+
8+
<data name="Utility.Exceptions.ClockMovedBackwards" xml:space="preserve">
9+
<value>System clock moved backwards by {0} milliseconds, refusing to generate IDs to prevent duplicates.</value>
10+
</data>
11+
12+
<data name="Utility.Exceptions.WorkerIdOutOfRange" xml:space="preserve">
13+
<value>Worker ID out of range, acceptable values are 0 to {0}.</value>
14+
</data>
15+
16+
<data name="Utility.Exceptions.DatacenterIdOutOfRange" xml:space="preserve">
17+
<value>Datacenter ID out of range, acceptable values are 0 to {0}.</value>
18+
</data>
19+
20+
<!-- Common exception messages -->
21+
<data name="ArgumentNull" xml:space="preserve">
22+
<value>Argument cannot be null.</value>
23+
</data>
24+
25+
<data name="ArgumentOutOfRange" xml:space="preserve">
26+
<value>Argument out of range.</value>
27+
</data>
28+
29+
<data name="ArrayCannotBeEmpty" xml:space="preserve">
30+
<value>Array cannot be empty.</value>
31+
</data>
32+
33+
<data name="StringCannotBeNullOrEmpty" xml:space="preserve">
34+
<value>String cannot be null or empty.</value>
35+
</data>
36+
37+
<!-- Common status messages -->
38+
<data name="Success" xml:space="preserve">
39+
<value>Success</value>
40+
</data>
41+
42+
<data name="Failure" xml:space="preserve">
43+
<value>Failure</value>
44+
</data>
45+
46+
<data name="Loading" xml:space="preserve">
47+
<value>Loading...</value>
48+
</data>
49+
50+
<data name="NotAvailable" xml:space="preserve">
51+
<value>Not Available</value>
52+
</data>
53+
</root>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<root>
3+
<!-- Utility 模块异常消息 -->
4+
<data name="Utility.Exceptions.TimestampOutOfRange" xml:space="preserve">
5+
<value>时间戳超出有效范围,无法转换为DateTime。</value>
6+
</data>
7+
8+
<data name="Utility.Exceptions.ClockMovedBackwards" xml:space="preserve">
9+
<value>系统时钟回退 {0} 毫秒,拒绝生成ID以防止重复。</value>
10+
</data>
11+
12+
<data name="Utility.Exceptions.WorkerIdOutOfRange" xml:space="preserve">
13+
<value>工作节点ID超出有效范围,可接受值为 0 到 {0}。</value>
14+
</data>
15+
16+
<data name="Utility.Exceptions.DatacenterIdOutOfRange" xml:space="preserve">
17+
<value>数据中心ID超出有效范围,可接受值为 0 到 {0}。</value>
18+
</data>
19+
20+
<!-- 通用异常消息 -->
21+
<data name="ArgumentNull" xml:space="preserve">
22+
<value>参数不能为空。</value>
23+
</data>
24+
25+
<data name="ArgumentOutOfRange" xml:space="preserve">
26+
<value>参数超出有效范围。</value>
27+
</data>
28+
29+
<data name="ArrayCannotBeEmpty" xml:space="preserve">
30+
<value>数组不能为空。</value>
31+
</data>
32+
33+
<data name="StringCannotBeNullOrEmpty" xml:space="preserve">
34+
<value>字符串不能为空或空白。</value>
35+
</data>
36+
37+
<!-- 通用状态消息 -->
38+
<data name="Success" xml:space="preserve">
39+
<value>操作成功</value>
40+
</data>
41+
42+
<data name="Failure" xml:space="preserve">
43+
<value>操作失败</value>
44+
</data>
45+
46+
<data name="Loading" xml:space="preserve">
47+
<value>加载中...</value>
48+
</data>
49+
50+
<data name="NotAvailable" xml:space="preserve">
51+
<value>不可用</value>
52+
</data>
53+
</root>

GameFrameX.Foundation.Utility/Time/TimerHelper.Timestamp.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
// Official Documentation: https://gameframex.doc.alianblank.com/
3030
// ==========================================================================================
3131

32+
using GameFrameX.Foundation.Localization.Core;
33+
using GameFrameX.Foundation.Utility.Localization;
34+
3235
namespace GameFrameX.Foundation.Utility;
3336

3437
public partial class TimerHelper
@@ -128,7 +131,7 @@ public static long TimestampToTicks(long timestampSeconds)
128131
{
129132
if (timestampSeconds < -62135596800L || timestampSeconds > 253402300799L)
130133
{
131-
throw new ArgumentOutOfRangeException(nameof(timestampSeconds), "Timestamp is out of valid range for DateTime conversion.");
134+
throw new ArgumentOutOfRangeException(nameof(timestampSeconds), LocalizationService.GetString(LocalizationKeys.Exceptions.TimestampOutOfRange));
132135
}
133136

134137
// 将Unix时间戳转换为刻度数,每秒等于10000000刻度
@@ -203,7 +206,7 @@ public static long TimestampMillisToTicks(long timestampMillisSeconds)
203206
{
204207
if (timestampMillisSeconds < -62135596800000L || timestampMillisSeconds > 253402300799999L)
205208
{
206-
throw new ArgumentOutOfRangeException(nameof(timestampMillisSeconds), "Timestamp is out of valid range for DateTime conversion.");
209+
throw new ArgumentOutOfRangeException(nameof(timestampMillisSeconds), LocalizationService.GetString(LocalizationKeys.Exceptions.TimestampOutOfRange));
207210
}
208211

209212
// 将Unix毫秒时间戳转换为刻度数,每毫秒等于10000刻度
@@ -281,7 +284,7 @@ public static TimeSpan TimeSpanWithTimestamp(long timestamp)
281284
{
282285
if (timestamp < -62135596800L || timestamp > 253402300799L)
283286
{
284-
throw new ArgumentOutOfRangeException(nameof(timestamp), "Timestamp is out of valid range for DateTime conversion.");
287+
throw new ArgumentOutOfRangeException(nameof(timestamp), LocalizationService.GetString(LocalizationKeys.Exceptions.TimestampOutOfRange));
285288
}
286289

287290
// 直接将秒数转换为TimeSpan
@@ -298,7 +301,7 @@ public static TimeSpan TimeSpanLocalWithTimestamp(long timestamp)
298301
{
299302
if (timestamp < -62135596800L || timestamp > 253402300799L)
300303
{
301-
throw new ArgumentOutOfRangeException(nameof(timestamp), "Timestamp is out of valid range for DateTime conversion.");
304+
throw new ArgumentOutOfRangeException(nameof(timestamp), LocalizationService.GetString(LocalizationKeys.Exceptions.TimestampOutOfRange));
302305
}
303306

304307
// 直接将秒数转换为TimeSpan

0 commit comments

Comments
 (0)