Localizing Themes and Modules

- Added sample localizations for French

--HG--
branch : dev
This commit is contained in:
Sebastien Ros
2010-10-11 15:24:11 -07:00
parent 8a6f988ca0
commit c7bfc8c130
7 changed files with 79 additions and 22 deletions

View File

@@ -181,6 +181,9 @@
<ItemGroup> <ItemGroup>
<Content Include="Views\Parts\Tags.ShowTags.Detail.BlogPost.cshtml" /> <Content Include="Views\Parts\Tags.ShowTags.Detail.BlogPost.cshtml" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="App_Data\Localization\fr-FR\orchard.module.po" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -39,6 +39,10 @@
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Autofac, Version=2.2.4.900, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\lib\autofac\Autofac.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.ComponentModel.DataAnnotations"> <Reference Include="System.ComponentModel.DataAnnotations">

View File

@@ -15,12 +15,17 @@ namespace Orchard.Modules.Services {
private const string ModuleExtensionType = "module"; private const string ModuleExtensionType = "module";
private readonly IExtensionManager _extensionManager; private readonly IExtensionManager _extensionManager;
private readonly IShellDescriptorManager _shellDescriptorManager; private readonly IShellDescriptorManager _shellDescriptorManager;
private readonly IWorkContextAccessor _workContextAccessor;
public ModuleService(IOrchardServices orchardServices, IExtensionManager extensionManager, public ModuleService(
IShellDescriptorManager shellDescriptorManager) { IOrchardServices orchardServices,
IExtensionManager extensionManager,
IShellDescriptorManager shellDescriptorManager,
IWorkContextAccessor workContextAccessor) {
Services = orchardServices; Services = orchardServices;
_extensionManager = extensionManager; _extensionManager = extensionManager;
_shellDescriptorManager = shellDescriptorManager; _shellDescriptorManager = shellDescriptorManager;
_workContextAccessor = workContextAccessor;
T = NullLocalizer.Instance; T = NullLocalizer.Instance;
} }
@@ -187,16 +192,36 @@ namespace Orchard.Modules.Services {
: featuresInQuestion.First())); : featuresInQuestion.First()));
} }
private static IModule AssembleModuleFromDescriptor(ExtensionDescriptor extensionDescriptor) { private static string TryLocalize(string key, string original, Localizer localizer) {
var localized = localizer(key).Text;
if(key == localized) {
// no specific localization available
return original;
}
return localized;
}
private IModule AssembleModuleFromDescriptor(ExtensionDescriptor extensionDescriptor) {
var localizer = LocalizationUtilities.Resolve(_workContextAccessor.GetContext(), String.Concat(extensionDescriptor.Location, "/", extensionDescriptor.Name, "/Module.txt"));
return new Module { return new Module {
ModuleName = extensionDescriptor.Name, ModuleName = extensionDescriptor.Name,
DisplayName = extensionDescriptor.DisplayName, DisplayName = TryLocalize("Name", extensionDescriptor.DisplayName, localizer),
Description = extensionDescriptor.Description, Description = TryLocalize("Description", extensionDescriptor.Description, localizer),
Version = extensionDescriptor.Version, Version = extensionDescriptor.Version,
Author = extensionDescriptor.Author, Author = TryLocalize("Author", extensionDescriptor.Author, localizer),
HomePage = extensionDescriptor.WebSite, HomePage = TryLocalize("Website", extensionDescriptor.WebSite, localizer),
Tags = extensionDescriptor.Tags, Tags = TryLocalize("Tags", extensionDescriptor.Tags, localizer),
Features = extensionDescriptor.Features Features = extensionDescriptor.Features.Select(f => new FeatureDescriptor {
Category = TryLocalize(f.Name + " Category", f.Category, localizer),
Dependencies = f.Dependencies,
Description = TryLocalize(f.Description + " Description", f.Description, localizer),
Extension = f.Extension,
Name = f.Name
})
}; };
} }

View File

@@ -39,6 +39,10 @@
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Autofac, Version=2.2.4.900, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\lib\autofac\Autofac.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />

View File

