← All courses
UI · Free course

Localization in Wisej.NET

Sooner or later somebody asks for the application in another language, and the answer is never just translation. This beginner course teaches you to localize a Wisej.NET application the standard .NET way — .resx resources, CultureInfo and ResourceManager — while handling what is specific to a server-side web UI: a culture that belongs to the session rather than the process, designer resources that are applied when controls are created, and a language switch that has to repaint screens that are already open. Everything is built around GlobalDesk, a small multilingual service desk. Seven modules start with culture names, resource fallback and the difference between translating text and formatting values, then localize a screen through the Visual Studio designer, build shared Strings.resx resources read through ResourceManager, and override Wisej system labels. From there you'll detect the browser language, switch Application.CurrentCulture at runtime and handle CultureChanged, mirror layouts for right-to-left cultures, run a real translation round with ResX Resource Manager or a RESX-capable platform, and finish with a localization service, a QA test matrix and the GlobalDesk capstone. It's written for developers who know basic C# and Wisej.NET controls and now have to ship the product in more than one language.

Ship the app in more than one language — .resx resources, culture-aware formatting, runtime switching and RTL layouts.

Start this free course

Also available in: DeutschFrançaisItalianoEspañol

Curriculum

Module 1: Localization Fundamentals: Culture, Language and Resources

Module 1 of Localization in Wisej.NET — build multilingual apps with .resx resources, culture-aware formatting, runtime language switching and right-to-left layouts. Read the lesson guide and the lab / exam guide, watch the localization fundamentals walkthrough, pass the knowledge check, then complete the hands-on lab in GlobalDesk.

  1. ReadingLesson Guide · 14 min

    What localization actually covers beyond translation: culture names such as en, de-DE and fr-CA, .resx resource files read through ResourceManager, .NET culture fallback to the neutral resource, stable semantic keys instead of English sentences in code, and culture-sensitive formatting of dates, numbers and currency. What this means for a developer who knows basic C# and Wisej.NET controls and now has to ship the application in more than one language — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonCulture, resources and the text you must never hard-code · 14 min

    Culture, resources and the text you must never hard-code — a guided Module 1 walkthrough, built step by step in GlobalDesk. Runs right here in the player.

    Narration transcript

    Localization in Wisej.NET, Module 1. GlobalDesk is a service desk written for exactly one office, and turning it into an application several offices can use starts with two separate jobs.

    Hard-coded English is only half the problem. Building an amount by putting a dollar sign in front of a number pins one country's convention into the code, and no translation file will ever undo that. Wisej.NET uses the standard .NET model here: resource files, CultureInfo and ResourceManager.

    A culture name joins a language with a region. English on its own is language only, while English United States, German Germany and French Canada each add regional conventions. The language decides the words you show; the culture decides how dates, numbers and amounts are written.

    Resource files stack. A lookup tries the most specific file first, then the language-only file, and finally the neutral one. Because the neutral file is the last stop, it has to be complete: anything missing there has nothing left to fall back to.

    In code, that means twelve semantic keys in the neutral resource file and one ResourceManager built from the base name and the assembly. A helper returns the key in brackets when nothing is found, so a gap shows up as something you can read on screen rather than as an empty label nobody notices.

    Now the rewrite. One method puts words on the screen by looking each caption up by key. A second formats a date, a number and an amount using the current culture at the moment of display, which keeps the stored values themselves untouched and neutral.

    Running it, every caption resolves except one, and that one renders as its key in brackets. The gap is visible instead of silent. Add the missing key, and all three preview values are formatted according to the culture this session is running under.

    Two browsers against one server process, one in English and one in German, show the same code, the same keys and the same stored decimal rendered two ways. That works because the culture belongs to the session, and never to a static field shared by everyone.

    Lab one: build the GlobalDesk dashboard on a neutral resource file, add the text helper that marks a missing key, add the culture preview panel, and write the note separating data from presentation.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's GlobalDesk sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 1 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Resource Keys and Culture-Aware Formatting · 45 min

    Objective: Create the GlobalDesk dashboard page with a welcome heading, a Customers navigation button and a small culture preview panel. Add Resources/Strings.resx as the neutral resource with at least twelve stable semantic keys such as Navigation.Customers and CustomerEditor.Save, write a static Texts helper over Wisej.Resources.ResourceManager that returns a bracketed key marker when a key is missing, and replace every hard-coded caption on the page with a Texts.Get call. Then fill the preview panel from real values: format today's date, a quantity and a currency amount with Application.CurrentCulture instead of building the strings by hand, and finish with a short lab note that separates the stored value from its culture-sensitive presentation. Deliverables: GlobalDesk dashboard page whose captions all come from resource keys, with no hard-coded user-visible text; Resources/Strings.resx neutral file holding at least twelve stable semantic keys; Texts helper over Wisej.Resources.ResourceManager that marks a missing key instead of returning blank; Culture preview panel formatting a date, a number and a currency with Application.CurrentCulture; Lab note explaining which values are data and which are culture-sensitive presentation.

