From 4e9f9b77f419f3d56a749eef82ecfdbf20104573 Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Wed, 15 Aug 2012 23:20:37 +0600 Subject: [PATCH] Created CultureDictionaryFactoryResolver for use in the new MVC views which returns a ICultureDictionary. This allows us in the future to use any type of data source for the dictionary. Have obsoleted the old ICultureDictionary in the macro engines project (where it doesn't belong anyways). The new one doesn't expose the 'Language' property to the front-end because this is a business logic class which means designers can just delete a whole language from the db by calling 'Delete' on the object ! --- .../CultureDictionaryFactoryResolver.cs | 32 ++++++++++ .../Dictionary/ICultureDictionary.cs | 23 +++++++ .../Dictionary/ICultureDictionaryFactory.cs | 7 +++ src/Umbraco.Core/ICultureDictionary.cs | 13 ---- src/Umbraco.Core/Umbraco.Core.csproj | 4 +- src/Umbraco.Web/ContentStoreResolver.cs | 44 ++++++------- .../Dictionary/UmbracoCultureDictionary.cs | 48 +++++++++++++++ .../UmbracoCultureDictionaryFactory.cs | 16 +++++ src/Umbraco.Web/Mvc/RenderViewPage.cs | 6 +- src/Umbraco.Web/Umbraco.Web.csproj | 2 + src/Umbraco.Web/WebBootManager.cs | 5 ++ .../Properties/AssemblyInfo.cs | 1 - .../RazorCore/ICultureDictionary.cs | 17 +++--- .../RazorCore/UmbracoCultureDictionary.cs | 61 +++++++++++++------ .../umbraco.MacroEngines.csproj | 2 +- 15 files changed, 216 insertions(+), 65 deletions(-) create mode 100644 src/Umbraco.Core/Dictionary/CultureDictionaryFactoryResolver.cs create mode 100644 src/Umbraco.Core/Dictionary/ICultureDictionary.cs create mode 100644 src/Umbraco.Core/Dictionary/ICultureDictionaryFactory.cs delete mode 100644 src/Umbraco.Core/ICultureDictionary.cs create mode 100644 src/Umbraco.Web/Dictionary/UmbracoCultureDictionary.cs create mode 100644 src/Umbraco.Web/Dictionary/UmbracoCultureDictionaryFactory.cs diff --git a/src/Umbraco.Core/Dictionary/CultureDictionaryFactoryResolver.cs b/src/Umbraco.Core/Dictionary/CultureDictionaryFactoryResolver.cs new file mode 100644 index 0000000000..1d754e1970 --- /dev/null +++ b/src/Umbraco.Core/Dictionary/CultureDictionaryFactoryResolver.cs @@ -0,0 +1,32 @@ +using Umbraco.Core.ObjectResolution; + +namespace Umbraco.Core.Dictionary +{ + /// + /// Resolves the current CultureDictionaryFactory + /// + internal class CultureDictionaryFactoryResolver : SingleObjectResolverBase + { + internal CultureDictionaryFactoryResolver(ICultureDictionaryFactory factory) + : base(factory) + { + } + + /// + /// Can be used by developers at runtime to set their ICultureDictionaryFactory at app startup + /// + /// + public void SetContentStore(ICultureDictionaryFactory factory) + { + Value = factory; + } + + /// + /// Returns the ICultureDictionaryFactory + /// + public ICultureDictionaryFactory Factory + { + get { return Value; } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Dictionary/ICultureDictionary.cs b/src/Umbraco.Core/Dictionary/ICultureDictionary.cs new file mode 100644 index 0000000000..23c4ea2998 --- /dev/null +++ b/src/Umbraco.Core/Dictionary/ICultureDictionary.cs @@ -0,0 +1,23 @@ +using System; +using System.Globalization; + +namespace Umbraco.Core.Dictionary +{ + /// + /// Represents a dictionary based on a specific culture + /// + internal interface ICultureDictionary + { + /// + /// Returns the dictionary value based on the key supplied + /// + /// + /// + string this[string key] { get; } + + /// + /// Returns the current culture + /// + CultureInfo Culture { get; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Dictionary/ICultureDictionaryFactory.cs b/src/Umbraco.Core/Dictionary/ICultureDictionaryFactory.cs new file mode 100644 index 0000000000..d42df33f91 --- /dev/null +++ b/src/Umbraco.Core/Dictionary/ICultureDictionaryFactory.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Dictionary +{ + internal interface ICultureDictionaryFactory + { + ICultureDictionary CreateDictionary(); + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/ICultureDictionary.cs b/src/Umbraco.Core/ICultureDictionary.cs deleted file mode 100644 index 1131424551..0000000000 --- a/src/Umbraco.Core/ICultureDictionary.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Globalization; - -namespace Umbraco.Core -{ - /// - /// Represents a dictionary based on a specific culture - /// - internal interface ICultureDictionary - { - string this[string key] { get; } - CultureInfo Language { get; } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index ea3bf482c9..3005f77ffd 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -55,8 +55,10 @@ + + - + diff --git a/src/Umbraco.Web/ContentStoreResolver.cs b/src/Umbraco.Web/ContentStoreResolver.cs index 762af03d02..fca975a2d5 100644 --- a/src/Umbraco.Web/ContentStoreResolver.cs +++ b/src/Umbraco.Web/ContentStoreResolver.cs @@ -2,31 +2,31 @@ using Umbraco.Core.ObjectResolution; namespace Umbraco.Web { -/// -/// An object resolver to return the IContentStore -/// -internal class ContentStoreResolver : SingleObjectResolverBase -{ - internal ContentStoreResolver(IContentStore contentStore) - : base(contentStore) - { - } - /// - /// Can be used by developers at runtime to set their IContentStore at app startup + /// An object resolver to return the IContentStore /// - /// - public void SetContentStore(IContentStore contentStore) + internal class ContentStoreResolver : SingleObjectResolverBase { - Value = contentStore; - } + internal ContentStoreResolver(IContentStore contentStore) + : base(contentStore) + { + } - /// - /// Returns the IContentStore - /// - public IContentStore ContentStore - { - get { return Value; } + /// + /// Can be used by developers at runtime to set their IContentStore at app startup + /// + /// + public void SetContentStore(IContentStore contentStore) + { + Value = contentStore; + } + + /// + /// Returns the IContentStore + /// + public IContentStore ContentStore + { + get { return Value; } + } } -} } \ No newline at end of file diff --git a/src/Umbraco.Web/Dictionary/UmbracoCultureDictionary.cs b/src/Umbraco.Web/Dictionary/UmbracoCultureDictionary.cs new file mode 100644 index 0000000000..7598a97957 --- /dev/null +++ b/src/Umbraco.Web/Dictionary/UmbracoCultureDictionary.cs @@ -0,0 +1,48 @@ +using System; +using System.Dynamic; +using System.Globalization; +using umbraco.cms.businesslogic; +using umbraco.cms.businesslogic.language; + +namespace Umbraco.Web.Dictionary +{ + + internal class DefaultCultureDictionary : Umbraco.Core.Dictionary.ICultureDictionary + { + /// + /// Returns the dictionary value based on the key supplied + /// + /// + /// + public string this[string key] + { + get + { + try + { + return new global::umbraco.cms.businesslogic.Dictionary.DictionaryItem(key).Value(Language.id); + } + catch (Exception) + { + //NOTE: SD: I'm not sure why this is here but was copied from the UmbracoCultureDictionary in the macroEngines project + // which previously seems to have worked so I'm leaving it for now. + return string.Empty; + } + } + } + + /// + /// Returns the current culture + /// + public CultureInfo Culture + { + get { return System.Threading.Thread.CurrentThread.CurrentUICulture; } + } + + private Language Language + { + get { return Language.GetByCultureCode(System.Threading.Thread.CurrentThread.CurrentUICulture.Name); } + } + } + +} diff --git a/src/Umbraco.Web/Dictionary/UmbracoCultureDictionaryFactory.cs b/src/Umbraco.Web/Dictionary/UmbracoCultureDictionaryFactory.cs new file mode 100644 index 0000000000..c2662d0616 --- /dev/null +++ b/src/Umbraco.Web/Dictionary/UmbracoCultureDictionaryFactory.cs @@ -0,0 +1,16 @@ +namespace Umbraco.Web.Dictionary +{ + /// + /// A culture dictionary factory used to create an Umbraco.Core.Dictionary.ICultureDictionary. + /// + /// + /// In the future this will allow use to potentially store dictionary items elsewhere and allows for maximum flexibility. + /// + internal class DefaultCultureDictionaryFactory : Umbraco.Core.Dictionary.ICultureDictionaryFactory + { + public Umbraco.Core.Dictionary.ICultureDictionary CreateDictionary() + { + return new DefaultCultureDictionary(); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Mvc/RenderViewPage.cs b/src/Umbraco.Web/Mvc/RenderViewPage.cs index 9def6caeca..3091204a9d 100644 --- a/src/Umbraco.Web/Mvc/RenderViewPage.cs +++ b/src/Umbraco.Web/Mvc/RenderViewPage.cs @@ -1,5 +1,6 @@ using System.Web.Mvc; using Umbraco.Core; +using Umbraco.Core.Dictionary; using Umbraco.Web.Routing; namespace Umbraco.Web.Mvc @@ -35,11 +36,12 @@ namespace Umbraco.Web.Mvc public dynamic CurrentPage { get; private set; } private ICultureDictionary _cultureDictionary; - public string GetDictionary(string key) + public string GetDictionaryValue(string key) { if (_cultureDictionary == null) { - _cultureDictionary = new UmbracoCultureDictionary(); + var factory = CultureDictionaryFactoryResolver.Current.Factory; + _cultureDictionary = factory.CreateDictionary(); } return _cultureDictionary[key]; } diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 6f7d117e9a..447264057b 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -239,6 +239,8 @@ Properties\SolutionInfo.cs + + diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 56a36232c9..e6a1020c11 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Web.Mvc; using System.Web.Routing; using Umbraco.Core; +using Umbraco.Core.Dictionary; +using Umbraco.Web.Dictionary; using Umbraco.Web.Media.ThumbnailProviders; using Umbraco.Web.Mvc; using Umbraco.Web.Routing; @@ -151,6 +153,9 @@ namespace Umbraco.Web ThumbnailProvidersResolver.Current = new ThumbnailProvidersResolver( PluginManager.Current.ResolveThumbnailProviders()); + + CultureDictionaryFactoryResolver.Current = new CultureDictionaryFactoryResolver( + new DefaultCultureDictionaryFactory()); } } diff --git a/src/umbraco.MacroEngines/Properties/AssemblyInfo.cs b/src/umbraco.MacroEngines/Properties/AssemblyInfo.cs index ead4294796..f618472847 100644 --- a/src/umbraco.MacroEngines/Properties/AssemblyInfo.cs +++ b/src/umbraco.MacroEngines/Properties/AssemblyInfo.cs @@ -21,4 +21,3 @@ using System.Runtime.InteropServices; [assembly: Guid("207a5ae9-5f35-4dec-a649-d3cf4d0efbd9")] [assembly: InternalsVisibleTo("Umbraco.Tests")] - diff --git a/src/umbraco.MacroEngines/RazorCore/ICultureDictionary.cs b/src/umbraco.MacroEngines/RazorCore/ICultureDictionary.cs index 62a12e67df..a7c7224177 100644 --- a/src/umbraco.MacroEngines/RazorCore/ICultureDictionary.cs +++ b/src/umbraco.MacroEngines/RazorCore/ICultureDictionary.cs @@ -1,10 +1,13 @@ -using umbraco.cms.businesslogic.language; +using System; +using umbraco.cms.businesslogic.language; -namespace umbraco.MacroEngines { - - public interface ICultureDictionary { - string this[string key] { get; } - Language Language { get; } - } +namespace umbraco.MacroEngines +{ + [Obsolete("This class has been superceded by Umbraco.Core.Dictionary.ICultureDictionary")] + public interface ICultureDictionary + { + string this[string key] { get; } + Language Language { get; } + } } diff --git a/src/umbraco.MacroEngines/RazorCore/UmbracoCultureDictionary.cs b/src/umbraco.MacroEngines/RazorCore/UmbracoCultureDictionary.cs index 34954946d8..b228f0741e 100644 --- a/src/umbraco.MacroEngines/RazorCore/UmbracoCultureDictionary.cs +++ b/src/umbraco.MacroEngines/RazorCore/UmbracoCultureDictionary.cs @@ -1,30 +1,55 @@ using System; using System.Dynamic; +using System.Globalization; using umbraco.cms.businesslogic; using umbraco.cms.businesslogic.language; -namespace umbraco.MacroEngines { +namespace umbraco.MacroEngines +{ - public class UmbracoCultureDictionary : DynamicObject, ICultureDictionary { + //TODO: This is legacy code now since we have the Umbraco.Core.Dictionary.ICultureDictionary and we have a DefaultCultureDictionary + // in the Umbraco.Web project. We need to keep this here though because the new ICultureDictionary is different and + // doesn't expose the 'Language' property because this is really poor design since the Language object exposes business + // logic methods and designers could just call 'Delete' on the object and it will actually remove it from the database!! yikes. - public string this[string key] { - get { - try { - return new Dictionary.DictionaryItem(key).Value(Language.id); - } catch (Exception) { } - return string.Empty; - } - } + [Obsolete("This class has been superceded by Umbraco.Web.Dictionary.DefaultCultureDictionary")] + public class UmbracoCultureDictionary : DynamicObject, ICultureDictionary, Umbraco.Core.Dictionary.ICultureDictionary + { - public Language Language { - get { return Language.GetByCultureCode(System.Threading.Thread.CurrentThread.CurrentUICulture.Name); } - } + public string this[string key] + { + get + { + try + { + return new Dictionary.DictionaryItem(key).Value(Language.id); + } + catch (Exception) + { + return string.Empty; + } + } + } - public override bool TryGetMember(GetMemberBinder binder, out object result) { - result = this[binder.Name]; - return true; - } + CultureInfo Umbraco.Core.Dictionary.ICultureDictionary.Culture + { + get + { + return new CultureInfo(Language.CultureAlias); + } + } - } + public Language Language + { + get { return Language.GetByCultureCode(System.Threading.Thread.CurrentThread.CurrentUICulture.Name); } + } + + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + result = this[binder.Name]; + return true; + } + + } } diff --git a/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj b/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj index 645eca379c..c478cadd58 100644 --- a/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj +++ b/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj @@ -151,7 +151,7 @@ {651E1350-91B6-44B7-BD60-7207006D7003} - umbraco.presentation + Umbraco.Web