Repository navigation
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.
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.
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.
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.
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:
- Provide the neutral
Strings.resxfile and the list of supported resource keys. - Have the reseller return a culture-specific file, such as
Strings.es.resx. - Validate that the file contains the expected keys and build it with the integration.
- 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.
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.
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.
- About custom fields: Custom field definitions and stable GUIDs.
- Custom events: Custom event definitions and numeric IDs.
- Overview
- Connecting to Security Center
- SDK certificates
- Referencing SDK assemblies
- ASP.NET hosting
- SDK compatibility
- Migrating to modern .NET
- Entities
- Entity cache
- Entity loading, cache, and query options
- Detecting entity changes
- Entity change event reference
- Transactions
- Security Center events
- Actions
- Security Desk
- Custom events
- Event-to-actions
- Managing macros
- ReportManager
- ReportManager query reference
- Access control raw events
- DownloadAllRelatedData and StrictResults
- Privileges
- Partitions
- Entity write restrictions
- About custom fields
- About video
- About cameras
- Enrolling a video unit
- Ingesting third-party video
- Archiver and auxiliary archiver roles
- Archive transfer
- About access control
- About cardholders and credentials
- About doors, areas, elevators, and access points
- About access rules and schedules
- About access control units and interface modules
- Enrolling an access control unit
- Door templates
- Visitors
- Mobile credentials
- About threat levels
- About alarms
- About incidents
- Maps
- Logging
- Overview
- Localization
- Certificates
- Lifecycle
- Threading
- State management
- Configuration
- Restricted configuration
- Events
- Queries
- Request manager
- Database
- Entity ownership
- Engine extensions
- Entity mappings
- Server management
- Custom privileges
- Custom entity types
- Resolving non-SDK assemblies
- Deploying plugins
- Modern .NET support
- Overview
- Localization
- Certificates
- Creating modules
- Tasks
- Pages
- Components
- Tile extensions
- Services
- Contextual actions
- Custom actions
- Options extensions
- Configuration pages
- Monitors
- Shared components
- Commands
- Extending events
- Map extensions
- Timeline providers
- Image extractors
- Credential encoders
- Credential readers
- Cardholder fields extractors
- Badge printers
- Content builders
- Dashboard widgets
- Incidents
- Logon providers
- Pinnable content builders
- Custom report pages
- Overview
- Getting started
- Media file formats
- MediaPlayer
- VideoSourceFilter
- MediaExporter
- MediaFile
- G64 converters
- FileCryptingManager
- PlaybackSequenceQuerier
- PlaybackStreamReader
- OverlayFactory
- PtzCoordinatesManager
- AudioTransmitter
- AudioRecorder
- AnalogMonitorController
- Camera blocking
- Overview
- Getting started
- Referencing entities
- Entity operations
- About access control in the Web SDK
- About video in the Web SDK
- Users and user groups
- Partitions
- Custom fields
- Custom card formats
- Actions
- Events and alarms
- Incidents
- Reports
- Tasks
- Macros
- Custom entity types
- System endpoints
- Performance guide
- Reference
- Endpoints
- Constants
- Enumerations
- Under the hood
- Troubleshooting