Module 2: Localizing Wisej.NET UI in the Visual Studio Designer

Module 2 of Localization in Wisej.NET — build multilingual apps with .resx resources, culture-aware formatting, runtime language switching and right-to-left layouts. Read the lesson guide and the lab / exam guide, watch the designer localization walkthrough, pass the knowledge check, then complete the hands-on lab in GlobalDesk.

  1. ReadingLesson Guide · 14 min

    Designer localization on a top-level Wisej.NET container: the Localizable property, the designer Language selector, the properties that legitimately differ per language such as Text, Size, Location, colors and images, the resource files the designer generates, and the rule that designer resources are applied when the controls are created. What this means for a developer who knows basic C# and Wisej.NET controls and now has to ship the application in more than one language — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonLocalizable, the Language selector and what the designer writes · 14 min

    Localizable, the Language selector and what the designer writes — a guided Module 2 walkthrough, built step by step in GlobalDesk. Runs right here in the player.

    Narration transcript

    Module 2, localizing a screen that was drawn rather than written. The GlobalDesk customer editor was arranged in the Visual Studio designer, and German needs different words and, it turns out, different geometry.

    Captions that live only in the designer are unreachable for a translator. A German caption will not fit a button sized for the English one. And widening every button to suit the longest language you might ever ship ruins the layout for the language most of your users actually read.

    Six steps. Finish the neutral layout first. Set the form to be localizable. Pick the language. Change only what differs. Run the application under that culture. Then return the designer to neutral before making any structural change, because structural edits belong to the neutral layout alone.

    The generated designer code keeps only the neutral values, with automatic sizing, anchoring and docking doing the layout work. The German text, size and position are written into generated resource files instead, which is why a translator can be given files rather than a development environment.

    The current culture belongs to the session, never to a static field. And because designer resources are read when a control is created, changing the culture does not repaint a screen that already exists. The editor has to be removed, disposed and built again before it reads its resources afresh.

    Decide the layer before you add the string. Text, size, position, colours and images that belong to one designed screen belong in that screen's designer resources. Anything the code generates, and anything several screens share, belongs in the shared resource file instead.

    Running under German, the captions clip inside a button width that was measured against English, until the size is overridden for German only. The browser is what proves this, not the design surface, because the design surface is showing you the neutral layout.

    Switching the session culture while the application runs leaves the open editor in English. It stays that way until the recreate action disposes it and builds a new one, which then reads its resources under the new culture. That is the creation-time rule, seen directly.

    Lab two: make the customer editor localizable, add a German variant with one size and one position override, keep the captions from clipping, and demonstrate the creation-time rule.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's GlobalDesk sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 2 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Localizable, the Language Selector and a Rebuilt Editor · 45 min

    Objective: Localize the GlobalDesk customer editor through the Visual Studio designer. Finish the neutral English layout of the CustomerEditor user control first, then set Localizable to true and use the designer Language selector to add a German variant, changing only what must differ: the captions, the width of the two longest buttons and one label's Location. Run the application under de-DE and compare the real browser output with the designer view, then add a Recreate editor button that disposes and rebuilds the control so you can see for yourself why designer resources do not follow a runtime culture change. Finish with a lab note that lists the properties you overrode and the ones you deliberately left to the neutral layout. Deliverables: CustomerEditor user control with Localizable set to true over a complete neutral English layout; German designer language variant overriding the captions plus at least one Size and one Location; Anchoring, docking or AutoSize applied so the German captions cannot clip; Recreate editor button that disposes and rebuilds the container after a culture change; Lab note listing the overridden properties and the ones left to the neutral layout.

