diff --git a/src/Orchard/Localization/IText.cs b/src/Orchard/Localization/IText.cs index 09377643a..5f5929416 100644 --- a/src/Orchard/Localization/IText.cs +++ b/src/Orchard/Localization/IText.cs @@ -2,15 +2,27 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Orchard.Logging; namespace Orchard.Localization { - public interface IText : IDependency { + public interface IText { LocalizedString Get(string textHint, params object[] args); } public class Text : IText { + private readonly string _scope; + + public Text(string scope) { + _scope = scope; + Logger = NullLogger.Instance; + } + + public ILogger Logger { get; set; } + public LocalizedString Get(string textHint, params object[] args) { + Logger.Debug("{0} localizing '{1}'", _scope, textHint); + var localizedFormat = textHint; var localizedText = string.Format(localizedFormat, args); return new LocalizedString(localizedText); diff --git a/src/Orchard/Localization/LocalizationModule.cs b/src/Orchard/Localization/LocalizationModule.cs index 2cc5703d8..a012ed9e2 100644 --- a/src/Orchard/Localization/LocalizationModule.cs +++ b/src/Orchard/Localization/LocalizationModule.cs @@ -3,22 +3,28 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; -using Module=Autofac.Builder.Module; +using Module = Autofac.Builder.Module; namespace Orchard.Localization { - public class LocalizationModule : Module{ + public class LocalizationModule : Module { + + protected override void Load(Autofac.Builder.ContainerBuilder builder) { + builder.Register().As().FactoryScoped(); + } + protected override void AttachToComponentRegistration(Autofac.IContainer container, Autofac.IComponentRegistration registration) { var userProperty = FindUserProperty(registration.Descriptor.BestKnownImplementationType); if (userProperty != null) { - registration.Activated += (sender, e) => { - //var authenticationService = e.Context.Resolve(); - //var currentUser = authenticationService.GetAuthenticatedUser(); + var scope = registration.Descriptor.BestKnownImplementationType.FullName; - var text = e.Context.Resolve(); - var textDelegate = new Localizer(text.Get); - userProperty.SetValue(e.Instance, textDelegate, null); + registration.Activated += (sender, e) => { + //var authenticationService = e.Context.Resolve(); + //var currentUser = authenticationService.GetAuthenticatedUser(); + + var localizer = LocalizationUtilities.Resolve(e.Context, scope); + userProperty.SetValue(e.Instance, localizer, null); }; } } diff --git a/src/Orchard/Localization/LocalizationUtilities.cs b/src/Orchard/Localization/LocalizationUtilities.cs new file mode 100644 index 000000000..cd9abce9c --- /dev/null +++ b/src/Orchard/Localization/LocalizationUtilities.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web.Mvc; +using Autofac; +using Orchard.Mvc; + +namespace Orchard.Localization { + public class LocalizationUtilities { + public static Localizer Resolve(ControllerContext controllerContext, string scope) { + var context = OrchardControllerFactory.GetRequestContainer(controllerContext.RouteData); + return context == null ? NullLocalizer.Instance : Resolve(context, scope); + } + + public static Localizer Resolve(IContext context, string scope) { + var text = context.Resolve(new NamedParameter("scope", scope)); + return text.Get; + } + } +} diff --git a/src/Orchard/Models/ContentExtensions.cs b/src/Orchard/Models/ContentExtensions.cs index 53bea2f50..f6a882e81 100644 --- a/src/Orchard/Models/ContentExtensions.cs +++ b/src/Orchard/Models/ContentExtensions.cs @@ -16,35 +16,41 @@ namespace Orchard.Models { } public static T Get(this IContentManager manager, int id) where T : class, IContentItemPart { - return manager.Get(id).Get(); + var contentItem = manager.Get(id); + return contentItem == null ? null : contentItem.Get(); } public static void Create(this IContentManager manager, IContentItemPart part) { manager.Create(part.ContentItem); } - public static bool Has(this IContentItemPart part) { - return part.ContentItem.Has(); + public static bool Is(this ContentItem contentItem) { + return contentItem == null ? false : contentItem.Has(typeof(T)); } - - public static T Get(this IContentItemPart part) { - return part.ContentItem.Get(); + public static bool Has(this ContentItem contentItem) { + return contentItem == null ? false : contentItem.Has(typeof(T)); + } + public static T As(this ContentItem contentItem) where T : class { + return contentItem == null ? null : (T)contentItem.Get(typeof(T)); + } + public static T Get(this ContentItem contentItem) where T : class { + return contentItem == null ? null : (T)contentItem.Get(typeof(T)); } public static bool Is(this IContentItemPart part) { - return part.ContentItem.Has(); + return part == null ? false : part.ContentItem.Has(typeof(T)); + } + public static bool Has(this IContentItemPart part) { + return part == null ? false : part.ContentItem.Has(typeof(T)); + } + public static T As(this IContentItemPart part) where T : class { + return part == null ? null : (T)part.ContentItem.Get(typeof(T)); + } + public static T Get(this IContentItemPart part) where T : class { + return part == null ? null : (T)part.ContentItem.Get(typeof(T)); } - public static T As(this IContentItemPart part) { - return part.ContentItem.Get(); - } - public static bool Is(this ContentItem contentItem) { - return contentItem.Has(); - } - public static T As(this ContentItem contentItem) { - return contentItem.Get(); - } } } diff --git a/src/Orchard/Models/ContentItem.cs b/src/Orchard/Models/ContentItem.cs index 0197c02bc..99524fccd 100644 --- a/src/Orchard/Models/ContentItem.cs +++ b/src/Orchard/Models/ContentItem.cs @@ -1,5 +1,7 @@ +using System; using System.Collections.Generic; using System.Linq; +using Orchard.Models.Records; namespace Orchard.Models { public class ContentItem { @@ -11,14 +13,17 @@ namespace Orchard.Models { public int Id { get; set; } public string ContentType { get; set; } + public ContentItemRecord ContentItemRecord { get; set; } + public IEnumerable Parts { get { return _parts; } } - public bool Has() { - return _parts.Any(part => part is TPart); + + public bool Has(Type partType) { + return _parts.Any(part => partType.IsAssignableFrom(part.GetType())); } - public TPart Get() { - return _parts.OfType().FirstOrDefault(); + public IContentItemPart Get(Type partType) { + return _parts.FirstOrDefault(part => partType.IsAssignableFrom(part.GetType())); } public void Weld(IContentItemPart part) { diff --git a/src/Orchard/Models/DefaultContentManager.cs b/src/Orchard/Models/DefaultContentManager.cs index 53c4d03f8..150272e74 100644 --- a/src/Orchard/Models/DefaultContentManager.cs +++ b/src/Orchard/Models/DefaultContentManager.cs @@ -63,12 +63,16 @@ namespace Orchard.Models { if (contentItemRecord == null) return null; - // create a context with a new instance to load + // allocate instance and set record property + var contentItem = New(contentItemRecord.ContentType.Name); + contentItem.ContentItemRecord = contentItemRecord; + + // create a context with a new instance to load var context = new LoadContentContext { Id = contentItemRecord.Id, ContentType = contentItemRecord.ContentType.Name, ContentItemRecord = contentItemRecord, - ContentItem = New(contentItemRecord.ContentType.Name) + ContentItem = contentItem }; // set the id @@ -89,6 +93,7 @@ namespace Orchard.Models { // produce root record to determine the model id var modelRecord = new ContentItemRecord { ContentType = AcquireContentTypeRecord(contentItem.ContentType) }; _contentItemRepository.Create(modelRecord); + contentItem.ContentItemRecord = modelRecord; // build a context with the initialized instance to create var context = new CreateContentContext { diff --git a/src/Orchard/Models/Driver/ContentItemBuilder.cs b/src/Orchard/Models/Driver/ContentItemBuilder.cs index 91d436c05..5d355449b 100644 --- a/src/Orchard/Models/Driver/ContentItemBuilder.cs +++ b/src/Orchard/Models/Driver/ContentItemBuilder.cs @@ -2,7 +2,7 @@ namespace Orchard.Models.Driver { public class ContentItemBuilder { - private ContentItem _item; + private readonly ContentItem _item; public ContentItemBuilder(string contentType) { _item = new ContentItem { ContentType = contentType }; diff --git a/src/Orchard/Mvc/OrchardControllerFactory.cs b/src/Orchard/Mvc/OrchardControllerFactory.cs index 372017bf3..2be5ecbfd 100644 --- a/src/Orchard/Mvc/OrchardControllerFactory.cs +++ b/src/Orchard/Mvc/OrchardControllerFactory.cs @@ -35,7 +35,7 @@ namespace Orchard.Mvc { return null; } - private static IContext GetRequestContainer(RouteData routeData) { + public static IContext GetRequestContainer(RouteData routeData) { object dataTokenValue; if (routeData != null && routeData.DataTokens != null && diff --git a/src/Orchard/Mvc/ViewPage.cs b/src/Orchard/Mvc/ViewPage.cs index 045bcdd48..c9fc0a636 100644 --- a/src/Orchard/Mvc/ViewPage.cs +++ b/src/Orchard/Mvc/ViewPage.cs @@ -3,20 +3,26 @@ using Orchard.Localization; namespace Orchard.Mvc { public class ViewPage : System.Web.Mvc.ViewPage { - public string _(string textHint) - { - return new LocalizedString(textHint).ToString(); + public ViewPage() { + T = NullLocalizer.Instance; } - public string _(string textHint, params string[] formatTokens) - { - return string.Format(_(textHint), formatTokens); + + public override void RenderView(ViewContext viewContext) { + T = LocalizationUtilities.Resolve(viewContext, AppRelativeVirtualPath); + base.RenderView(viewContext); } - public MvcHtmlString _Encoded(string textHint) - { - return MvcHtmlString.Create(Html.Encode(_(textHint))); + + public Localizer T { get; set; } + + public MvcHtmlString H(string value) { + return MvcHtmlString.Create(Html.Encode(value)); + } + + public MvcHtmlString _Encoded(string textHint) { + return MvcHtmlString.Create(Html.Encode(T(textHint))); } public MvcHtmlString _Encoded(string textHint, params string[] formatTokens) { - return MvcHtmlString.Create(Html.Encode(_(textHint, formatTokens))); + return MvcHtmlString.Create(Html.Encode(T(textHint, formatTokens))); } } } diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index a47782a17..a70ea0ec9 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -121,6 +121,7 @@ +