Skip to content

Commit

Permalink
Support .NET Framework 4.0 and 3.5
Browse files Browse the repository at this point in the history
  • Loading branch information
mattjohnsonpint committed Feb 26, 2018
1 parent 9096e70 commit ee32973
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 8 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Nuget Installation
PM> Install-Package TimeZoneNames
```

This library is targeting .NET Standard 1.1+, .NET Standard 2.0+, and .NET Framework 4.5+.
This library is targeting .NET Standard 2.0, 1.1, and .NET Framework 4.5, 4.0 and 3.5.
See the [.NET Standard Platform Support Matrix](https://docs.microsoft.com/en-us/dotnet/articles/standard/library) for further details.

Demo
Expand Down
43 changes: 40 additions & 3 deletions src/TimeZoneNames/TZNames.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using TimeZoneConverter;

#if !NET35
using System.Collections.Concurrent;
#endif

namespace TimeZoneNames
{
/// <summary>
Expand All @@ -14,8 +17,15 @@ public static class TZNames
{
private static readonly TimeZoneData Data = TimeZoneData.Load();

#if NET35
private static readonly Dictionary<string, IComparer<string>> Comparers =
new Dictionary<string, IComparer<string>>(StringComparer.OrdinalIgnoreCase);

private static readonly object SyncLock = new object();
#else
private static readonly ConcurrentDictionary<string, IComparer<string>> Comparers =
new ConcurrentDictionary<string, IComparer<string>>(StringComparer.OrdinalIgnoreCase);
#endif

/// <summary>
/// Gets an array of IANA time zone identifiers for a specific country.
Expand Down Expand Up @@ -158,7 +168,11 @@ private static IDictionary<string, string> GetFixedTimeZoneNames(string language

private static string AppendCity(this string name, string city)
{
#if NET35
return string.IsNullOrEmpty(city.Trim()) ? name : $"{name} ({city})";
#else
return string.IsNullOrWhiteSpace(city) ? name : $"{name} ({city})";
#endif
}

/// <summary>
Expand Down Expand Up @@ -229,15 +243,38 @@ public static ICollection<string> GetLanguageCodes()

private static IComparer<string> GetComparer(string langKey)
{

#if NET35
if (Comparers.TryGetValue(langKey, out var comparer))
{
return comparer;
}

lock (SyncLock)
{
if (!Comparers.TryGetValue(langKey, out comparer))
{
var culture = new CultureInfo(langKey.Replace('_', '-'));
comparer = StringComparer.Create(culture, true);
}

return comparer;
}

#elif NETSTANDARD1_1
return Comparers.GetOrAdd(langKey, key =>
{
var culture = new CultureInfo(langKey.Replace('_', '-'));
#if NETSTANDARD1_1
return new CultureAwareStringComparer(culture, CompareOptions.IgnoreCase);
});

#else
return Comparers.GetOrAdd(langKey, key =>
{
var culture = new CultureInfo(langKey.Replace('_', '-'));
return StringComparer.Create(culture, true);
#endif
});
#endif
}

private static string GetLanguageKey(string languageCode)
Expand Down
5 changes: 5 additions & 0 deletions src/TimeZoneNames/TimeZoneData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,12 @@ internal class TimeZoneData
[SecuritySafeCritical]
public static TimeZoneData Load()
{

#if NET35 || NET40
var assembly = typeof(TimeZoneData).Assembly;
#else
var assembly = typeof(TimeZoneData).GetTypeInfo().Assembly;
#endif
using (var compressedStream = assembly.GetManifestResourceStream($"{assembly.GetName().Name}.data.json.gz"))
using (var stream = new GZipStream(compressedStream, CompressionMode.Decompress))
using (var reader = new StreamReader(stream))
Expand Down
12 changes: 8 additions & 4 deletions src/TimeZoneNames/TimeZoneNames.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
<PropertyGroup>
<Description>Provides localized time zone names.</Description>
<Authors>Matt Johnson</Authors>
<TargetFrameworks>netstandard2.0;netstandard1.1;net45</TargetFrameworks>
<TargetFrameworks>netstandard2.0;netstandard1.1;net45;net40;net35</TargetFrameworks>
<PackageId>TimeZoneNames</PackageId>
<PackageTags>timezone;time;zone;time zone;iana;tzdb;olson;timezoneinfo;globalization;international;localization</PackageTags>
<PackageProjectUrl>https://github.com/mj1856/TimeZoneNames</PackageProjectUrl>
<PackageLicenseUrl>https://raw.githubusercontent.com/mj1856/TimeZoneNames/master/LICENSE</PackageLicenseUrl>
<IncludeSource>True</IncludeSource>
<IncludeSymbols>True</IncludeSymbols>
<Version>3.2.0</Version>
<Version>3.3.0</Version>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
Expand Down Expand Up @@ -41,12 +41,16 @@
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)'=='net45'">
<ItemGroup Condition="'$(TargetFramework)'=='net45' Or '$(TargetFramework)'=='net40' Or '$(TargetFramework)'=='net35'">
<PackageReference Include="Newtonsoft.Json" Version="6.0.1" />
</ItemGroup>

<PropertyGroup>
<FrameworkPathOverride Condition="'$(TargetFramework)' == 'net35'">$(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client</FrameworkPathOverride>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="TimeZoneConverter" Version="2.2.1" />
<PackageReference Include="TimeZoneConverter" Version="2.3.0" />
</ItemGroup>

</Project>

0 comments on commit ee32973

Please sign in to comment.