Module 3: Application Resources, ResourceManager and Wisej System Text

Module 3 of Localization in Wisej.NET — build multilingual apps with .resx resources, culture-aware formatting, runtime language switching and right-to-left layouts. Read the lesson guide and the lab / exam guide, watch the shared resources walkthrough, pass the knowledge check, then complete the hands-on lab in GlobalDesk.

  1. ReadingLesson Guide · 14 min

    The shared resource layer: neutral and culture-specific .resx files that carry identical keys, Wisej.Resources.ResourceManager lookup by base name and assembly, placeholders formatted with string.Format and the active culture, services that return keys rather than English sentences, and Resources-[LANG].resx for Wisej system labels. What this means for a developer who knows basic C# and Wisej.NET controls and now has to ship the application in more than one language — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonOne key, two resource files, and Wisej's own labels · 14 min

    One key, two resource files, and Wisej's own labels — a guided Module 3 walkthrough, built step by step in GlobalDesk. Runs right here in the player.

    Narration transcript

    Localization in Wisej.NET, Module 3, the shared resource layer. This is the text no designed control owns, together with the labels Wisej.NET draws for itself, inside GlobalDesk.

    Module 2 translated the captions on the screen. The save confirmation, the validation messages, the status line and the result returned by a service are still English literals sitting in code, and designer localization cannot reach any of them, because no control owns them.

    The neutral resource file holds every key. The German file sits beside it with exactly the same keys and translated values only. A lookup walks from the most specific culture through the language-only file to the neutral one and takes the first match it finds, which is what makes partial translation safe.

    One resource manager, built from the base name and the assembly, sits behind a small helper that returns the key in brackets rather than an empty string when a value is missing.

    Keep each sentence whole. Store the full sentence with a placeholder, then format it for the current culture, rather than concatenating translated fragments in code.

    Three layers, three owners. Designer resources carry one screen's own text. The shared strings file carries product text used anywhere. And a separate resource file overrides the labels Wisej.NET itself supplies, such as the buttons on a standard dialog.

    The save service returns a key rather than an English sentence, and the editor is the only place that turns a result into words. The log line stays in one language deliberately, because a developer reading a log at three in the morning is not helped by a translated message.

    Run it in English, then in German, then open a message box whose confirm button comes from your system label override rather than from the framework default. Delete one key from the German file and the lookup falls back to the neutral value instead of showing a blank.

    What you submit is the German file with identical keys, one sentence formatted from a placeholder, a service that returns a key instead of prose, one Wisej system label overridden, and the note explaining the three kinds of text.

    Lab three: add the German strings file, format the placeholder sentence for the active culture, return a result key from the save service, and override one system label.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's GlobalDesk sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 3 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Strings.de.resx, Placeholders and a System Label · 45 min

    Objective: Grow the GlobalDesk shared resources. Add Strings.de.resx beside Resources/Strings.resx carrying exactly the same keys with translated values, add a Customer.LastOrder entry that holds two placeholders, and build the sentence with string.Format and Application.CurrentCulture instead of concatenating fragments. Route every message the customer editor shows through the Texts helper, including the save confirmation and the two validation messages, and have the save service return a stable result key such as CustomerEditor.Saved rather than an English sentence the UI prints directly. Then add a Resources-de.resx file that overrides one Wisej system label, prove it in a MessageBox, and write a short note on the difference between your product text and Wisej system text. Deliverables: Strings.de.resx carrying the same keys as the neutral file with translated values only; Customer.LastOrder resource built with string.Format and the active culture, never concatenated; Save service returning a resource key or result code instead of an English sentence; Resources-de.resx overriding at least one Wisej system label, shown in a MessageBox; Lab note separating product text, Wisej system text and diagnostic text.

