Files
2026-04-17 14:55:32 -04:00

4.3 KiB

source_files, generated_at, model, schema_version, sha256
source_files generated_at model schema_version sha256
DataPRO/Modules/TestSetups/TestSetupsList/Resources/TranslateExtension.cs
DataPRO/Modules/TestSetups/TestSetupsList/Resources/StringResources.Designer.cs
2026-04-16T04:51:19.579629+00:00 Qwen/Qwen3-Coder-Next-FP8 1 9ca0cf52c1c54e32

Resources

Documentation: TranslateExtension Markup Extension


1. Purpose

The TranslateExtension class is a WPF MarkupExtension used to enable localized string binding in XAML. It resolves resource keys (e.g., "Name", "Description") to their corresponding localized string values at runtime by querying the strongly-typed StringResources class. This allows UI elements (e.g., TextBlock.Text, HeaderedContentControl.Header) to display culture-specific text without hardcoding strings, supporting internationalization of the TestSetupsList module.


2. Public Interface

TranslateExtension class

  • Constructor

    public TranslateExtension(string key)
    
    • Parameters:
      • key: The resource key (e.g., "Name", "LastModifiedBy") used to look up a localized string in StringResources.
    • Behavior: Stores the key for later resolution during ProvideValue.
  • ProvideValue method

    public override object ProvideValue(IServiceProvider serviceProvider)
    
    • Returns:
      • If _key is null or empty → "#stringnotfound#"
      • If StringResources.ResourceManager.GetString(_key) returns a non-null value → that string
      • Otherwise → "#stringnotfound# " + _key (e.g., "#stringnotfound# UnknownKey")
    • Behavior: Performs the actual resource lookup. Does not use the serviceProvider parameter (per source).

3. Invariants

  • _key is immutable after construction (no setter, no modification in ProvideValue).
  • Resource keys are expected to match exact keys in the .resx file (e.g., "Name", "PreTriggerSeconds"), case-sensitive.
  • The fallback string "#stringnotfound#" is hardcoded and used for both missing keys and empty keys.
  • StringResources.ResourceManager.GetString(_key) is called with the current UI culture (via CultureInfo stored in StringResources.Culture), not thread culture directly.
  • StringResources is auto-generated; manual edits to StringResources.Designer.cs will be overwritten.

4. Dependencies

Dependencies of TranslateExtension:

  • System.Windows.Markup.MarkupExtension (WPF base class)
  • TestSetupsList.Resources.StringResources (strongly-typed resource class)
    • Relies on System.Resources.ResourceManager and System.Globalization.CultureInfo
    • Requires the StringResources.resx file to be compiled into the TestSetupsList assembly (implied by "TestSetupsList.Resources.StringResources" in ResourceManager constructor).

Dependencies on TranslateExtension:

  • XAML files in the TestSetupsList module that use {local:Translate KeyName} syntax (where local maps to TestSetupsList namespace).
  • No direct runtime dependencies beyond WPF and the resource assembly.

5. Gotchas

  • No null-safety for missing keys: A key like "NonExistent" yields "#stringnotfound# NonExistent" — not null, not an exception. This may cause visible artifacts in UI if not handled.
  • Empty key handling: Passing "" or null to the constructor returns "#stringnotfound#" silently — no warning or exception.
  • No caching of resolved values: ProvideValue calls ResourceManager.GetString(_key) on every invocation (e.g., if used in a DataTemplate with many items). This is likely acceptable for typical UI strings but could be optimized.
  • No support for format strings or parameters: Unlike String.Format, this extension does not support placeholders (e.g., "Hello {0}"). Resource keys must resolve to fully formed strings.
  • Designer.cs auto-generation warning: Manual changes to StringResources.Designer.cs will be lost on rebuild. Resource keys must be added/modified via the .resx designer or file.
  • No serviceProvider usage: The ProvideValue method ignores the WPF-provided IServiceProvider, meaning it cannot resolve culture dynamically per context (e.g., per element). Relies solely on StringResources.Culture.

None identified beyond the above.