Skip to content

workspace sdk localization

Andre Lafleur edited this page Oct 8, 2026 · 2 revisions

Workspace SDK localization

Workspace SDK modules run inside Security Desk or Config Tool. Use the culture selected for the host application when you load integration-owned strings and configure the layout of custom Windows Presentation Foundation (WPF) views.

Use the Security Center UI culture

The Security Center Language Tool selects the user interface language independently of the Windows display language. Security Desk and Config Tool load that selection when they start. Restart a running client application after changing its language.

Read the selected culture from Workspace.Culture. Do not read product language configuration files or use the Windows culture as the authority for translation selection.

Workspace.Culture identifies the user interface language. It does not necessarily represent the operator's Windows regional format. When you format dates, times, or numbers, choose whether the value must follow the Security Center language or the Windows regional settings, and then pass that culture explicitly.

Workspace modules share the host application's process. Pass Workspace.Culture to your resource lookup instead of changing the host's default .NET cultures.

Load integration-owned strings

Store neutral strings in Strings.resx and add one culture-specific file for each translation, such as Strings.es.resx or Strings.fr-CA.resx. Use the same resource keys in every file.

This helper passes the Security Center culture explicitly to ResourceManager.GetString:

using System.Reflection;
using System.Resources;
using Genetec.Sdk.Workspace;

public static class IntegrationStrings
{
    private static readonly ResourceManager s_resources = new(
        "Contoso.Equipment.Resources.Strings",
        Assembly.GetExecutingAssembly());

    public static string Get(
        Workspace workspace,
        string key,
        string fallback)
    {
        return s_resources.GetString(key, workspace.Culture)
            ?? fallback;
    }
}

Replace the resource base name with the default namespace and path of your neutral .resx file. Always provide a neutral fallback string or neutral resource value.

Package satellite assemblies

MSBuild compiles culture-specific .resx files into satellite assemblies. Deploy the main integration assembly and each culture directory together:

Contoso.Equipment.dll
├── es/
│   └── Contoso.Equipment.resources.dll
└── fr-CA/
    └── Contoso.Equipment.resources.dll

The directory name must match the culture name. A culture-specific satellite assembly uses the main assembly name followed by .resources.dll. The neutral resources remain in the main assembly and provide the final fallback.

For the .NET naming, directory, and fallback rules, see Create satellite assemblies for .NET apps on Microsoft Learn.

Accept translations from resellers

Resellers can author culture-specific .resx source files, but a loose .resx file placed beside an installed DLL is not discovered by ResourceManager.

Use this release workflow for reseller translations:

  1. Provide the neutral Strings.resx file and the list of supported resource keys.
  2. Have the reseller return a culture-specific file, such as Strings.es.resx.
  3. Validate that the file contains the expected keys and build it with the integration.
  4. Deploy the generated satellite assembly in its culture directory.

If translations must be added after installation without a build, implement an integration-owned external string catalog and load it explicitly with Workspace.Culture. Security Center does not load loose integration .resx files or define fallback behavior for a custom catalog.

Distinguish display labels from identifiers

Names supplied to Security Center are not interchangeable with stable identifiers.

Definition SDK identifier Display text Per-client resource key
Custom field CustomField.Guid Name and GroupName None
Custom event CustomEvent.Id Name None
Entity instance Entity.Guid Name None
Custom entity type CustomEntityTypeDescriptor.Id Name NameKey with ResourceManagerTypeName

Security Center displays the stored Name for custom fields, custom events, and entity instances. Changing the client language does not replace those names. Do not create one definition per language because that creates separate schema items or entities. Create one definition and use its identifier in integration logic.

In a custom Workspace view, you can map a custom field GUID, custom event ID, or entity GUID to an integration resource key and display the translated string. Native Security Center pages continue to display the stored name. Custom entity types have a dedicated localization mechanism described in Plugin SDK localization.

Configure right-to-left layouts

Set Language and FlowDirection on the root element of each custom view. WPF child elements inherit these values unless you override them on a child.

using System.Windows;
using System.Windows.Markup;
using Genetec.Sdk.Workspace;

public static void ApplyCulture(
    FrameworkElement root,
    Workspace workspace)
{
    root.Language = XmlLanguage.GetLanguage(
        workspace.Culture.IetfLanguageTag);

    root.FlowDirection =
        workspace.Culture.TextInfo.IsRightToLeft
            ? FlowDirection.RightToLeft
            : FlowDirection.LeftToRight;
}

Apply these layout rules to views that support Arabic or Hebrew:

  • Use auto-sized WPF panels and text wrapping so translated text is not clipped.
  • Set an explicit left-to-right direction on paths, identifiers, or mixed-language text that must retain that order.
  • Do not explicitly mirror an image unless its meaning is directional.
  • Test the complete view in Security Desk and Config Tool with the Security Center language set to Arabic and Hebrew.

For WPF behavior, see the globalization and localization overview on Microsoft Learn and the bidirectional features overview on Microsoft Learn.

See also

Platform SDK

Plugin SDK

Workspace SDK

Media SDK

Macro SDK

Web SDK

Synergis RIO

Media Gateway

Genetec Web Player

Clone this wiki locally