Module 4: Browser Culture, Session Culture and Runtime Language Switching

Module 4 of Localization in Wisej.NET — build multilingual apps with .resx resources, culture-aware formatting, runtime language switching and right-to-left layouts. Read the lesson guide and the lab / exam guide, watch the runtime culture walkthrough, pass the knowledge check, then complete the hands-on lab in GlobalDesk.

  1. ReadingLesson Guide · 14 min

    Where a session's culture comes from and what has to happen when it changes: the Default.json culture setting, automatic browser detection, the lang URL parameter, Application.CurrentCulture as per-session state, the Application.CultureChanged event, and reapplying resource-backed text so no half-translated screen survives the switch. What this means for a developer who knows basic C# and Wisej.NET controls and now has to ship the application in more than one language — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonDetect it, switch it, then repaint what the switch left behind · 14 min

    Detect it, switch it, then repaint what the switch left behind — a guided Module 4 walkthrough, built step by step in GlobalDesk. Runs right here in the player.

    Narration transcript

    Module 4. GlobalDesk now has German resources, a German designer variant and a German system label. What it still has no answer for is which language this particular session should run in.

    A session's culture can come from the browser's own preference, from a fixed value in the application configuration, from a parameter on the address, or from a picker the user operates. Whichever of those wins, decide it once at the start of the session rather than re-deriving it on every screen.

    The current culture property is the culture of the current session. A static field holding a culture would instead be the culture of the whole server process, and therefore of every other user signed in to it, which is the single most expensive mistake in this subject.

    Setting the culture to automatic starts each session from the browser preference. Setting a fixed name pins one locale, which is right for a test run or a product sold into a single market. The picker assigns a culture obtained by name.

    Subscribe once to the culture-changed event, and let one handler do all the repair work. It reapplies the resource-backed captions, reformats the date, the number and the amount, and rebuilds the designer-localized editor, so every kind of text ends up consistent.

    Four kinds of text, four different fates. Controls created after the switch follow on their own. Captions already on screen must be reapplied. Formatted values must be recomputed. Designer-localized screens must be recreated, because their resources were read when they were built.

    German is picked, and the heading, the navigation and the three formatted previews all change. The editor stays in English until the recreate call runs. That gap, between the parts that follow immediately and the parts that do not, is the defect this module exists to prevent.

    A language parameter on the address opens one session in German while the next browser stays in English. Two cultures alive in one process at the same time is exactly the behaviour a static culture field would destroy for both of them.

    Lab four: set the culture to automatic, add the language selector, write the culture-changed handler that reapplies captions and reformats values, and recreate the editor.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's GlobalDesk sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 4 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Auto Detection, a Language Picker and CultureChanged · 45 min

    Objective: Give GlobalDesk a language switch that finishes the job. Set culture to auto in Default.json so the session starts from the browser language, add a language ComboBox offering English, German and one language-region culture, and set Application.CurrentCulture from CultureInfo.GetCultureInfo in its SelectedIndexChanged handler without ever storing the choice in a static field. Handle Application.CultureChanged to call an ApplyTextResources method that refreshes every resource-backed caption and an UpdateCulturePreview method that reformats the date, number and currency samples, and recreate the designer-localized customer editor in the same handler. Verify the same page through the lang URL parameter, then write a lab note describing what a static culture field would do to a second user signed in at the same time. Deliverables: Default.json with culture set to auto, plus a note on when a fixed culture is the right choice; Language ComboBox handler setting Application.CurrentCulture from CultureInfo.GetCultureInfo; Application.CultureChanged handler calling ApplyTextResources and UpdateCulturePreview; Designer-localized editor recreated after the switch so no caption stays in the old language; Verification through the lang URL parameter and a note on why culture must not live in a static field.

