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

5.4 KiB
Raw Permalink Blame History

source_files, generated_at, model, schema_version, sha256
source_files generated_at model schema_version sha256
DataPRO/Modules/Channels/ChannelCodes/Resources/TranslateExtension.cs
DataPRO/Modules/Channels/ChannelCodes/Resources/StringResources.Designer.cs
2026-04-16T04:55:56.339798+00:00 Qwen/Qwen3-Coder-Next-FP8 1 3fc30f8d93dc5d3b

Resources

Documentation: TranslateExtension Markup Extension


Purpose

The TranslateExtension class provides a XAML markup extension for localized string lookup within the ChannelCodes module. It enables declarative binding of UI text to resource keys defined in StringResources.resx, supporting internationalization by resolving keys at runtime using the .NET ResourceManager. This allows UI elements (e.g., TextBlock.Text, Button.Content) to display culture-specific strings without hardcoding values or writing code-behind.


Public Interface

TranslateExtension(string key)

Constructor

  • Parameter: key (string) The resource key to look up (e.g., "ChannelCode", "DuplicateISOChannelCode").
  • Behavior: Stores the key for later resolution. No validation is performed at construction time.

public override object ProvideValue(IServiceProvider serviceProvider)

Markup Extension Entry Point

  • Parameter: serviceProvider (IServiceProvider) Provides services to the markup extension (unused in current implementation).
  • Returns:
    • string: The localized string corresponding to _key, or
    • NotFound ("#stringnotfound#"): If _key is null or empty,
    • NotFound + " " + _key: If _key is non-empty but no matching resource string is found.
  • Behavior:
    1. Checks if _key is null or empty → returns "#stringnotfound#".
    2. Calls StringResources.ResourceManager.GetString(_key) to retrieve the localized string.
    3. If GetString returns null, appends the key to the NotFound prefix (e.g., "#stringnotfound# MissingISOCode").

Note

: The MarkupExtensionReturnType attribute indicates this extension always returns a string.


Invariants

  1. Key Handling:
    • Empty or null keys are treated as invalid and always resolve to "#stringnotfound#".
    • Non-empty keys that lack a corresponding resource entry resolve to "#stringnotfound# <key>".
  2. Resource Lookup:
    • Uses StringResources.ResourceManager.GetString(key) with the current UI culture (via CultureInfo).
    • No fallback logic beyond the null check in ProvideValue.
  3. Thread Safety:
    • StringResources.ResourceManager is lazily initialized and cached (per StringResources class), but TranslateExtension itself is stateful per instance (stores _key). Reuse across threads is safe only if the same instance is not shared concurrently (standard for markup extensions).

Dependencies

Depends On

  • System.Windows.Markup.MarkupExtension (WPF framework)
  • ChannelCodes.Resources.StringResources (strongly-typed resource class)
    • Specifically relies on StringResources.ResourceManager and its GetString(string) method.
  • System (for string.IsNullOrEmpty, ResourceManager, CultureInfo)

Used By

  • XAML files in the ChannelCodes module (e.g., *.xaml pages) where localized text is declared via {local:Translate KeyName}.
  • Example usage:
    <TextBlock Text="{local:Translate ChannelCode}" />
    

Gotchas

  1. No Resource Key Validation at Compile Time:

    • Typos in resource keys (e.g., "ChannelCodee" instead of "ChannelCode") will silently resolve to "#stringnotfound# ChannelCodee" at runtime.
    • No build-time or design-time warning is generated for missing keys.
  2. Hardcoded NotFound Prefix:

    • The "#stringnotfound#" prefix is hardcoded and may be visible in the UI if a key is missing. This is likely intentional for debugging but could confuse end users.
  3. No Caching of Resolved Strings:

    • ProvideValue calls ResourceManager.GetString(_key) on every invocation. While ResourceManager caches resources internally, repeated use of the same key in a UI (e.g., in a DataTemplate) may incur unnecessary lookups. Consider caching if performance is critical.
  4. Culture Handling:

    • Respects StringResources.Culture (settable via StringResources.Culture = ...). If Culture is null, the UI threads CurrentUICulture is used.
    • No explicit handling for fallback cultures (e.g., en-USen).
  5. Auto-Generated Resource Class:

    • StringResources.Designer.cs is auto-generated. Manual edits will be overwritten. New strings must be added via .resx files and regenerated.
  6. No Support for Format Strings:

    • TranslateExtension does not support parameterized resources (e.g., "Error: {0} is missing"). While StringResources has entries like DuplicateISOChannelCode (which uses {0}), the extension itself does not accept or apply formatting arguments.
    • To use formatted strings, the caller must manually construct the key (e.g., "DuplicateISOChannelCode"), but the resolved string will remain unformatted unless the caller applies string.Format (not done here).
  7. WPF-Specific:

    • Depends on System.Windows.Markup, making it unusable outside WPF (e.g., in MAUI, WinUI, or console apps).

Documentation generated from source files dated to .NET Framework 4.0 and WPF. No external dependencies beyond standard .NET libraries.