Skip to content

Commit 0889665

Browse files
committed
Localizable HelpText with infrastructure backend class and tests
1 parent d6be4f9 commit 0889665

File tree

7 files changed

+193
-40
lines changed

7 files changed

+193
-40
lines changed

src/CommandLine/BaseAttribute.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ public abstract class BaseAttribute : Attribute
1212
private int min;
1313
private int max;
1414
private object @default;
15-
private string helpText;
15+
private Infrastructure.LocalizableAttributeProperty helpText;
1616
private string metaValue;
17+
private Type resourceType;
1718

1819
/// <summary>
1920
/// Initializes a new instance of the <see cref="CommandLine.BaseAttribute"/> class.
@@ -22,8 +23,9 @@ protected internal BaseAttribute()
2223
{
2324
min = -1;
2425
max = -1;
25-
helpText = string.Empty;
26+
helpText = new Infrastructure.LocalizableAttributeProperty(nameof(HelpText));
2627
metaValue = string.Empty;
28+
resourceType = null;
2729
}
2830

2931
/// <summary>
@@ -90,15 +92,15 @@ public object Default
9092
/// </summary>
9193
public string HelpText
9294
{
93-
get { return helpText; }
95+
get { return helpText.Value; }
9496
set
9597
{
9698
if (value == null)
9799
{
98100
throw new ArgumentNullException("value");
99101
}
100102

101-
helpText = value;
103+
helpText.Value = value;
102104
}
103105
}
104106

@@ -127,5 +129,18 @@ public bool Hidden
127129
get;
128130
set;
129131
}
132+
133+
/// <summary>
134+
/// Gets or sets the <see cref="System.Type"/> that contains the resources for <see cref="HelpText"/>.
135+
/// </summary>
136+
public Type ResourceType
137+
{
138+
get => resourceType;
139+
set
140+
{
141+
resourceType =
142+
helpText.ResourceType = value;
143+
}
144+
}
130145
}
131146
}