Module 5: Right-to-Left Languages and Localization-Safe Layouts

Module 5 of Localization in Wisej.NET — build multilingual apps with .resx resources, culture-aware formatting, runtime language switching and right-to-left layouts. Read the lesson guide and the lab / exam guide, watch the right-to-left walkthrough, pass the knowledge check, then complete the hands-on lab in GlobalDesk.

  1. ReadingLesson Guide · 14 min

    Right-to-left support in Wisej.NET: RightToLeft with Inherit, No and Yes, RightToLeftLayout mirroring a container's children, the rightToLeft application setting, layouts that survive text expansion, the theme's rightToLeft state, and the documented limits on DataGridView, ListView and PropertyGrid. What this means for a developer who knows basic C# and Wisej.NET controls and now has to ship the application in more than one language — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonMirror the layout, not just the text · 14 min

    Mirror the layout, not just the text — a guided Module 5 walkthrough, built step by step in GlobalDesk. Runs right here in the player.

    Narration transcript

    Localization in Wisej.NET, Module 5. GlobalDesk already speaks Arabic. This module is about making it read like Arabic, which is a layout problem rather than a translation one.

    Module 4 finished the words. An Arabic session still begins at the wrong edge of the screen, so the eye lands on the last thing instead of the first. And the German captions are already clipping inside a panel that was measured against English.

    Two properties with two different jobs. The right-to-left property changes direction inside a control, which is how text and its alignment flip. The right-to-left layout property mirrors a container's direct children, which is how the arrangement itself flips.

    One setting decides for the whole application. Configuring the direction as automatic derives it from the session culture, so no screen needs to test a culture name for itself. A test like that in one screen is a test somebody forgets to add to the next screen.

    Mirroring only looks right if the layout is free to move. Docking, anchoring, automatic sizing, a container layout and sensible minimum sizes all replace fixed pixel positions. And a deliberate left-to-right exception keeps something like a customer code readable, because an identifier is not prose.

    Then test it properly: short text, a noticeably longer translation, a narrow window, a right-to-left culture, and mixed content such as an Arabic label sitting next to a Latin product code. Each of those breaks a different assumption.

    In the browser, the picker selects Arabic, the application direction follows the session culture, and one container property mirrors the dashboard. Nothing here is global state: the direction, like the culture, belongs to this session alone.

    The pseudo-localized pass exposes what English was hiding, and the rebuilt layout stops clipping. The contacts grid gets checked and its behaviour written down rather than assumed, because a grid has its own column and alignment rules to verify.

    Lab five: add Arabic with automatic direction, mirror both screens with their children inheriting, add one commented left-to-right exception, make the layout clip-proof, and write the five-case test list.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's GlobalDesk sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 5 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — RightToLeftLayout, Mirroring and a Clip-Proof Layout · 45 min

    Objective: Make GlobalDesk survive a right-to-left culture. Add Arabic to the language picker and set rightToLeft to auto in Default.json, leave the child controls on RightToLeft.Inherit, and set RightToLeftLayout on the dashboard and the customer editor so their children mirror. Keep exactly one control left-to-right, the customer code field, and say in a comment why that identifier must not flip. Rebuild the fixed-position part of the layout with docking, anchoring and a container layout so a long translation cannot clip, add a pseudo-localized resource file whose values are lengthened and bracketed, and record what the contacts DataGridView actually does under RTL rather than assuming it mirrors. Finish with a five-case layout test list you can rerun on any screen. Deliverables: Arabic entry in the language picker with rightToLeft set to auto in Default.json; Dashboard and customer editor using RightToLeftLayout with their children left on Inherit; One deliberately left-to-right control with a comment explaining the exception; Layout rebuilt with docking, anchoring and a container layout so long translations cannot clip; RTL test list covering short text, long text, a narrow window, an RTL culture and the DataGridView limitation.