@@ -19,14 +19,17 @@ namespace Orchard.Themes.Services {
private readonly IExtensionManager _extensionManager; private readonly IExtensionManager _extensionManager;
private readonly IEnumerable<IThemeSelector> _themeSelectors; private readonly IEnumerable<IThemeSelector> _themeSelectors;
private readonly IModuleService _moduleService; private readonly IModuleService _moduleService;
private IWorkContextAccessor _workContextAccessor;
public ThemeService( public ThemeService(
IExtensionManager extensionManager, IExtensionManager extensionManager,
IEnumerable<IThemeSelector> themeSelectors, IEnumerable<IThemeSelector> themeSelectors,
IModuleService moduleService) { IModuleService moduleService,
IWorkContextAccessor workContextAccessor) {
_extensionManager = extensionManager; _extensionManager = extensionManager;
_themeSelectors = themeSelectors; _themeSelectors = themeSelectors;
_moduleService = moduleService; _moduleService = moduleService;
_workContextAccessor = workContextAccessor;
Logger = NullLogger.Instance; Logger = NullLogger.Instance;
T = NullLocalizer.Instance; T = NullLocalizer.Instance;
} }
@@ -174,15 +177,29 @@ namespace Orchard.Themes.Services {
_extensionManager.UninstallExtension("Theme", themeName); _extensionManager.UninstallExtension("Theme", themeName);
} }
private static ITheme CreateTheme(ExtensionDescriptor descriptor) { private static string TryLocalize(string key, string original, Localizer localizer) {
var localized = localizer(key).Text;
if ( key == localized ) {
// no specific localization available
return original;
}
return localized;
}
private ITheme CreateTheme(ExtensionDescriptor descriptor) {
var localizer = LocalizationUtilities.Resolve(_workContextAccessor.GetContext(), String.Concat(descriptor.Location, "/", descriptor.Name, "/Theme.txt"));
return new Theme { return new Theme {
Author = descriptor.Author ?? "", Author = TryLocalize("Author", descriptor.Author, localizer) ?? "",
Description = descriptor.Description ?? "", Description = TryLocalize("Description", descriptor.Description, localizer) ?? "",
DisplayName = descriptor.DisplayName ?? "", DisplayName = TryLocalize("DisplayName", descriptor.DisplayName, localizer) ?? "",
HomePage = descriptor.WebSite ?? "", HomePage = TryLocalize("Website", descriptor.WebSite, localizer) ?? "",
ThemeName = descriptor.Name, ThemeName = descriptor.Name,
Version = descriptor.Version ?? "", Version = descriptor.Version ?? "",
Tags = descriptor.Tags ?? "", Tags = TryLocalize("Tags", descriptor.Tags, localizer) ?? "",
Zones = descriptor.Zones ?? "", Zones = descriptor.Zones ?? "",
BaseTheme = descriptor.BaseTheme ?? "", BaseTheme = descriptor.BaseTheme ?? "",
}; };

View File

@@ -139,6 +139,7 @@
<Content Include="Themes\TheThemeMachine\Styles\site.css" /> <Content Include="Themes\TheThemeMachine\Styles\site.css" />
<Content Include="Themes\TheThemeMachine\Theme.png" /> <Content Include="Themes\TheThemeMachine\Theme.png" />
<Content Include="Themes\TheThemeMachine\Theme.txt" /> <Content Include="Themes\TheThemeMachine\Theme.txt" />
<None Include="Themes\Classic\App_Data\Localization\fr-FR\orchard.theme.po" />
<None Include="Themes\TheThemeMachine\Views\Layout-homePage.cshtml" /> <None Include="Themes\TheThemeMachine\Views\Layout-homePage.cshtml" />
<None Include="Themes\TheThemeMachine\Views\Recent.cshtml"> <None Include="Themes\TheThemeMachine\Views\Recent.cshtml">
<SubType>Designer</SubType> <SubType>Designer</SubType>

View File

@@ -1,12 +1,15 @@
using System.Web.Mvc; using System.Web.Mvc;
using Autofac; using Autofac;
using Orchard.Mvc;
namespace Orchard.Localization { namespace Orchard.Localization {
public class LocalizationUtilities { public class LocalizationUtilities {
public static Localizer Resolve(WorkContext workContext, string scope) {
return workContext == null ? NullLocalizer.Instance : Resolve(workContext.Resolve<ILifetimeScope>(), scope);
}
public static Localizer Resolve(ControllerContext controllerContext, string scope) { public static Localizer Resolve(ControllerContext controllerContext, string scope) {
var context = controllerContext.GetWorkContext(); var workContext = controllerContext.GetWorkContext();
return context == null ? NullLocalizer.Instance : Resolve(context.Resolve<ILifetimeScope>(), scope); return Resolve(workContext, scope);
} }
public static Localizer Resolve(IComponentContext context, string scope) { public static Localizer Resolve(IComponentContext context, string scope) {