diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj b/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj
index 6ea0971b3..1bfe06e09 100644
--- a/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj
+++ b/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj
@@ -75,6 +75,7 @@
+
diff --git a/src/Orchard.Web/Modules/Orchard.Localization/RuleEngine/ContentDisplayedRuleProvider.cs b/src/Orchard.Web/Modules/Orchard.Localization/RuleEngine/ContentDisplayedRuleProvider.cs
new file mode 100644
index 000000000..b5b049ced
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.Localization/RuleEngine/ContentDisplayedRuleProvider.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Globalization;
+using System.Linq;
+using Orchard.Events;
+using Orchard.Localization.Services;
+using Orchard.Mvc;
+
+namespace Orchard.Localization.RuleEngine {
+ public interface IRuleProvider : IEventHandler {
+ void Process(dynamic ruleContext);
+ }
+
+ public class CultureRuleProvider : IRuleProvider {
+ private readonly ICultureManager _cultureManager;
+ private readonly IHttpContextAccessor _httpContextAccessor;
+
+ public CultureRuleProvider(ICultureManager cultureManager, IHttpContextAccessor httpContextAccessor) {
+ _cultureManager = cultureManager;
+ _httpContextAccessor = httpContextAccessor;
+ }
+
+ public void Process(dynamic ruleContext) {
+ if (!String.Equals(ruleContext.FunctionName, "culture-code", StringComparison.OrdinalIgnoreCase)) {
+ ProcessCultureCode(ruleContext);
+ }
+
+ if (!String.Equals(ruleContext.FunctionName, "culture-lcid", StringComparison.OrdinalIgnoreCase)) {
+ ProcessCultureId(ruleContext);
+ }
+ }
+
+ private void ProcessCultureCode(dynamic ruleContext) {
+ var httpContext = _httpContextAccessor.Current();
+ var currentUserCulture = CultureInfo.GetCultureInfo(_cultureManager.GetCurrentCulture(httpContext));
+
+ ruleContext.Result = ((object[])ruleContext.Arguments)
+ .Cast()
+ .Select(CultureInfo.GetCultureInfo)
+ .Any(c => c.Name == currentUserCulture.Name);
+ }
+
+ private void ProcessCultureId(dynamic ruleContext) {
+ var httpContext = _httpContextAccessor.Current();
+ var currentUserCulture = CultureInfo.GetCultureInfo(_cultureManager.GetCurrentCulture(httpContext));
+
+ ruleContext.Result = ((object[])ruleContext.Arguments)
+ .Cast()
+ .Select(CultureInfo.GetCultureInfo)
+ .Any(c => c.Name == currentUserCulture.Name);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs b/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs
index c605ae932..0f5ad2245 100644
--- a/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs
+++ b/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs
@@ -1,15 +1,16 @@
using System.Collections.Generic;
using System.Linq;
+using System.Security.Cryptography.X509Certificates;
using Orchard.Localization;
using Orchard.Scripting;
using Orchard.Widgets.Services;
namespace Orchard.Widgets.RuleEngine {
public class RuleManager : IRuleManager {
- private readonly IEnumerable _ruleProviders;
+ private readonly IRuleProvider _ruleProviders;
private readonly IEnumerable _evaluators;
- public RuleManager(IEnumerable ruleProviders, IEnumerable evaluators) {
+ public RuleManager(IRuleProvider ruleProviders, IEnumerable evaluators) {
_ruleProviders = ruleProviders;
_evaluators = evaluators;
T = NullLocalizer.Instance;
@@ -44,9 +45,7 @@ namespace Orchard.Widgets.RuleEngine {
Result = context.Result
};
- foreach(var ruleProvider in _ruleManager._ruleProviders) {
- ruleProvider.Process(ruleContext);
- }
+ _ruleManager._ruleProviders.Process(ruleContext);
context.Result = ruleContext.Result;
}
diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Services/IRuleProvider.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Services/IRuleProvider.cs
index 260b46f0c..cd30e3f8c 100644
--- a/src/Orchard.Web/Modules/Orchard.Widgets/Services/IRuleProvider.cs
+++ b/src/Orchard.Web/Modules/Orchard.Widgets/Services/IRuleProvider.cs
@@ -1,5 +1,7 @@
-namespace Orchard.Widgets.Services {
- public interface IRuleProvider : IDependency {
+using Orchard.Events;
+
+namespace Orchard.Widgets.Services {
+ public interface IRuleProvider : IEventHandler {
void Process(RuleContext ruleContext);
}
}
\ No newline at end of file