Module 6: Translation Workflow: ResX Resource Manager and Other Tools

Module 6 of Localization in Wisej.NET — build multilingual apps with .resx resources, culture-aware formatting, runtime language switching and right-to-left layouts. Read the lesson guide and the lab / exam guide, watch the translation workflow walkthrough, pass the knowledge check, then complete the hands-on lab in GlobalDesk.

  1. ReadingLesson Guide · 14 min

    Treating translations as team work: the ResX Resource Manager matrix over every .resx in the solution, adding a language column and filtering for untranslated entries, resource comments that give translators context, invariant strings, automatic translation as a draft only, export and import with a RESX-capable platform, and reviewing resource diffs like code. What this means for a developer who knows basic C# and Wisej.NET controls and now has to ship the application in more than one language — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonA grid of every key, every language, every gap · 14 min

    A grid of every key, every language, every gap — a guided Module 6 walkthrough, built step by step in GlobalDesk. Runs right here in the player.

    Narration transcript

    Module 6. GlobalDesk already has four resource files. Adding Italian with two editor tabs means comparing key lists by eye, and the person who speaks Italian cannot open the solution.

    Three things break down at this point: comparing files by eye, answering how much translation is left, and handing the strings to somebody who has never opened a resource file and should not have to.

    A resource manager tool puts the keys down the rows and each language across the columns, so a gap is a blank cell rather than something you have to notice. Wisej.NET stores its text in standard .NET resource files, so no special support is needed.

    What the tool writes is an ordinary Italian resource file: exactly the keys of the neutral file, the translated values, a comment on the ones that were ambiguous, and one entry deliberately left empty so the fallback can be demonstrated.

    The round itself has a shape. Add the language, filter to untranslated entries only, draft the values, mark the product name as invariant so nobody translates it, then review. In this round the review earns its place: the draft had swapped two placeholders.

    Automatic translation produces a draft, not a result. Review terminology, placeholders, punctuation, keyboard accelerators and product names, and read the difference in version control before committing the round, the same as any other change to the application.

    Trust the filter, then prove it independently. Skip the invariant keys, compare each Italian lookup against the neutral value, and list every key that is still falling back to English rather than assuming the column is complete.

    Running under Italian, the captions come from the translated resource file, while the date, the quantity and the amount are formatted for the active culture at the moment they are displayed. Those are two separate mechanisms doing two separate jobs.

    One developer and two languages can live in the editor. A team with several languages wants the resource manager tool. Translators who are not developers need an export and import round, or a translation management service.

    Lab six: complete an Italian column with no untranslated key, comment three ambiguous keys, mark the invariants, review the resource file difference, and write the workflow note.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's GlobalDesk sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 6 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — A Language Column, Comments and a Reviewed Diff · 45 min

    Objective: Run one honest translation round on GlobalDesk. Open the solution in ResX Resource Manager, add Italian as a new language column, and use the untranslated filter to list every key that still has no value. Add comments to the three keys whose meaning is ambiguous out of context, starting with the one-word Open caption, then translate or machine-draft the Italian values and mark the product name and the two technical identifiers as invariant so nobody translates them. Export the neutral and Italian columns, re-import them, and review the resulting .resx diff before you commit it as one reviewable change. Finish with a one-page workflow note comparing the Visual Studio editor, ResX Resource Manager and a cloud platform for a team whose translators are not developers. Deliverables: Strings.it.resx produced through ResX Resource Manager with no untranslated key left; Resource comments on at least three ambiguous keys so a translator has the context; Invariant markers on the product name and the identifiers that must not be translated; Export, re-import and a reviewed .resx diff committed as one change; Workflow note comparing the Visual Studio editor, ResX Resource Manager and a cloud TMS.

