Откат языка / Настройка языка в Sitecore.Globalization.Translate.TextByLanguage(key, language);?
Я использую провайдера Language Fallback. Это не оказывает никакого влияния на элементы, хранящиеся в Системе> Словарь.
Я бы хотел, чтобы он переключился на язык, указанный в атрибуте "Откат" элемента "Язык".
В худшем случае я бы хотел вернуться к английскому.
Мой метод для получения текста из словаря может вызвать это.
Globalization.Translate.TextByLanguage (key, ????);
Я застрял на:
- Как найти значение атрибута "Fallback" для текущего заданного языка
- Как я могу передать это TextByLanguage. Кажется, он ожидает атрибута Language, но в языке нет конструкторов.
ИСТОРИЧЕСКИЙ: Следуя совету @Jammykam, я взглянул на пример Верндейла, но мне с ним не повезло. Это, кажется, никогда не стреляет.
Я добавил следующий класс в свое решение:
using Sitecore.Diagnostics;
using Sitecore.Globalization;
using Sitecore.Pipelines.GetTranslation;
using Sitecore.SharedSource.PartialLanguageFallback.Extensions;
using System;
using System.Collections.Generic;
namespace Sitecore.Web.Pipelines
{
public class DictionaryFallback : TryGetFromFallbackDomains
{
public static bool EnableFallback
{
get
{
return Sitecore.Context.Site != null &&
Sitecore.Context.Site.SiteInfo.Properties["enableFallback"] != null &&
Sitecore.Context.Site.SiteInfo.Properties["enableFallback"].Equals("true", StringComparison.InvariantCultureIgnoreCase);
}
}
/// <summary>
/// Runs the processor.
///
/// </summary>
/// <param name="args">The arguments.
/// </param>
public void Process(GetTranslationArgs args)
{
Assert.ArgumentNotNull((object)args, "args");
List<string> processedDomains = new List<string>();
if (args.HasResult || Context.Site == null || string.IsNullOrEmpty(Context.Site.DictionaryDomain))
return;
this.Args = args;
this.Database = args.Options.Database ?? args.ContentDatabase;
DictionaryDomain domain;
if (!DictionaryDomain.TryParse(Context.Site.DictionaryDomain, this.Database, out domain) || domain == null) {
Log.Info("Error Parsing Dictionary: " + domain.FullyQualifiedName, this);
return;
}
string result;
if (this.TryGetTranslation(domain, processedDomains, out result) && result != null)
{
Log.Info("Normal Translation: " + domain.FullyQualifiedName + ": " + result, this);
args.Result = result;
}
else if (EnableFallback)
{
if (this.TryTranslateTextByFallbackLanguage(args, domain, out result) && result != null)
{
Log.Info("Fallback Translation: " + domain.FullyQualifiedName + ": " + result, this);
args.Result = result;
}
}
}
protected virtual bool TryTranslateTextByFallbackLanguage(GetTranslationArgs args, DictionaryDomain domain, out string result)
{
result = null;
List<string> processedDomains = new List<string>();
// check if the the language passed in with the args has fallback assigned
// if so, then get that fallback language
// must try to get the translation based on that language
var languageFallsBack = args.Language.HasFallbackAssigned(args.ContentDatabase);
if (languageFallsBack)
{
Language fallbackLanguage = args.Language.GetFallbackLanguage(args.ContentDatabase);
// the following cannot be called from here, because it is an internal method to the Sitecore.Kernel library
//Translate.TryTranslateTextByLanguage(args.Key, domain, fallbackLanguage, out result, args.Parameters);
// therefore, we set Args.Language to the fallbacklanguage
// this.Args is the Args object in TryGetFromFallbackDomains processor
// then we call this.TryGetTranslation, which is a method in the TryGetFromFallbackDomains processor,
// which IS in the Sitecore.Kernel library and therefore can make the call to TryTranslateTextByLanguage
this.Args.Language = fallbackLanguage;
if (this.TryGetTranslation(domain, processedDomains, out result) && result != null)
{
return true;
}
else
{
// if no results if found, try to see if this fallback language falls back itself to another language
// and then if so, try the translation with that
// pass into the recursive call this.Args (instead of args), since the language has been updated in this.Args
if (result == null)
{
var isSuccess = TryTranslateTextByFallbackLanguage(this.Args, domain, out result);
return isSuccess;
}
else
return false;
}
}
else
{
return false;
}
}
}
}
Я добавил следующий код в мой файл патча:
<pipelines>
<getTranslation>
<processor patch:after="*[@type='Sitecore.Pipelines.GetTranslation.TryGetFromCoreDatabase, Sitecore.Kernel']" type="Sitecore.Web.Pipelines.DictionaryFallback, Sitecore.Web" />
</getTranslation>
</pipelines>
Я вижу это, используя showconfig.aspx:
<getTranslation>
<processor type="Sitecore.Pipelines.GetTranslation.ResolveContentDatabase, Sitecore.Kernel"/>
<processor type="Sitecore.Pipelines.GetTranslation.TryGetFromDomain, Sitecore.Kernel"/>
<processor type="Sitecore.Pipelines.GetTranslation.TryGetFromFallbackDomains, Sitecore.Kernel"/>
<processor type="Sitecore.Pipelines.GetTranslation.TryGetFromSiteDomain, Sitecore.Kernel"/>
<processor type="Sitecore.Pipelines.GetTranslation.TryGetFromContextDatabase, Sitecore.Kernel"/>
<processor type="Sitecore.Pipelines.GetTranslation.TryGetFromCoreDatabase, Sitecore.Kernel"/>
<processor type="Sitecore.Web.Pipelines.DictionaryFallback, Sitecore.Web" patch:source="SitecoreSettings.config"/>
</getTranslation>
В моем классе вы увидите, что я бросил некоторые записи, но я никогда не вижу записи в журнале. Элементы с версией на выбранном языке отображаются правильно. Но если у них нет версии, она показывает ключ, а не отступает.
Вот раздел, отображаемый через showconfig.aspx (мой реальный домен был изменен на example.com):
<sites><site name="shell" virtualFolder="/sitecore/shell" physicalFolder="/sitecore/shell" rootPath="/sitecore/content" startItem="/home" language="en" database="core" domain="sitecore" loginPage="/sitecore/login" content="master" contentStartItem="/Home" enableWorkflow="true" enableAnalytics="false" analyticsDefinitions="content" xmlControlPage="/sitecore/shell/default.aspx" browserTitle="Sitecore" htmlCacheSize="10MB" registryCacheSize="15MB" viewStateCacheSize="1MB" xslCacheSize="25MB" disableBrowserCaching="true" itemwebapi.mode="StandardSecurity" itemwebapi.access="ReadWrite" itemwebapi.allowanonymousaccess="false" /><site name="login" virtualFolder="/sitecore/login" physicalFolder="/sitecore/login" enableAnalytics="false" database="core" domain="sitecore" disableXmlControls="true" /><site name="admin" virtualFolder="/sitecore/admin" physicalFolder="/sitecore/admin" enableAnalytics="false" enableWorkflow="true" domain="sitecore" loginPage="/sitecore/admin/login.aspx" /><site name="service" virtualFolder="/sitecore/service" physicalFolder="/sitecore/service" /><site name="modules_shell" virtualFolder="/sitecore modules/shell" physicalFolder="/sitecore modules/shell" rootPath="/sitecore/content" startItem="/home" language="en" database="core" domain="sitecore" content="master" enableAnalytics="false" enableWorkflow="true" /><site name="modules_website" virtualFolder="/sitecore modules/web" physicalFolder="/sitecore modules/web" rootPath="/sitecore/content" startItem="/home" language="en" database="web" domain="extranet" allowDebug="true" cacheHtml="true" /><!-- ITEM WEB API SETTINGS FOR A SITE
Supported attributes (first is default):
itemwebapi.mode: [Off|StandardSecurity|AdvancedSecurity]
If set to Off, Item Web API is turned off.
If set to StandardSecurity, Item Web API is turned on. Default Sitecore security model is used.
If set to AdvancedSecurity, Item Web API is turned on. Default Sitecore security model is extended with a requirement to explicitely set the 'remote:fieldread' access right for content fields.
itemwebapi.access: [ReadOnly|ReadWrite]
If set to ReadOnly, then only READ operation is allowed.
If set to ReadWrite, then CREATE, READ, UPDATE, and DELETE operations are allowed.
itemwebapi.allowanonymousaccess: [false|true].
Defines if access is allowed for non-authenticated user.
--><!--<site name="mysite" patch:before="site[@name='website']"
virtualFolder="/"
physicalFolder="/"
rootPath="/sitecore/content"
startItem="/home"
database="web"
domain="extranet"
allowDebug="true"
cacheHtml="true"
htmlCacheSize="50MB"
enablePreview="true"
enableWebEdit="true"
enableDebugger="true"
disableClientData="false"/>--><site name="english" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" hostName="stage.example.com|127.0.0.1|localhost" language="en" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="1GB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" enableFallback="true" patch:source="SiteDefinition.config" /><site name="chinese" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" hostName="chinesestage.example.com" language="zh-CN" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="500MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" enableFallback="true" patch:source="SiteDefinition.config" /><site name="german" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" hostName="germanstage.example.com" language="de-DE" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="500MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" enableFallback="true" patch:source="SiteDefinition.config" /><site name="spanish" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" hostName="spanishstage.example.com" language="es-ES" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="500MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" enableFallback="true" patch:source="SiteDefinition.config" /><site name="french" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" hostName="frenchstage.example.com" language="fr-FR" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="500MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" enableFallback="true" patch:source="SiteDefinition.config" /><site name="italian" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" hostName="italianstage.example.com" language="it-IT" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="500MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" enableFallback="true" patch:source="SiteDefinition.config" /><site name="japanese" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" hostName="japanesestage.example.com" language="ja-JP" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="500MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" enableFallback="true" patch:source="SiteDefinition.config" /><site name="portuguese" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" hostName="portuguesestage.example.com" language="pt-BR" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="500MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" enableFallback="true" patch:source="SiteDefinition.config" /><site name="russian" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" hostName="russianstage.example.com" language="ru-RU" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="500MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" enableFallback="true" patch:source="SiteDefinition.config" /><site name="website" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" database="web" domain="extranet" allowDebug="true" cacheHtml="true" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="25MB" filteredItemsCacheSize="10MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" cacheRenderingParameters="true" renderingParametersCacheSize="10MB" itemwebapi.mode="Off" itemwebapi.access="ReadOnly" itemwebapi.allowanonymousaccess="false" htmlCacheSize="1GB" /><site name="scheduler" enableAnalytics="false" domain="sitecore" /><site name="system" enableAnalytics="false" domain="sitecore" /><site name="publisher" domain="sitecore" enableAnalytics="false" enableWorkflow="true" /></sites>
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: я использовал принятый ответ ниже и изменил его, чтобы он работал для меня: https://gist.github.com/eat-sleep-code/0ea3f1bd2be19bbf9fc6
2 ответа
Я уже решил это раньше, пожалуйста, проверьте следующий пост в блоге, раздел, связанный с элементами словаря:
Элементы словаря Язык Fallback
Я также создал для этого модуль, загруженный на сайт, все еще ожидающий обзора.
Элементы словаря по умолчанию не работают с языковым резервным модулем, вам нужно установить патч на конвейер getTranslate с дополнительным процессором, чтобы проверить язык резервирования и получить правильный словарный элемент на резервном языке.
В этой статье вы можете найти дополнительные подробности об использовании Fallback со словарем, после чего вы можете продолжать использовать словарь как обычно, без необходимости проходить через язык с Globalization.Translate.TextByLanguage(key)
,