Background
The following assumes you have a Sitecore instance with JSS installed and a JSS application you are working on. Grab your favourite de-compilation tool (I use ILSpy) and locate the following DLL in the bin folder of your running Sitecore instance:
Sitecore.JavaScriptServices.Globalization.dll
Once you have that open in ILSpy you want to have a search for DictionaryServiceController
public class DictionaryServiceController : ApiController
The following method is what we want to use in our C# code:
public DictionaryServiceResult GetDictionary(string appName, string language)
It takes the unique application name (that belongs to your application) and the language (“en”) as a parameter. As a result, you will get back a dictionary object that you can use to lookup up your content.
This is the Controller
that would normally be called via an API on the front end. So how do we call it from normal C# service for instance?
Firstly, the controller has a constructor that has three parameters that are injected via DI (Dependency Injection).
IConfigurationResolver configurationResolver,
BaseLanguageManager languageManager,
IApplicationDictionaryReader appDictionaryReader
Using ILSpy once again you can find that the above three parameters are all set up in the DI container via RegisterDependencies.cs
in various JSS assemblies. The Controller itself is already registered in the DI Container as well, which is very handy.
If you have a look at showconfig.aspx
in the admin tools you can see that a lot of the dependencies are registered via RegisterDependencies.cs
for example:
<configurator type="Sitecore.JavaScriptServices.AppServices.RegisterDependencies, Sitecore.JavaScriptServices.AppServices" patch:source="Sitecore.JavaScriptServices.AppServices.config"/>
Code Example
Using the above knowledge here is an example class that you can add to C# code that allows access to the JSS dictionary.
using Sitecore.Foundation.DependencyInjection; // Borrowed from habitat
using Sitecore.Diagnostics;
using Sitecore.JavaScriptServices.Globalization.Controllers;
namespace Sitecore.Foundation.JSS.Services
{
public interface ITranslationService
{
string TranslateKey(string key);
}
[Service(typeof(ITranslationService), Lifetime = Lifetime.Transient)]
public class TranslationService : ITranslationService
{
private readonly DictionaryServiceController controller;
public TranslationService(DictionaryServiceController controller)
{
this._controller = controller;
}
public string TranslateKey(string key)
{
var dictionary = GetDictionary();
if (dictionary.phrases.ContainsKey(key))
return dictionary.phrases[key];
Log.Error("Dictionary key {key} not found", this);
return string.Empty;
}
private DictionaryServiceResult GetDictionary(string appName = "myAppName", string language = "en")
{
return _controller.GetDictionary(appName, "en");
}
}
}
- Change the appName and language as required to access your JSS dictionary.
- Also, remember to publish your app dictionary to the web database or you may get no results.
- Call TranslateKey as needed with your desired key to get values back.
- The above code uses Attribute Style DI as seen here.. This will need adjusting as per your preferred method.