Skip to content

Commit b777fd3

Browse files
committed
Support enum localization
1 parent 24712e5 commit b777fd3

File tree

9 files changed

+387
-19
lines changed

9 files changed

+387
-19
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
3+
namespace Flow.Launcher.Localization.SourceGenerators.Shared.Attributes
4+
{
5+
/// <summary>
6+
/// Attribute to mark an enum for localization.
7+
/// </summary>
8+
[AttributeUsage(AttributeTargets.Enum)]
9+
public class EnumLocalizeAttribute : Attribute
10+
{
11+
}
12+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
3+
namespace Flow.Launcher.Localization.SourceGenerators.Shared.Attributes
4+
{
5+
/// <summary>
6+
/// Attribute to mark a localization key for an enum field.
7+
/// </summary>
8+
[AttributeUsage(AttributeTargets.Field)]
9+
public class EnumLocalizeKeyAttribute : Attribute
10+
{
11+
public static readonly EnumLocalizeKeyAttribute Default = new EnumLocalizeKeyAttribute();
12+
13+
public EnumLocalizeKeyAttribute() : this(string.Empty)
14+
{
15+
}
16+
17+
public EnumLocalizeKeyAttribute(string enumLocalizeKey)
18+
{
19+
EnumLocalizeKey = enumLocalizeKey;
20+
}
21+
22+
public virtual string LocalizeKey => EnumLocalizeKey;
23+
24+
protected string EnumLocalizeKey { get; set; }
25+
26+
public override bool Equals(object obj) =>
27+
obj is EnumLocalizeKeyAttribute other && other.LocalizeKey == LocalizeKey;
28+
29+
public override int GetHashCode() => LocalizeKey?.GetHashCode() ?? 0;
30+
31+
public override bool IsDefaultAttribute() => Equals(Default);
32+
}
33+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
3+
namespace Flow.Launcher.Localization.SourceGenerators.Shared.Attributes
4+
{
5+
/// <summary>
6+
/// Attribute to mark a localization value for an enum field.
7+
/// </summary>
8+
[AttributeUsage(AttributeTargets.Field)]
9+
public class EnumLocalizeValueAttribute : Attribute
10+
{
11+
public static readonly EnumLocalizeValueAttribute Default = new EnumLocalizeValueAttribute();
12+
13+
public EnumLocalizeValueAttribute() : this(string.Empty)
14+
{
15+
}
16+
17+
public EnumLocalizeValueAttribute(string enumLocalizeValue)
18+
{
19+
EnumLocalizeValue = enumLocalizeValue;
20+
}
21+
22+
public virtual string LocalizeValue => EnumLocalizeValue;
23+
24+
protected string EnumLocalizeValue { get; set; }
25+
26+
public override bool Equals(object obj) =>
27+
obj is EnumLocalizeValueAttribute other && other.LocalizeValue == LocalizeValue;
28+
29+
public override int GetHashCode() => LocalizeValue?.GetHashCode() ?? 0;
30+
31+
public override bool IsDefaultAttribute() => Equals(Default);
32+
}
33+
}

Flow.Launcher.Localization.Shared/Constants.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Text.RegularExpressions;
1+
using Flow.Launcher.Localization.SourceGenerators.Shared.Attributes;
2+
using System.Text.RegularExpressions;
23

34
namespace Flow.Launcher.Localization.Shared
45
{
@@ -20,6 +21,10 @@ public static class Constants
2021
public const string OldLocalizationMethodName = "GetTranslation";
2122
public const string StringFormatMethodName = "Format";
2223
public const string StringFormatTypeName = "string";
24+
public const string EnumLocalizeClassSuffix = "Data";
25+
public const string EnumLocalizeAttributeName = nameof(EnumLocalizeAttribute);
26+
public const string EnumLocalizeKeyAttributeName = nameof(EnumLocalizeKeyAttribute);
27+
public const string EnumLocalizeValueAttributeName = nameof(EnumLocalizeValueAttribute);
2328

2429
public static readonly Regex LanguagesXamlRegex = new Regex(@"\\Languages\\[^\\]+\.xaml$", RegexOptions.IgnoreCase);
2530
public static readonly string[] OldLocalizationClasses = { "IPublicAPI", "Internationalization" };

Flow.Launcher.Localization.Shared/Helper.cs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
using Microsoft.CodeAnalysis;
1+
using System;
2+
using System.Linq;
3+
using System.Text;
4+
using System.Threading;
5+
using Microsoft.CodeAnalysis;
26
using Microsoft.CodeAnalysis.CSharp;
37
using Microsoft.CodeAnalysis.CSharp.Syntax;
48
using Microsoft.CodeAnalysis.Diagnostics;
5-
using System.Linq;
6-
using System.Threading;
79

810
namespace Flow.Launcher.Localization.Shared
911
{
@@ -81,5 +83,23 @@ private static Location GetCodeFixLocation(PropertyDeclarationSyntax property, S
8183
}
8284

8385
#endregion
86+
87+
#region Tab String
88+
89+
public static string Spacing(int n)
90+
{
91+
Span<char> spaces = stackalloc char[n * 4];
92+
spaces.Fill(' ');
93+
94+
var sb = new StringBuilder(n * 4);
95+
foreach (var c in spaces)
96+
{
97+
_ = sb.Append(c);
98+
}
99+
100+
return sb.ToString();
101+
}
102+
103+
#endregion
84104
}
85105
}

Flow.Launcher.Localization.SourceGenerators/AnalyzerReleases.Unshipped.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ FLSG0004 | Localization | Warning | FLSG0004_ContextPropertyNotStatic
1111
FLSG0005 | Localization | Warning | FLSG0005_ContextPropertyIsPrivate
1212
FLSG0006 | Localization | Warning | FLSG0006_ContextPropertyIsProtected
1313
FLSG0007 | Localization | Warning | FLSG0007_LocalizationKeyUnused
14+
FLSG0008 | Localization | Warning | FLSG0008_EnumFieldLocalizationKeyValueInvalid

0 commit comments

Comments
 (0)