src/CommandLine/CommandLine.csproj

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
<Compile Include="Core\Verb.cs" />
8585
<Compile Include="Infrastructure\ExceptionExtensions.cs" />
8686
<Compile Include="Infrastructure\FSharpOptionHelper.cs" />
87+
<Compile Include="Infrastructure\LocalizableAttributeProperty.cs" />
8788
<Compile Include="Infrastructure\PopsicleSetter.cs" />
8889
<Compile Include="Infrastructure\ReferenceEqualityComparer.cs" />
8990
<Compile Include="Infrastructure\ReflectionHelper.cs" />
@@ -169,8 +170,16 @@
169170
</Reference>
170171
</ItemGroup>
171172
</When>
172-
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.0' Or $(TargetFrameworkVersion) == 'v4.0.3' Or $(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7' Or $(TargetFrameworkVersion) == 'v4.7.1')" />
173-
<When Condition="($(TargetFrameworkIdentifier) == '.NETCore') Or ($(TargetFrameworkIdentifier) == 'MonoAndroid' And ($(TargetFrameworkVersion) == 'v1.0' Or $(TargetFrameworkVersion) == 'v2.2' Or $(TargetFrameworkVersion) == 'v2.3' Or $(TargetFrameworkVersion) == 'v4.0.3' Or $(TargetFrameworkVersion) == 'v4.1' Or $(TargetFrameworkVersion) == 'v4.2' Or $(TargetFrameworkVersion) == 'v4.3' Or $(TargetFrameworkVersion) == 'v4.4' Or $(TargetFrameworkVersion) == 'v5.0' Or $(TargetFrameworkVersion) == 'v5.1' Or $(TargetFrameworkVersion) == 'v6.0' Or $(TargetFrameworkVersion) == 'v7.0' Or $(TargetFrameworkVersion) == 'v7.1' Or $(TargetFrameworkVersion) == 'v8.0')) Or ($(TargetFrameworkIdentifier) == 'MonoTouch') Or ($(TargetFrameworkIdentifier) == '.NETCoreApp' And ($(TargetFrameworkVersion) == 'v1.0' Or $(TargetFrameworkVersion) == 'v1.1' Or $(TargetFrameworkVersion) == 'v2.0')) Or ($(TargetFrameworkIdentifier) == '.NETStandard' And ($(TargetFrameworkVersion) == 'v1.1' Or $(TargetFrameworkVersion) == 'v1.2' Or $(TargetFrameworkVersion) == 'v1.3' Or $(TargetFrameworkVersion) == 'v1.4' Or $(TargetFrameworkVersion) == 'v1.5' Or $(TargetFrameworkVersion) == 'v1.6' Or $(TargetFrameworkVersion) == 'v2.0')) Or ($(TargetFrameworkProfile) == 'Profile7') Or ($(TargetFrameworkProfile) == 'Profile44') Or ($(TargetFrameworkIdentifier) == 'Xamarin.iOS') Or ($(TargetFrameworkIdentifier) == 'Xamarin.Mac') Or ($(TargetFrameworkIdentifier) == 'Xamarin.tvOS') Or ($(TargetFrameworkIdentifier) == 'Xamarin.watchOS')">
173+
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.0' Or $(TargetFrameworkVersion) == 'v4.0.3' Or $(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7' Or $(TargetFrameworkVersion) == 'v4.7.1' Or $(TargetFrameworkVersion) == 'v4.7.2')">
174+
<ItemGroup>
175+
<Reference Include="FSharp.Core">
176+
<HintPath>..\..\packages\FSharp.Core\lib\net40\FSharp.Core.dll</HintPath>
177+
<Private>True</Private>
178+
<Paket>True</Paket>
179+
</Reference>
180+
</ItemGroup>
181+
</When>
182+
<When Condition="($(TargetFrameworkIdentifier) == '.NETCore') Or ($(TargetFrameworkIdentifier) == 'MonoAndroid' And ($(TargetFrameworkVersion) == 'v1.0' Or $(TargetFrameworkVersion) == 'v2.2' Or $(TargetFrameworkVersion) == 'v2.3' Or $(TargetFrameworkVersion) == 'v4.0.3' Or $(TargetFrameworkVersion) == 'v4.1' Or $(TargetFrameworkVersion) == 'v4.2' Or $(TargetFrameworkVersion) == 'v4.3' Or $(TargetFrameworkVersion) == 'v4.4' Or $(TargetFrameworkVersion) == 'v5.0' Or $(TargetFrameworkVersion) == 'v5.1' Or $(TargetFrameworkVersion) == 'v6.0' Or $(TargetFrameworkVersion) == 'v7.0' Or $(TargetFrameworkVersion) == 'v7.1' Or $(TargetFrameworkVersion) == 'v8.0' Or $(TargetFrameworkVersion) == 'v8.1' Or $(TargetFrameworkVersion) == 'v9.0')) Or ($(TargetFrameworkIdentifier) == 'MonoTouch') Or ($(TargetFrameworkIdentifier) == '.NETCoreApp' And ($(TargetFrameworkVersion) == 'v1.0' Or $(TargetFrameworkVersion) == 'v1.1' Or $(TargetFrameworkVersion) == 'v2.0' Or $(TargetFrameworkVersion) == 'v2.1' Or $(TargetFrameworkVersion) == 'v2.2' Or $(TargetFrameworkVersion) == 'v3.0')) Or ($(TargetFrameworkIdentifier) == '.NETStandard' And ($(TargetFrameworkVersion) == 'v1.1' Or $(TargetFrameworkVersion) == 'v1.2' Or $(TargetFrameworkVersion) == 'v1.3' Or $(TargetFrameworkVersion) == 'v1.4' Or $(TargetFrameworkVersion) == 'v1.5' Or $(TargetFrameworkVersion) == 'v1.6' Or $(TargetFrameworkVersion) == 'v2.0')) Or ($(TargetFrameworkProfile) == 'Profile7') Or ($(TargetFrameworkProfile) == 'Profile44') Or ($(TargetFrameworkIdentifier) == 'Xamarin.iOS') Or ($(TargetFrameworkIdentifier) == 'Xamarin.Mac') Or ($(TargetFrameworkIdentifier) == 'Xamarin.tvOS') Or ($(TargetFrameworkIdentifier) == 'Xamarin.watchOS')">
174183
<ItemGroup>
175184
<Reference Include="FSharp.Core">
176185
<HintPath>..\..\packages\FSharp.Core\lib\portable-net45+netcore45\FSharp.Core.dll</HintPath>
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Reflection;
5+
using System.Text;
6+
7+
namespace CommandLine.Infrastructure
8+
{
9+
internal class LocalizableAttributeProperty
10+
{
11+
private string _propertyName;
12+
private string _value;
13+
private Type _type;
14+
private PropertyInfo _localizationPropertyInfo;
15+
16+
public LocalizableAttributeProperty(string propertyName)
17+
{
18+
_propertyName = propertyName;
19+
}
20+
21+
public string Value
22+
{
23+
get => GetLocalizedValue();
24+
set
25+
{
26+
_localizationPropertyInfo = null;
27+
_value = value;
28+
}
29+
}
30+
31+
public Type ResourceType
32+
{
33+
set
34+
{
35+
_localizationPropertyInfo = null;
36+
_type = value;
37+
}
38+
}
39+
40+
private string GetLocalizedValue()
41+
{
42+
if (String.IsNullOrEmpty(_value) || _type == null)
43+
return _value;
44+
if (_localizationPropertyInfo == null)
45+
{
46+
// Static class IsAbstract
47+
if (!_type.IsVisible)
48+
throw new ArgumentException("Invalid resource type", _propertyName);
49+
PropertyInfo propertyInfo = _type.GetProperty(_value, BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Static);
50+
if (propertyInfo == null || !propertyInfo.CanRead || propertyInfo.PropertyType != typeof(string))
51+
throw new ArgumentException("Invalid resource property name", _propertyName);
52+
_localizationPropertyInfo = propertyInfo;
53+
}
54+
return (string)_localizationPropertyInfo.GetValue(null, null);
55+
}
56+
}
57+
58+
}

0 commit comments

Comments
 (0)