Skip to content

Commit a6d1eca

Browse files
authored
Merge pull request #4 from cloudscribe/netcore20
merge changes from Netcore20
2 parents 7df1aed + a624c11 commit a6d1eca

10 files changed

Lines changed: 350 additions & 205 deletions

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ solution: cloudscribe.Web.Localization.sln
33
sudo: false
44
dist: trusty
55
mono: none
6-
dotnet: 1.0.4
6+
dotnet: 2.0.0
77
env:
88
global:
99
- DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true

src/WebLib/WebLib.csproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard1.6</TargetFramework>
4+
<TargetFramework>netstandard2.0</TargetFramework>
55
<AssemblyName>WebLib</AssemblyName>
66
<PackageId>WebLib</PackageId>
77
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
@@ -14,10 +14,10 @@
1414
</ItemGroup>
1515

1616
<ItemGroup>
17-
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="1.1.*" />
18-
<PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="1.1.*" />
19-
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="1.1.*" />
20-
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="1.1.*" />
17+
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="2.0.*" />
18+
<PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.0.*" />
19+
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="2.0.*" />
20+
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="2.0.*" />
2121
</ItemGroup>
2222

2323
</Project>
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using Microsoft.AspNetCore.Builder;
2+
using Microsoft.AspNetCore.Http;
3+
using Microsoft.AspNetCore.Routing;
4+
using Microsoft.Extensions.DependencyInjection;
5+
using Microsoft.Extensions.Options;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
9+
namespace cloudscribe.Web.Localization
10+
{
11+
public class CultureSegmentRouteConstraint : IRouteConstraint
12+
{
13+
public bool Match(
14+
HttpContext httpContext,
15+
IRouter route,
16+
string routeKey,
17+
RouteValueDictionary values,
18+
RouteDirection routeDirection)
19+
{
20+
if (httpContext == null) { return false; }
21+
22+
23+
24+
string requestFolder = GetStartingSegment(httpContext.Request.Path);
25+
if (!string.IsNullOrWhiteSpace(requestFolder))
26+
{
27+
var cultureSettingsAccessor = httpContext.RequestServices.GetService<IOptions<RequestLocalizationOptions>>();
28+
var cultureSettings = cultureSettingsAccessor.Value;
29+
var found = cultureSettings.SupportedUICultures.Where(x => x.Name == requestFolder || x.TwoLetterISOLanguageName == requestFolder).Any();
30+
var isDefaultCulture = cultureSettings.DefaultRequestCulture.UICulture.Name == requestFolder || cultureSettings.DefaultRequestCulture.UICulture.TwoLetterISOLanguageName == requestFolder;
31+
//don't match default culture because we don't want the culture segment in the url for the default culture
32+
if (found && !isDefaultCulture)
33+
{
34+
return true;
35+
}
36+
}
37+
38+
39+
return false;
40+
}
41+
42+
private string GetStartingSegment(string requestPath)
43+
{
44+
if (string.IsNullOrEmpty(requestPath)) return requestPath;
45+
if (!requestPath.Contains("/")) return requestPath;
46+
47+
var segments = SplitOnCharAndTrim(requestPath, '/');
48+
return segments.FirstOrDefault();
49+
}
50+
51+
private List<string> SplitOnCharAndTrim(string s, char c)
52+
{
53+
List<string> list = new List<string>();
54+
if (string.IsNullOrWhiteSpace(s)) { return list; }
55+
56+
string[] a = s.Split(c);
57+
foreach (string item in a)
58+
{
59+
if (!string.IsNullOrWhiteSpace(item)) { list.Add(item.Trim()); }
60+
}
61+
62+
63+
return list;
64+
}
65+
}
66+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
using Microsoft.AspNetCore.Http;
2+
using Microsoft.AspNetCore.Localization;
3+
using System.Collections.Generic;
4+
using System.Globalization;
5+
using System.Linq;
6+
using System.Threading.Tasks;
7+
8+
namespace cloudscribe.Web.Localization
9+
{
10+
public class FirstUrlSegmentRequestCultureProvider : RequestCultureProvider
11+
{
12+
public FirstUrlSegmentRequestCultureProvider(
13+
IList<CultureInfo> supportedUICultures,
14+
IList<CultureInfo> supportedCultures = null
15+
)
16+
{
17+
_supportedUICultures = supportedUICultures;
18+
_supportedCultures = supportedCultures;
19+
}
20+
21+
private readonly IList<CultureInfo> _supportedUICultures;
22+
private readonly IList<CultureInfo> _supportedCultures;
23+
24+
public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
25+
{
26+
var pathStartingSegment = GetStartingSegment(httpContext.Request.Path);
27+
28+
if (!string.IsNullOrWhiteSpace(pathStartingSegment))
29+
{
30+
var matchingUICulture = _supportedUICultures.Where(x => x.Name == pathStartingSegment || x.TwoLetterISOLanguageName == pathStartingSegment).FirstOrDefault();
31+
CultureInfo mainCulture = null;
32+
if (_supportedCultures != null)
33+
{
34+
mainCulture = _supportedCultures.Where(x => x.Name == pathStartingSegment || x.TwoLetterISOLanguageName == pathStartingSegment).FirstOrDefault();
35+
}
36+
if (matchingUICulture != null)
37+
{
38+
if (mainCulture != null)
39+
{
40+
return Task.FromResult(new ProviderCultureResult(mainCulture.Name, matchingUICulture.Name));
41+
}
42+
return Task.FromResult(new ProviderCultureResult(matchingUICulture.Name, matchingUICulture.Name));
43+
}
44+
}
45+
46+
//nothing matched
47+
return NullProviderCultureResult;
48+
49+
}
50+
51+
private string GetStartingSegment(string requestPath)
52+
{
53+
if (string.IsNullOrEmpty(requestPath)) return requestPath;
54+
if (!requestPath.Contains("/")) return requestPath;
55+
56+
var segments = SplitOnCharAndTrim(requestPath, '/');
57+
return segments.FirstOrDefault();
58+
}
59+
60+
private List<string> SplitOnCharAndTrim(string s, char c)
61+
{
62+
List<string> list = new List<string>();
63+
if (string.IsNullOrWhiteSpace(s)) { return list; }
64+
65+
string[] a = s.Split(c);
66+
foreach (string item in a)
67+
{
68+
if (!string.IsNullOrWhiteSpace(item)) { list.Add(item.Trim()); }
69+
}
70+
71+
72+
return list;
73+
}
74+
}
75+
}

0 commit comments

Comments
 (0)