Module 7: Production Localization Architecture, Testing and Capstone

Module 7 of Localization in Wisej.NET — build multilingual apps with .resx resources, culture-aware formatting, runtime language switching and right-to-left layouts. Read the lesson guide and the lab / exam guide, watch the capstone LocalizationService walkthrough, pass the knowledge check, then complete the hands-on lab in GlobalDesk.

  1. ReadingLesson Guide · 14 min

    Localization that survives production: a thin LocalizationService over ResourceManager, domain code that returns values instead of sentences, an observable missing-key policy, a localization test matrix, pseudo-localization that exposes hard-coded strings, satellite-assembly deployment, and the GlobalDesk capstone. What this means for a developer who knows basic C# and Wisej.NET controls and now has to ship the application in more than one language — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonOne service, one test matrix, one finished capstone · 14 min

    One service, one test matrix, one finished capstone — a guided Module 7 walkthrough, built step by step in GlobalDesk. Runs right here in the player.

    Narration transcript

    Localization in Wisej.NET, Module 7, the capstone. GlobalDesk already speaks two languages. What production asks is a different question: whether it behaves predictably while doing so.

    Four questions the application has to answer the same way every time. Where does a given string come from. Which culture is active right now. What happens when a key is missing. And what a language switch does to the screens that are already open.

    Separate the text by owner first. Your own product strings. The system labels Wisej.NET supplies, overridden in their own resource file. And diagnostic text, which stays in one language for developers, because a log is read by the team rather than by the customer.

    A localization service centralizes those choices without replacing anything .NET already does. One resource manager. A lookup that returns the key in brackets rather than nothing. And formatting that reads the current culture on each call instead of capturing it once and holding it.

    Then move language out of the screen and out of the model. Keep the date as a date and the amount as a decimal, return a status as an enumeration value rather than a translated word, and let the service turn all of that into the caption the user finally reads.

    Testing here is a written matrix, not a glance at one screen. Neutral, translated, a region that falls back to its language, a missing key, formatted values, a switch while running, deliberately long strings, right-to-left, and the framework's own system labels.

    The pseudo-localized pass lengthens every value and wraps it in brackets. Anything still showing plain English never reached a resource file, and anything that clips under the longer text will clip in German too. Both findings come free from the same run.

    The demonstration is four proofs: German captions alongside culture-formatted values, a Wisej system dialog in the same language, a missing key falling back visibly to its key, and finally the mirrored right-to-left layout.

    Lab seven: build the localization service, return values rather than words from the domain, produce the pseudo-localized set, complete the test matrix, and publish while keeping the culture folders.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's GlobalDesk sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 7 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Capstone: LocalizationService and the QA Matrix · 45 min

    Objective: Finish the GlobalDesk capstone. Wrap every resource lookup in a LocalizationService with Text, Date, Number and Currency methods, give it a missing-key policy that shows a bracketed key in development and logs the key in production, and make that service the only place the UI touches ResourceManager. Keep the domain out of it: the ticket model exposes a TicketStatus value and the UI maps it to a localized caption. Then run the localization test matrix over the finished application, covering the neutral culture, German, a language-region culture that falls back, a deliberately missing key, formatted dates and currency, a runtime switch, a long-string pass and the RTL culture, using a pseudo-localized resource set to expose anything still hard-coded. Confirm the culture folders survive a publish, and hand in the QA checklist as the capstone deliverable. Deliverables: LocalizationService with Text, Date, Number and Currency methods and a documented missing-key policy; Domain code returning a TicketStatus value that the UI maps to a localized caption; Pseudo-localized resource set used to find every remaining hard-coded string; Completed localization test matrix covering fallback, formatting, runtime switching and RTL; Published output checked for its culture folders, plus the GlobalDesk localization QA checklist.