[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: [konne, seriousm]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nCode snipet, or better a small code example that shows the issue\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Enviroment (please complete the following information):**\n - OS: [e.g. iOS]\n - .NET Framework: [e.g. NET452, netcore30]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: nuget\n  directory: \"/src\"\n  schedule:\n    interval: daily\n    time: \"08:00\"\n    timezone: Europe/Berlin\n  target-branch: development\n\n- package-ecosystem: \"github-actions\"\n  directory: \"/\"\n  schedule:\n    # Check for updates to GitHub Actions every weekday\n    interval: \"daily\"\n"
  },
  {
    "path": ".github/release-drafter.yml",
    "content": "categories:\n  - title: 'Features'\n    labels:\n      - 'feature'\n      - 'enhancement'\n  - title: 'Bug Fixes'\n    labels:\n      - 'fix'\n      - 'bugfix'\n      - 'bug'\n  - title: 'Maintenance'\n    labels:\n      - 'chore'\n      - 'dependencies'\nchange-template: '- $TITLE @$AUTHOR (#$NUMBER)'\ntemplate: |\n  ## Changes\n\n  $CHANGES\n"
  },
  {
    "path": ".github/workflows/compile.yml",
    "content": "name: .NET\n\non:\n  push:\n    branches: [ master, development ]\n    paths-ignore:\n      - '*.md'\n      - 'docs/**'\n\n  pull_request:\n    branches: [ master, development ]\n    paths-ignore:\n      - '*.md'\n      - 'docs/**'\n\n  workflow_dispatch:\n    branches: [ master, development ]\n    paths-ignore:\n      - '*.md'\n      - 'docs/**'\n\njobs:\n  build:\n    runs-on: windows-latest\n\n    steps:\n    - name: checkout\n      uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n\n    - name: Fetch all history for all tags and branches\n      run: |\n        git fetch --prune\n\n    - name: Setup MSBuild.exe\n      uses: microsoft/setup-msbuild@v2\n\n    - name: Cache Nuget\n      uses: actions/cache@v4.0.2\n      with:\n        path: ~/.nuget/packages\n        key: ${{ runner.os }}-nugetv1-${{ hashFiles('**/packages.lock.json') }}\n        restore-keys: |\n          ${{ runner.os }}-nugetv1-\n\n    - name: Build\n      working-directory: src\n      run: |\n        dotnet restore --disable-parallel\n        # dotnet build --disable-parallel --configuration Release\n        # can't use pure dotnet build because gitversion issues\n        msbuild ${{ github.event.repository.name }}.csproj -verbosity:minimal /p:Configuration=Release /property:DisableGitVersionTask=true\n\n        # add check for PR against master from development -> build preRelease to nuget\n        # if merged into master -> build Release -> nuget\n        # if: github.ref == 'refs/heads/master' || (startsWith(github.ref, 'refs/tags/') && contains(github.ref,'-alpha'))\n        #/property:NugetAPIKey=${{ secrets.NugetAPIKey }}\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "name: Publish\n\non:\n  release:\n    types: [ published ]\n\njobs:\n  build:\n    runs-on: windows-latest\n\n    steps:\n    - name: checkout\n      uses: actions/checkout@v4\n\n    - name: Setup MSBuild.exe\n      uses: microsoft/setup-msbuild@v2\n\n    - name: Write Fullkey.snk\n      uses: RollyPeres/base64-to-path@v1\n      with:\n        filePath: ${{ github.workspace }}/src/fullkey.snk\n        encodedString: ${{ secrets.SIGNKEY }}\n\n    - name: Create msbuild params\n      run: |\n        echo \"::set-output name=params::${{ github.event.repository.name }}.csproj -verbosity:minimal /p:Configuration=Release /property:DisableGitVersionTask=true /property:GitVersion_NuGetVersion=${{ github.event.release.tag_name }} /property:Version=${{ github.event.release.tag_name }}\"\n      id: msbuild\n    \n    - name: add nuget API Key for releases\n      if: \"!github.event.release.prerelease\"\n      run: |\n        echo \"::set-output name=params::/property:NugetAPIKey=${{ secrets.NugetAPIKey }}\"      \n      id: apikey\n\n    - name: Restore\n      working-directory: src\n      run: |\n        dotnet restore --disable-parallel\n\n    - name: Restore & Build & (Publish)\n      working-directory: src\n      run: |\n        msbuild ${{ steps.msbuild.outputs.params }} ${{ steps.apikey.outputs.params }}\n        rm -R .\\obj\\Release\n        msbuild ${{ steps.msbuild.outputs.params }} ${{ steps.apikey.outputs.params }} /property:UnSigned=true\n\n    - name: Upload Release Assets\n      uses: softprops/action-gh-release@v2\n      with:\n        files: src/bin/Release/*.nupkg\n"
  },
  {
    "path": ".github/workflows/release-drafter.yaml",
    "content": "name: Release\n\non:\n  push:\n    branches: [ master ]\n    paths:\n      - 'src/**'\n      - '.github/workflows/release-drafter.yml'\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: checkout\n      uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n\n    - name: Fetch all history for all tags and branches\n      run: |\n        git fetch --prune\n\n    - name: Install GitVersion\n      uses: gittools/actions/gitversion/setup@v3.0.0\n      with:\n         versionSpec: '5.6.x'\n\n    - name: Use GitVersion\n      id: gitversion\n      uses: gittools/actions/gitversion/execute@v3.0.0\n\n    - name: create release\n      id: create_release\n      uses: release-drafter/release-drafter@v6\n      with:\n        tag: '${{ steps.gitversion.outputs.semVer }}'\n        name: 'Release ${{ steps.gitversion.outputs.semVer }}'\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "#ignore thumbnails created by windows\nThumbs.db\n#Ignore files build by Visual Studio\n*.obj\n*.exe\n*.pdb\n*.user\n*.aps\n*.pch\n*.vspscc\n*_i.c\n*_p.c\n*.ncb\n*.suo\n*.tlb\n*.tlh\n*.bak\n*.cache\n*.ilk\n*.log\n[Bb]in\n[Dd]ebug*/\n*.lib\n*.sbr\nobj/\n[Rr]elease*/\n_ReSharper*/\n[Tt]est[Rr]esult*\nSandbox\n*Sandbox*\n*.ncrunchsolution\n*.xap\nClientBin/*\n*.zip\n*.pfx\nExample.xlsx\npackages/\n.vs/\n*.nupkg\n\n# Jetbrain Rider Cache\n.idea/ "
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "Thanks for reporting an issue!\n\nPlease keep in mind that this project is not actively developed and that @MrCircuit and I (@SeriousM) don't work full-time on it.\n\nIf you have a clue how to resolve the issue please try to resolve it yourself and send us a Pull Request including unit tests.\n\nOpen-Source means not only the \"free\" availability of source code, it also means that the users are free to contribute to it to make it better.\n\nThank you for your help and understanding.\n"
  },
  {
    "path": "LICENSE",
    "content": "Microsoft Public License (Ms-PL)\n\nThis license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.\n\n1. Definitions\n\nThe terms \"reproduce,\" \"reproduction,\" \"derivative works,\" and \"distribution\" have the same meaning here as under U.S. copyright law.\n\nA \"contribution\" is the original software, or any additions or changes to the software.\n\nA \"contributor\" is any person that distributes its contribution under this license.\n\n\"Licensed patents\" are a contributor's patent claims that read directly on its contribution.\n\n2. Grant of Rights\n\n(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.\n\n(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.\n\n3. Conditions and Limitations\n\n(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.\n\n(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.\n\n(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.\n\n(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.\n\n(E) The software is licensed \"as-is.\" You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\n"
  },
  {
    "path": "README.md",
    "content": "# WPFLocalizeExtension\n[![CodeFactor](https://www.codefactor.io/repository/github/xamlmarkupextensions/WPFLocalizeExtension/badge/master)](https://www.codefactor.io/repository/github/xamlmarkupextensions/WPFLocalizeExtension/overview/master)\n[![Nuget](https://img.shields.io/nuget/v/WpfLocalizeExtension.svg)](https://www.nuget.org/packages/WpfLocalizeExtension)\n![.NET](https://github.com/XAMLMarkupExtensions/WPFLocalizeExtension/workflows/.NET/badge.svg)\n[![Join the chat at https://gitter.im/SeriousM/WPFLocalizationExtension](https://badges.gitter.im/SeriousM/WPFLocalizationExtension.svg)](https://gitter.im/SeriousM/WPFLocalizationExtension?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n#### ...is a really the easiest way to localize any type of DependencyProperties or native Properties on DependencyObjects since 2008!\n\n## Supported Frameworks\n\n* .Net Framework 4.0+\n* .Net CORE 3.0+\n\n## Installation\n\n[NuGet Package](https://nuget.org/packages/WpfLocalizeExtension/)\n\n```net\ndotnet add package WPFLocalizationExtension\n```\n\n## Getting started\n\nComing soon\n\n## Documentation & Tutorial:\n[Documentation / Wiki](docs/README.md)\n\n## Localization Tools:\n[ResXManager (Visual Studio Plugin and StandAlone)](http://visualstudiogallery.msdn.microsoft.com/3b64e04c-e8de-4b97-8358-06c73a97cc68)  \n[Zeta Resource Editor (Freeware)](http://www.zeta-resource-editor.com/index.html)\n\n-----\n\n## Products that use this Solution:\n\n![](/docs/SAPLogo.gif) SAP Crystal Reports, Version for Visual Studio .NET\n\n## License:\n[MS-PL](https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE)\n"
  },
  {
    "path": "docs/BLoc-and-FELoc.md",
    "content": "# BLoc\n\nThis Extensions is a \n\n# FELoc"
  },
  {
    "path": "docs/FAQ.md",
    "content": "# FAQ\n\n## Strong Name and signing\n\nThe current nuget is public signed, this is in general a good compromise, but there are sometimes issue like:\n\n* \"Could not load file or assembly 'WPFLocalizeExtension' ... Strong name signature could not be verified\n    * xUnit can be solve with disable shadowCoping see #225\n    * in general integrate [StrongNameSigner](https://github.com/brutaldev/StrongNameSigner)\n\nThere is also a long discussion here just some issues: #225 #150 #141 #110 #106\n\n\n## Issued Design mode\n\nWe try to do our best to have the extension as best as possible working in Visual Studio Designer, but in some cases\nthis doesn't work even everything is fine. Here some points / steps that can help:\n1. restart / reopen (xaml, sln, complete Visualt Studio)\n2. remove cache (bin/obj dirs + %USERPROFILE%\\AppData\\Local\\Microsoft\\VisualStudio\\\\**[VS VERSION]**\\Designer\\ShadowCache)\n3. check .net compile proj with any cpu or 32bit see #217\n\n\n## Missing Keys\n\nIf you like to see what keys are not translated you can easily register to the following event.\n\n```csharp\nLocalizeDictionary.Instance.MissingKeyEvent += Instance_MissingKeyEvent;\n```\n\nThe issue or bad design is that this is only triggered if you use the LocExtension, BLoc and not if you make codebehind translation.\nIf you do that you should use a different Event.\n\n```csharp\nLocalizeDictionary.Instance.GetLocalizedObject(....) \n\nLocalizeDictionary.Instance.DefaultProvider.ProviderError  += ...\n```\n\n## Binding cannot be changed after it has been used\n\nBinding does not support any changes on Properties after it is bound the firts time. So if you like to do thinks like:\n\n```xaml\n{Binding Source={lex:Loc Foo}}\n{Binding StringFormat={lex:Loc Bar}}\n```\nThis will crash. For StringFormat use cases we have implemented a [StringFormatConverter](ValueConverters.md).\n\n## Access modifier for resource assemblies\nThe LocalizationExtension will fail to look up a localized value, if the resource is compiled with its access modifier set to internal.\nTo set up the resource build tool to use a public access modifier, open the resource file and change the value of the field.\n\n## NeutralResourcesLanguage in Assembly Manifest\nThe Assembly.cs contains sometimes the line _[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.MainAssembly)]_\nwhich has side effects on resource lookups.\n\nPlease remove it.\n\n## Bad ResX Filename\nAs long as you are using custom ResX files that are not located under the Properties folder\nin your project you **may not call the file Resource**.\nIt will break the lookup mechanism for the resources.\n\n## Startuptime for Available Cultures Search with Resx Provider\nTo reduce the full search through all cultures and all resx files if they are available per\nculture you can set the searchlist of the culture. _ResxLocalizationProviderBase.SearchCultures_\n\n<details><summary>Example</summary>\n<p>\n   \n```csharp\n (LocalizeDictionary.Instance.DefaultProvider as ResxLocalizationProvider).SearchCultures =\n                new List<System.Globalization.CultureInfo>()\n                {\n                    System.Globalization.CultureInfo.GetCultureInfo(\"de-de\"),\n                    System.Globalization.CultureInfo.GetCultureInfo(\"en\"),\n                    System.Globalization.CultureInfo.GetCultureInfo(\"he\"),\n                    System.Globalization.CultureInfo.GetCultureInfo(\"ar\"),\n                };\n```\n\n</p>\n</details>\n"
  },
  {
    "path": "docs/Features.md",
    "content": "# Features:\n\n* First of all: ITS FREE (and will stay free - refer to license section below)\n* Obtain stable results in\n\t* WPF applications using .NET 3.5 and higher\n\t* Windows Phone 7.x/8.x applications\n* **New:** Localization source/provider can be changed freely at arbitrary nodes\n\t* Use the Provider property in LocalizeDictionary to change the provider for the particular sub tree\n\t* Use the DefaultProvider property to set the provider for the whole application\n\t* Built-in RESX provider for resource file lookup (Default) - **fully backward compatible to older versions of this extension**\n\t* Interface for custom providers\n\t* Notification about provider changes and errors\n\t* Notification about resource changes\n\t* Get the list of all available cultures from a provider - or just take the bindable merged list from LocalizeDictionary\n\t* CSV provider project in the Tests folder as an example for custom providers\n\t* **Multiple UI thread support**\n* BLoc Extension that derives from Binding to support binding scenarios\n* Supports binding-like write style like \"Text = {lex:LocText ResAssembly:ResFile:ResKey}\"\n\t* Define a default assembly and / or resource file to reduce the key to ResAssembly::ResKey, ResFile:ResKey or even ResKey\n\t* Automatic key lookup: If no key is specified, the Name and Property Name of the target are used (e.g. MyButton_Content)\n\t* Default assembly, dictionary and culture can be changed dynamically at the RESX provider\n\t* Default assembly and dictionary inherit along the visual tree and can be redefined at each node\n* It is available at designtime (MS Expression Blend 3.0 & 4.0, MS VisualStudio 2008 & 2010 & 2012\n    * not for dynamic loaded assemblies which only can be found at runtime and as long the resource (.resx) is built at designtime\n\t* Even for Silverlight!\n\t* No extra preview application needed\n\t* Offers a DesignValue Property to support custom values during design mode\n* Full support of various application scenarios\n\t* Works with normal dependency properties\n\t* Works with normal properties (e.g. Ribbon)\n\t* Works with control/data templates\n* Various culture setup features\n\t* List of available cultures\n\t* Culture swapping by Commands (SetCultureCommand)\n\t* Works with the .resx-fallback mechanism (e.g. en-us -> en -> invariant culture)\n\t* Supports culture forcing (e.g. \"this object has to be in english all the time\")\n\t* Buffering allows fast switching of the language at runtime\n\t* Offers a design language for visual testing at designtime\n\t* Offers a \"SpecificCulture\" to use as IFormatProvider (e.g. (123.20).ToString(LocalizeDictionary.SpecificCulture) = \"123.20\" or \"123,20\")\n\t* Does not alter the culture on Thread.CurrentCulture or Thread.CurrentUICulture (can be changed easily)\n* Code behind features:\n\t* Can be used in code behind to bind localized values to dynamic generated controls\n\t* Implements INotifyPropertyChanged for advanced use\n\t* Offers some functionality to check and get resource values in code behind (e.g. ResolveLocalizedValue)\n* Easy to use\n\t* Can be used with any resource file (.resx) across all assemblies (also the dynamic loaded one at runtime)\n\t* Does not need any initializing process (like \"call xyz to register a special localize dictionary\")\n\t* Can localize any type of data type, as long a TypeConverter exists for it\n* Example extensions included for\n\t* Formating e.g. \"this is the '{0}' value\" (not bindable at the moment)\n\t* Prefix and suffix values (currently with LocText extension)\n\t* Upper and lower Text\n* Last, but not least\n\t* Does not create any memory leaks\n\t* Leaves the UID property untouched\n\t* Does not need an additional build task\n\t* Is in use in various productive systems"
  },
  {
    "path": "docs/GapText.md",
    "content": "# Gap Text\n\nUse a multibinding with the [StringFormatConverter](ValueConverters.md).\nThe first **parameter** is the StringFormat\nAll others are parameter.\n```XML\n<element.Text>\n    <MultiBinding Converter={lex:StringFormatConverter}>\n        <lex:BLoc Path=\"assembly:resource:key\" />\n         <Binding Foo />\n         <Binding Bar />\n         <Binding ... />\n    </MultiBinding>\n</element.Text>\n```\n\nintegrate [SmartFormat](https://github.com/axuno/SmartFormat/wiki) so that we have even a possibility to have real i18n with pluralization,..."
  },
  {
    "path": "docs/Installation-and-dependencies.md",
    "content": "### Installation\n\nThe library itself can be obtained by two ways: \n\n* If you just want to use it without the need of compiling it, use the NuGet package manager of your VisualStudio or download it directly from our [NuGet package](https://www.nuget.org/packages/WpfLocalizeExtension). \n* If you are interested in the project details, feel free to get your own copy of the source code from GitHub.\n\nBy using NuGet you just have to choose the projects where you want to use the extension - the rest is done automatically by NuGet as usual. \n\n### Dependencies\n\nStarting with version 1.0.3, the project depends on the project [XAML Markup Extensions](https://github.com/XAMLMarkupExtensions/XAMLMarkupExtensions). NuGet will automatically ask you to download this package along with the LocalizationExtension.\n"
  },
  {
    "path": "docs/Keys.md",
    "content": "Keys are entered either directly after the extension name or using the Key property of the LocExtension class. Both will yield the same result (here with the key named Test):\n```xaml\n<Button Content=\"{lex:Loc Test}\" />\n<Button Content=\"{lex:Loc Key=Test}\" />\n```\n### Automatic key retrieval\nIf the control already got or can get a value for its _Name_ or _x:Name_ property, the key may be neglected, provided, that a key exists that matches one of the following criteria (checked in exactly this order): \n\n* _ControlName_PropertyName_ \n* _ControlName_\n\nUsing our button example we could imagine the following scenario:\n```xaml\n<Button Name=\"MyButton\" Content=\"{lex:Loc}\" />\n```\nAs no key was provided, the extension will first try to resolve a resource key named _MyButton_Content_. If this fails, it will then look for a resource key named _MyButton_. If this fails too, no value will be provided.\n\nThe separation character (default is underscore) can be individually set up for each control using the _LocalizeDictionary.Separation_ property.\n"
  },
  {
    "path": "docs/LocProxy-&-EnumComboBox.md",
    "content": "Beginning with v2.1.3 the extension also features an Enum value localization technique. To achieve this one has to employ the new **LocProxy** class. Just pass the particular enum value to the **Source** property and check the right setting of the **PrependType** flag. If this is used, you may also specify a **Separator** that will be used between the type suffix and the value itself leading to key entries like this \"MyEnum_MyValue\" using underscore as the separator. This allows us to create unique localization keys for different enum types and their values. To get the localized value, just bind your text element to the **Result** property of the **LocProxy**:\n```xaml\n<lex:LocProxy Source=\"{Binding}\" x:Name=\"Proxy\" PrependType=\"True\" />\n<TextBlock Text=\"{Binding Result, ElementName=Proxy}\" Margin=\"2\" FontWeight=\"Normal\" />\n```\nIn general, this proxy class triggers the _ToString_ function of the object that is bound to the **Source** property. It is therefore also applicable to all other kinds of objects where you need value localization.\n\nTo enhance this feature, also an **EnumComboBox** class was introduced with v2.1.3. Just feed your enum type to the **Type** property of this class and it does the rest for you, provided, that you correctly style the entries, e.g. using the XAML code snippet from above. You may also hide particular enum values using the **BrowsableAttribute**. A complete example is included in the _AssemblyTest_ example located in the source code of the library."
  },
  {
    "path": "docs/Localization-providers.md",
    "content": "The project was restructured to separate the target identification and value conversion in the markup extension from the logic that actually provides the value by introducing the ILocalizationProvider interface. This enables us to plug in other provider services without touching the base, the LocExtension. \n\n![](Structure.png)\n\n### Changing the provider\nThe provider can be changed using the **LocalizeDictionary.Provider** attached property at any node in the XAML document. Depending on the provider, a static singleton reference (e.g. resx provider) or an instance (e.g. csv provider) must be assigned to this property.\n\nThe default provider is set to the ResxLocalizationProvider. If you need another application wide default provider, just overwrite the static backed-up attached property **LocalizeDictionary.DefaultProvider**. \n\n### Provider features\nBesides its localized look up functionality, providers can give you a list of available cultures. This observable collection can be read out or bound - whatever you need or prefer. The list is additionally observed by the LocalizeDictionary instance providing a merged bindable list of all available cultures.\n\nFurthermore, providers fire events, when critical values in the provider changed (triggering an update of the LocExtension) or when an error occured. \n\n### Implementing custom providers\nTo implement your own provider, create a class that implements the ILocalizationProvider interface. There is no restriction concerning its base class.\n```c#\npublic interface ILocalizationProvider\n{\n    /// <summary>\n    /// Get the localized object.\n    /// </summary>\n    /// <param name=\"key\">The key to the value.</param>\n    /// <param name=\"target\">The target <see cref=\"DependencyObject\"/>.</param>\n    /// <param name=\"culture\">The culture to use.</param>\n    /// <returns>The value corresponding to the key and culture.</returns>\n    object GetLocalizedObject(string key, DependencyObject target, CultureInfo culture);\n\n    /// <summary>\n    /// An observable list of available cultures.\n    /// </summary>\n    ObservableCollection<CultureInfo> AvailableCultures { get; }\n\n    /// <summary>\n    /// An event when the provider changed.\n    /// </summary>\n    event ProviderChangedEventHandler ProviderChanged;\n\n    /// <summary>\n    /// An event when an error occurred.\n    /// </summary>\n    event ProviderErrorEventHandler ProviderError;\n}\n```\nYou can then assign your own provider to the properties of LocalizeDictionary."
  },
  {
    "path": "docs/Localization.md",
    "content": "Localization is the task to adapt values such as strings, colors or the text flow direction to the specific language and culture of the user. To fulfill this task, two major prerequisites are needed: \n\n* The designer has to decide **where** to apply a localized value. This means he needs a tool to mark the spot and to refer to a certain key in the translation dictionary. Note: Not all values have to be localized (e.g. usually the width of a control is calculated from the content size in an auto-layout application). \n* The designer and/or a translation agency has to fill out a cross-table containing all the keys mentioned above and values for each culture that should be supported by the application.\n\nThis project offers the tool to easily define which value has to be localized to the developer - already in design time. It even tries to find the right key if none is given thus speeding up localized XAML coding while still providing a good code readability.\n"
  },
  {
    "path": "docs/Localize.md",
    "content": "# Localize Resources\n\nThe main Extension that will be used is `{lex:Loc}` and is a Markupextension with a wide range usage.\nFor some use cases there it is not possible to use a Markupextension in XAML like Multibindings, Trigger, ...\nthere are substitutes [BLoc and FELoc](BLoc-and-FELoc.md) that try to fullfill the job, but they don't have 100% compatibility. \n\n```xaml\n{lex:Loc Key=, ForceCulture=, Converter=, ConverterParameter=,}\n```\n\n| Parameter          | Description |\n|--------------------|-------------|\n| Key (default)      | the key for the resource for the resource lookup     |\n| ForceCulture       | enforce a different culture for this resource lookup |\n| Converter          | like Converter of Binding Class [see](https://docs.microsoft.com/de-de/dotnet/api/system.windows.data.binding.converter) |\n| ConverterParameter | like ConverterParameter of Binding Class [see](https://docs.microsoft.com/de-de/dotnet/api/system.windows.data.binding.converter) |\n\n## Key strategy\n\nTo make it for you as easy as possible and follow the \"Don’t Repeat Yourself\" (DRY) principle the Extension try find always the right key even if you just write `{lex:Loc}`\nSo you can find for example the following line in XAML:\n```xaml\n<Button x:Name=\"MyButton\" Content=\"{lex:Loc}\" ToolTip=\"{lex:Loc}\" FontSize=\"{lex:Loc}\"/>\n```\nBut how does the magic work?\n\nFor a detailed explanation please red the [Key strategy](Keys.md) \n\nIn the this example the Extension would look into the defaultassembly and then into the defaultressource and search for this 3 keys\n\n| Property      | Requested Key     | Type    |\n|---------------|-------------------|---------|\n| Content=...   | MyButton_Content  | string  |\n| ToolTip=...   | MyButton_ToolTip  | string  |\n| FontSize=...  | MyButton_FontSize | double  |\n\nIf the resource has a different type the extensions try to convert is. This is more details describe in Target types.\n\n## Target types\nThe LocExtension automatically retrieves the type of the target property and tries to find a _TypeConverter_ for this type. By additionally supplying a converter for _Bitmap_ (from resource files) to _BitmapSource_ (WPF) all normal cases should be covered. \nIf you encounter an unsupported conversion, you have different options:\n* provide a custom IValueConverter (Converter) along with a converter parameter\n* feel free to write a working converter code and make a pull request to our GIT repository.\n\nEnum types are supported in general and do not need any specific converter.\n\n## Binding support for Enum / MVVM localization\n\nIf you have an enum or a MVVM use case there you need to have the key in the data model and like to use this as a key for the required resource\nthe extensions support to add the Binding as Constructor. Because of WPF restriction it is not possible to write it attach it to the key parameter (~~Key={Binding Path=Foo}~~). You have to add it as constructor without a property.\n\n```xaml\n{lex:Loc {Binding Path=Foo}}\n```\n\nThis gives you the full flexibility because the Markupextensions is the pure Binding and this supports Converters, StringFormat, ...\n\n### Enums\n\nIf you have now the following situation.\n\n```csharp\npublic enum TestEnum\n{\n    Test1,\n    Test2\n}\n\n...\n\npublic TestEnum Foo {get; set;}\n\n... \n\nFoo = TestEnum.Test1;\n```\n\nand you bind this in the xaml with `{lex:Loc {Binding Path=Foo}}` the system will look to the key *Test1*\nin the resources. This is okay but in the most cases you like to have a key like *TestEnum.Test1*.\nRESX don't support key with dots so the common approach is to replace thge dot with an underscore to the\nkey *TestEnum_Test1*. To make this now working you have two options.\n\n1. use `{lex:Loc {Binding Path=Foo, StringFormat=TestEnum_{0}}}` with the disadvantage that you have to manually type the TypeName of the enum and that refactoring is not working. On the otherhand you are fully free to change the key.\n2. use `{lex:Loc {Binding Path=Foo, Converter={lex:PrependTypeConverter}}}` and get the automated prepending of the type to the key retreval process. This works also for any kind ot .net type, but we see at the moment only the use case for enums. For a details and the possibility to change the separation character read the details [ValueConverters](ValueConverters.md) doc.\n\n### Gap texts / complex translation with pluralisation\n\nFor translation of complex texts there some value should be in the text like this:\n\n>You have selected 10 car(s).\n\nTWe have introduces a StringFormatConverter see [ValueConverters](ValueConverters.md) with automatic using of [smartFormat](https://github.com/axuno/SmartFormat) if this is available.\nA detailed explanation how to use can be found [here](GapText.md). \n\n"
  },
  {
    "path": "docs/MarkupExtension-basics.md",
    "content": "The project is based on the MarkupExtension class of the .NET framework. All classes that derive from this class are asked by the framework to deliver a value to the target object and property.\n\nThe LocalizationExtension uses this feature in order to provide the culture-specific values to localized properties. The general syntax of markup extensions that is applied to a particular _Property_ of a certain _Element_ is as follows:\n```xaml\n<Element Property=\"{ExtensionName ...}\" />\n```\nThe _ExtensionName_ has to be replaced by the class name of the extension without its ending \"Extension\". Usually, the XAML editor will propose the possible extensions to you. After the name, several properties of the extension itself can be initialized. It is obvious that this mechanism gives us the possibility to easily mark the localized property and give necessary information to look up its resource key.\n"
  },
  {
    "path": "docs/Multiple-assemblies-and-dictionaries.md",
    "content": "In the previous sections we presumed that a default assembly and dictionary indicating the location of the resource file is set up in the XAML document root. There may be situations, where more than one assembly and/or dictionary is used for a single XAML code file. This scenario is fully supported by the LocExtension and **ResxLocalizationProvider**. \n\n### Switching assemblies and dictionaries\nYou may change the values of **ResxLocalizationProvider.DefaultAssembly** and **ResxLocalizationProvider.DefaultDictionary** on arbitrary locations throughout the VisualTree of your XAML code - where and as often you need it. The various LocExtension instances will automatically resolve the corresponding values. This implies, that you may also change both values dynamically during runtime. Refer to the test application AssemblyTest in the source code of the library. \n\n### Directly provided assembly and/or dictionary\nYou may also define the assembly or dictionary that will be used at each instance of LocExtension by using their properties _Assembly_ or _Dict_ respectively. Alternatively, you may use the constructor syntax already described for the keys. The following three buttons will have the same text:\n```xaml\n<Button Content=\"{lex:Loc MyAssembly:MyResource:Test}\" />\n// If you need different Assembly or Dic you should use the attached properties of ResxLocalizationProvider\n<Button Content=\"{lex:Loc Test}\" />\n<Button Content=\"{lex:Loc Key=Test}\" />\n```\n### Assembly name differing from the default namespace\nThis scenario is supported by the ResxLocalizationProvider. In case you have several resource files in a single assembly with the same name but in different namespaces, you have to provide a qualified name of your dictionary.\n"
  },
  {
    "path": "docs/Our-first-localized-text.md",
    "content": "With the window or control control properly prepared in the previous section, we can now create our first localized text. Create a key named Test in your resource file(s) and give some distinct values to it (e.g. \"Hello World\" for culture \"en\" and \"Hallo Welt\" for culture \"de\").\nNow, create a button with our extension set to the Content property:\n```xaml\n<Button Content=\"{lex:Loc Test}\" />\n```\nNote, that Test was our key in the resource file. That's it - you're done!\n\n### Target types\nThe LocExtension automatically retrieves the type of the target property and tries to find a _TypeConverter_ for this type. By additionally supplying a converter for _Bitmap_ (from resource files) to _BitmapSource_ (WPF) all normal cases should be covered. If you encounter an unsupported conversion, feel free to write a working converter code and make a pull request to our GIT repository. You may also provide a custom IValueConverter (Converter) along with a converter parameter in the LocExtension.\nEnum types are supported in general and do not need any specific converter.\n"
  },
  {
    "path": "docs/Preparing-the-XAML-code.md",
    "content": "You have to initialize the localization engine in order to get values at design-time and to set up default dictionaries and assemblies (refer to [Multiple assemblies and dictionaries](Multiple-assemblies-and-dictionaries.md)).\n\nFirst of all, create a _xmlns_ reference to \"http://wpflocalizeextension.codeplex.com\". The next step is to set the design time culture as well as default assembly and dictionary where the resource is located:\n```xaml\n<Window xmlns:lex=\"http://wpflocalizeextension.codeplex.com\"\n        lex:LocalizeDictionary.DesignCulture=\"en\"\n        lex:ResxLocalizationProvider.DefaultAssembly=\"AssemblyTestResourceLib\"\n        lex:ResxLocalizationProvider.DefaultDictionary=\"Strings\">\n<!-- Some controls -->\n</Window>\n```\nThe value of DesignCulture can be changed dynamically during design time and will have an immediate effect on all localized properties. This gives you the possibility to check the correct localization directly in the WPF designer. This example configures the resx provider. For a full explanation on this provider, refer to [Localization providers](Localization-providers.md).\n"
  },
  {
    "path": "docs/README.md",
    "content": "### Introduction\n* [Localization](Localization.md) \n* [MarkupExtension basics](MarkupExtension-basics.md)\n* [Supported platforms](Supported-platforms.md)\n* [**Change log**](https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/releases)\n\n### Usage\n* [Installation and dependencies](Installation-and-dependencies.md)\n* [Resource files](Resource-files.md)\n* [Preparing the XAML code](Preparing-the-XAML-code.md)\n* [Localize XAML](Localize.md)\n* [Keys](Keys.md)\n* [Multiple assemblies and dictionaries](Multiple-assemblies-and-dictionaries.md)\n* [Localization providers](Localization-providers.md)\n* DEPRECATED [LocProxy & EnumComboBox](LocProxy-&-EnumComboBox.md)\n\n### [Common mistakes & FAQ](FAQ.md)"
  },
  {
    "path": "docs/Resource-files.md",
    "content": "### General instructions\n\nAs explained in the section [Supported platforms](Supported-platform.md), the LocalizationExtension supports **resx** files for the storage of localized values. Create such a resource file with a suitable name and check its access modifier, if needed (refer to [Common mistakes - Access modifier for resource assemblies](FAQ.md#access-modifier-for-resource-assemblies)). Now, create further resource files for each culture your application will support and give them the same name as the first one - just add the general or specific culture code (e.g. \"en-US\", \"de\", \"de-AT\", ...) before the \".resx\" ending yielding: _Name.CultureCode_.resx. Don't forget the dot before the culture code.\n\nNow, populate the resource files with your key/value pairs. Be sure to have the same name of a particular key for all cultures. You may use the automatic key retrieval mechanism (refer to [Keys](Keys.md)). \n\n### Pay attention to:\n* The correct naming scheme of culture-specific resource files \n* The _Custom Tool_ property of the main resource file (ResXFileCodeGenerator), the others leave this field empty \n* The _Build_ Action property of all resource files (Embedded Resource) \n* The access modifier, if needed \n* Consistent key naming \n* **Rebuild** the project where the resource is located after adding new keys and values in order to see it in design time.\n\n### How to get a treeview of culture-specific resources\n1. Unload the project \n1. Edit the corresponding **csproj** file \n1. Locate the tags of the resources and rewrite them using the _DependentUpon_ syntax:\n```xml\n    <EmbeddedResource Include=\"Strings.de.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>Strings.resx</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Strings.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Strings.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n```"
  },
  {
    "path": "docs/Supported-platforms.md",
    "content": "The LocalizationExtension is designed for and tested under the following frameworks: \n\n* WPF with .NET 4.0+\n\nThe project comes along with the ability to plugin any custom localization provider that implements the _ILocalizationProvider_ interface. The support of resx of previous versions was transferred to such a provider that also serves as the default provider (can be changed, see [Localization providers](Localization-providers.md)). The resx files can be distributed over several assemblies in the project. As an example, another custom provider for CSV files was implemented.\n"
  },
  {
    "path": "docs/ValueConverters.md",
    "content": "# Value Converters\n\nThe library delivers some very usefull ValueConverts. All Valueconverters can be used with the standard syntax and the definition as resource, but the also implement a MarkupExtension declaration so that you can write as an example for the TranslateConverter:\n\n```xaml\n<Element Converter=\"{lex:TranslateConverter}\" />\n```\n\n## TranslateConverter\n\nThis converters allows to make the translation process as a converter. The input of the converter is the key for the lookup and the result the translated result.\n\n## PrependTypeConverter\n\nThis converter is especially for translation of enums. If you bind to an enum, only the\nthe Enum Value is used as key for the resource lookup. A commonn approach in the resx\nfile is to write like:\n    MyEnum_Value1 -> Translation for Value1\n    MyEnum_Value2 -> Translation for Value2\n\nFor a more elegant use this converter automatically prepend the Type of the parameter\nto the key.\n\n## StringFormatConverter\n\nThis converter solves the issue that Binding unfortunately don't support changing of the StringFormat after the firts usage of the Binding.\nThe StringFormatConverter expects as the first value the StringFormat and all further Values are given the StringFormat as paramter.\nIf [smartFormat](https://github.com/axuno/SmartFormat) is available it will be automatically used for the StringFormat for extended possibilities especially pluralisation.\n\n## ToLower & ToUpperConverter\n\nThis converter just make an ToLower or ToUpper to the value. If you used the deprecated LocTextUpperExtension & LocTextLowerExtension this\nthis is the Converter to have the same effect."
  },
  {
    "path": "src/Deprecated/Engine/GapTextControl.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"GapTextControl.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Peter Wendorff</author>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Deprecated.Engine\n{\n    #region Usings\n    using System;\n    using System.Collections.ObjectModel;\n    using System.IO;\n    using System.Text.RegularExpressions;\n    using System.Windows;\n    using System.Windows.Controls;\n    using System.Windows.Data;\n    using System.Windows.Documents;\n    using System.Windows.Markup;\n    using System.Xml;\n    #endregion\n\n    /// <summary>\n    /// A gap text control.\n    /// </summary>\n    [Obsolete(\"GapTextControl is deprecated and will be removed in version 4.0, see documentation\",false)]\n    [TemplatePart(Name = PART_TextBlock, Type = typeof(TextBlock))]\n    public class GapTextControl : Control\n    {\n        #region Dependency Properties\n        /// <summary>\n        /// This property is the string that may contain gaps for controls.\n        /// </summary>\n        public static readonly DependencyProperty FormatStringProperty = DependencyProperty.Register(\n            nameof(FormatString),\n            typeof(string),\n            typeof(GapTextControl),\n            new PropertyMetadata(string.Empty, OnFormatStringChanged));\n\n        /// <summary>\n        /// If this property is set to true there is no error thrown\n        /// when the FormatString contains less gaps than placeholders are available.\n        /// Missing placeholders for available elements may be a problem,\n        /// as something else may refer to the element in a binding e.g. by name,\n        /// but the element is not available in the visual tree.\n        ///\n        /// As an example consider a submit button would be missing due to a missing placeholder in the FormatString.\n        /// </summary>\n        public static readonly DependencyProperty IgnoreLessGapsProperty = DependencyProperty.Register(\n            nameof(IgnoreLessGaps),\n            typeof(bool),\n            typeof(GapTextControl),\n            new PropertyMetadata(false));\n\n        /// <summary>\n        /// If this property is true, any FormatString that refers to the same string item multiple times produces an exception.\n        /// </summary>\n        public static readonly DependencyProperty IgnoreDuplicateStringReferencesProperty = DependencyProperty.Register(\n            nameof(IgnoreDuplicateStringReferences),\n            typeof(bool),\n            typeof(GapTextControl),\n            new PropertyMetadata(true));\n\n        /// <summary>\n        /// If this property is true, any FormatString that refers to the same control item multiple times produces an exception.\n        /// </summary>\n        public static readonly DependencyProperty IgnoreDuplicateControlReferencesProperty = DependencyProperty.Register(\n            nameof(IgnoreDuplicateControlReferences),\n            typeof(bool),\n            typeof(GapTextControl),\n            new PropertyMetadata(false));\n\n        /// <summary>\n        /// property that stores the items to be inserted into the gaps.\n        /// any item that can be inserted as such into the TextBox get's inserted itself.\n        /// All other items are converted to Text using their ToString() implementation.\n        /// </summary>\n        public static readonly DependencyProperty GapsProperty = DependencyProperty.Register(\n            nameof(Gaps),\n            typeof(ObservableCollection<object>),\n            typeof(GapTextControl),\n            new PropertyMetadata(default(ObservableCollection<object>), OnGapsChanged));\n\n        private static void OnGapsChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)\n        {\n            // TODO: make sure there's an event handler on CollectionChanged!\n\n            // re-assemble children:\n            if (dependencyPropertyChangedEventArgs.OldValue != dependencyPropertyChangedEventArgs.NewValue)\n            {\n                var self = (GapTextControl)dependencyObject;\n                self.OnContentChanged();\n            }\n        }\n        #endregion\n\n        #region Constructors\n        static GapTextControl()\n        {\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(GapTextControl), new FrameworkPropertyMetadata(typeof(GapTextControl)));\n        }\n\n        /// <summary>\n        /// Creates a new instance.\n        /// </summary>\n        public GapTextControl()\n        {\n            Gaps = new ObservableCollection<object>();\n            Gaps.CollectionChanged += (sender, args) => OnContentChanged();\n        }\n        #endregion\n\n        #region Properties matching the DependencyProperties\n        /// <summary>\n        /// Gets or set the format string.\n        /// </summary>\n        public string FormatString\n        {\n            get => (string)GetValue(FormatStringProperty);\n            set => SetValue(FormatStringProperty, value);\n        }\n\n        /// <summary>\n        /// Ignore the Less Gaps\n        /// </summary>\n        public bool IgnoreLessGaps\n        {\n            get => (bool)GetValue(IgnoreLessGapsProperty);\n            set => SetValue(IgnoreLessGapsProperty, value);\n        }\n\n        /// <summary>\n        /// Ignore Duplicate String References\n        /// </summary>\n        public bool IgnoreDuplicateStringReferences\n        {\n            get => (bool)GetValue(IgnoreDuplicateStringReferencesProperty);\n            set => SetValue(IgnoreDuplicateStringReferencesProperty, value);\n        }\n\n        /// <summary>\n        /// Ignore Duplicate Control References\n        /// </summary>\n        public bool IgnoreDuplicateControlReferences\n        {\n            get => (bool)GetValue(IgnoreDuplicateControlReferencesProperty);\n            set => SetValue(IgnoreDuplicateControlReferencesProperty, value);\n        }\n\n        /// <summary>\n        /// Gets or sets the gap collection.\n        /// </summary>\n        public ObservableCollection<object> Gaps\n        {\n            get => (ObservableCollection<object>)GetValue(GapsProperty);\n            set => SetValue(GapsProperty, value);\n        }\n        #endregion\n\n        #region Constants\n        /// <summary>\n        /// Pattern to split the FormatString, see https://github.com/SeriousM/WPFLocalizationExtension/issues/78#issuecomment-163023915 for documentation ( TODO!!!)\n        /// </summary>\n        public const string RegexPattern = @\"(.*?){(\\d*)}\";\n        #endregion\n\n        #region Constants for TemplateParts\n        // ReSharper disable once InconsistentNaming\n        private const string PART_TextBlock = \"PART_TextBlock\";\n        #endregion\n\n        #region Sub-Controls\n        private TextBlock _theTextBlock = new TextBlock();\n        #endregion\n\n        #region DependencyProperty changed event handlers\n        private static void OnFormatStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\n        {\n            if (e.OldValue != e.NewValue)\n            {\n                var self = (GapTextControl)d;\n                self.OnContentChanged();\n            }\n        }\n\n        private static T DeepCopy<T>(T obj)\n            where T : DependencyObject\n        {\n            var xaml = XamlWriter.Save(obj);\n            var stringReader = new StringReader(xaml);\n            var xmlTextReader = new XmlTextReader(stringReader);\n            var result = (T)XamlReader.Load(xmlTextReader);\n\n            var enumerator = obj.GetLocalValueEnumerator();\n            while (enumerator.MoveNext())\n            {\n                var dp = enumerator.Current.Property;\n                var be = BindingOperations.GetBindingExpression(obj, dp);\n                if (be?.ParentBinding?.Path != null)\n                    BindingOperations.SetBinding(result, dp, be.ParentBinding);\n            }\n\n            return result;\n        }\n\n        private void OnContentChanged()\n        {\n            // Re-arrange the children:\n            _theTextBlock.Inlines.Clear();\n\n            if (FormatString != null)\n            {\n                var matchedUpToIndex = 0;\n\n                // 1) determine which items are to be used as string and which are to be inserted as controls:\n                // allowed according to https://msdn.microsoft.com/de-de/library/system.windows.documents.inlinecollection%28v=vs.110%29.aspx are\n                // Inline, String (creates an implicit Run), UIElement (creates an implicit InlineUIContainer with the supplied UIElement inside),\n                if (Gaps != null)\n                {\n                    var match = Regex.Match(FormatString, RegexPattern);\n\n                    while (match.Success)\n                    {\n                        // Handle match here...\n                        var wholeMatch = match.Groups[0].Value; // contains string and simple placeholder at the end.\n                        var formatStringPartial = match.Groups[1].Value;\n                        // has still to be formatted TODO or even better bound accordingly by lex:loc binding\n                        var itemIndex = int.Parse(match.Groups[2].Value);\n                        // it's secure to parse an int here as this follows from the regex.\n\n                        matchedUpToIndex += wholeMatch.Length;\n\n                        // get next match:\n                        match = match.NextMatch();\n\n                        // add the inlines:\n                        // 1) the prefix that is formatted with the whole gaps parameters:\n                        _theTextBlock.Inlines.Add(string.Format(formatStringPartial, Gaps));\n\n                        // Check availability of a classified gap.\n                        if (Gaps.Count <= itemIndex)\n                            continue;\n                        var gap = Gaps[itemIndex];\n\n                        // 2) the item encoded in the placeholder:\n                        try\n                        {\n                            if (gap is UIElement element)\n                            {\n                                var item = DeepCopy(element);\n                                _theTextBlock.Inlines.Add(item);\n                            }\n                            else if (gap is Inline)\n                            {\n                                var item = DeepCopy((Inline)gap);\n                                _theTextBlock.Inlines.Add(item);\n                            }\n                            else if (gap != null)\n                                _theTextBlock.Inlines.Add(gap.ToString());\n                        }\n                        catch (Exception)\n                        {\n                            // break for now\n                        }\n                    }\n                }\n\n                // add the remaining part:\n                _theTextBlock.Inlines.Add(string.Format(FormatString.Substring(matchedUpToIndex), Gaps));\n\n                InvalidateVisual();\n            }\n            else\n            {\n                throw new Exception(\"FormatString is not a string!\");\n            }\n        }\n        #endregion\n\n        #region Template stuff\n        /// <summary>\n        /// Will be called prior to display of the control.\n        /// </summary>\n        public override void OnApplyTemplate()\n        {\n            base.OnApplyTemplate();\n            AttachToVisualTree();\n        }\n\n        private void AttachToVisualTree()\n        {\n            if (Template != null)\n            {\n                var textBlock = Template.FindName(PART_TextBlock, this) as TextBlock;\n                if (textBlock != _theTextBlock)\n                {\n                    _theTextBlock = textBlock;\n                    OnContentChanged();\n                }\n            }\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "src/Deprecated/Engine/LocBinding.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"LocBinding.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Deprecated.Engine\n{\n    #region Usings\n    using System;\n    using System.Windows;\n    using System.Windows.Data;\n    using WPFLocalizeExtension.Extensions;\n    #endregion\n\n    /// <summary>\n    /// A binding proxy class that accepts bindings and forwards them to the LocExtension.\n    /// Based on: http://www.codeproject.com/Articles/71348/Binding-on-a-Property-which-is-not-a-DependencyPro\n    /// </summary>\n    [Obsolete(\"LocBinding is deprecated and will be removed in version 4.0, because lex:Loc supports now direct Binding, see documentation\", false)]\n    public class LocBinding : FrameworkElement\n    {\n        #region Source DP\n        /// <summary>\n        /// We don't know what will be the Source/target type so we keep 'object'.\n        /// </summary>\n        public static readonly DependencyProperty SourceProperty =\n            DependencyProperty.Register(\"Source\", typeof(object), typeof(LocBinding),\n            new FrameworkPropertyMetadata(OnPropertyChanged)\n            {\n                BindsTwoWayByDefault = true,\n                DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,\n            });\n\n        /// <summary>\n        /// The source.\n        /// </summary>\n        public object Source\n        {\n            get => GetValue(SourceProperty);\n            set => SetValue(SourceProperty, value);\n        }\n        #endregion\n\n        #region Target LocExtension\n        private LocExtension _target;\n        /// <summary>\n        /// The target extension.\n        /// </summary>\n        public LocExtension Target\n        {\n            get => _target;\n            set\n            {\n                _target = value;\n                if (_target != null && Source != null)\n                    _target.Key = Source.ToString();\n            }\n        }\n        #endregion\n\n        #region OnPropertyChanged\n        private static void OnPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            if (obj is LocBinding locBinding && args.Property == SourceProperty)\n            {\n                if (!ReferenceEquals(locBinding.Source, locBinding._target) && locBinding._target != null && locBinding.Source != null)\n                    locBinding._target.Key = locBinding.Source.ToString();\n            }\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Deprecated/Engine/LocProxy.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"LocBinding.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Deprecated.Engine\n{\n    #region Usings\n    using System;\n    using System.ComponentModel;\n    using System.Windows;\n    using WPFLocalizeExtension.Extensions;\n    #endregion\n\n    /// <summary>\n    /// A proxy class to localize object strings.\n    /// </summary>\n    [Obsolete(\"LocProxy is deprecated and will be removed in version 4.0, because lex:Loc supports now direct Binding, see documentation\", false)]\n    public class LocProxy : FrameworkElement\n    {\n        /// <summary>\n        /// Our own <see cref=\"LocExtension\"/> instance.\n        /// </summary>\n        private LocExtension _ext;\n\n        #region Source property\n        /// <summary>\n        /// The source.\n        /// </summary>\n        public static DependencyProperty SourceProperty = DependencyProperty.Register(\"Source\", typeof(object), typeof(LocProxy), new PropertyMetadata(PropertiesChanged));\n\n        /// <summary>\n        /// The backing property for <see cref=\"LocProxy.SourceProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public object Source\n        {\n            get => GetValue(SourceProperty);\n            set => SetValue(SourceProperty, value);\n        }\n        #endregion\n\n        #region PrependType property\n        /// <summary>\n        /// This flag determines, if the type should be added using the given separator.\n        /// </summary>\n        public static DependencyProperty PrependTypeProperty = DependencyProperty.Register(\"PrependType\", typeof(bool), typeof(LocProxy), new PropertyMetadata(false, PropertiesChanged));\n\n        /// <summary>\n        /// The backing property for <see cref=\"PrependTypeProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public bool PrependType\n        {\n            get => (bool)GetValue(PrependTypeProperty);\n            set => SetValue(PrependTypeProperty, value);\n        }\n        #endregion\n\n        #region Separator property\n        /// <summary>\n        /// The Separator.\n        /// </summary>\n        public static DependencyProperty SeparatorProperty = DependencyProperty.Register(\"Separator\", typeof(string), typeof(LocProxy), new PropertyMetadata(\"_\", PropertiesChanged));\n\n        /// <summary>\n        /// The backing property for <see cref=\"SeparatorProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public string Separator\n        {\n            get => (string)GetValue(SeparatorProperty);\n            set => SetValue(SeparatorProperty, value);\n        }\n        #endregion\n\n        #region Prefix property\n        /// <summary>\n        /// The Prefix.\n        /// </summary>\n        public static DependencyProperty PrefixProperty = DependencyProperty.Register(\"Prefix\", typeof(string), typeof(LocProxy), new PropertyMetadata(null, PropertiesChanged));\n\n        /// <summary>\n        /// The backing property for <see cref=\"PrefixProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public string Prefix\n        {\n            get => (string)GetValue(PrefixProperty);\n            set => SetValue(PrefixProperty, value);\n        }\n        #endregion\n\n        #region Readonly result property\n        /// <summary>\n        /// The result.\n        /// </summary>\n        public static DependencyPropertyKey ResultProperty = DependencyProperty.RegisterReadOnly(\"Result\", typeof(string), typeof(LocProxy), new PropertyMetadata(\"\"));\n\n        /// <summary>\n        /// The backing property for <see cref=\"ResultProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public string Result\n        {\n            get => (string)GetValue(ResultProperty.DependencyProperty) ?? this.Source.ToString();\n            set => SetValue(ResultProperty, value);\n        }\n        #endregion\n\n        /// <summary>\n        /// A notification handler for the <see cref=\"SourceProperty\"/>.\n        /// </summary>\n        /// <param name=\"d\">The object.</param>\n        /// <param name=\"e\">The event arguments.</param>\n        private static void PropertiesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\n        {\n            if (d is LocProxy proxy)\n            {\n                var source = proxy.Source;\n                if (source != null)\n                {\n                    var key = source.ToString();\n\n                    if (proxy.PrependType)\n                        key = source.GetType().Name + proxy.Separator + key;\n\n                    if (!string.IsNullOrEmpty(proxy.Prefix))\n                        key = proxy.Prefix + proxy.Separator + key;\n\n                    if (proxy._ext == null)\n                    {\n                        proxy._ext = new LocExtension { Key = key };\n                        proxy._ext.SetBinding(proxy, proxy.GetType().GetProperty(\"Result\"));\n                    }\n                    else\n                        proxy._ext.Key = key;\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/Deprecated/Extensions/Compatibility.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"Compatibility.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Bernhard Millauer</author>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Deprecated.Extensions\n{\n    #region Usings\n    using System;\n    using System.Windows.Markup;\n    using WPFLocalizeExtension.Engine;\n    using WPFLocalizeExtension.Extensions;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <inheritdoc/>\n    [Obsolete(\"LocBrushExtension is deprecated and will be removed in version 4.0, please use lex:Loc instead and see documentation\", false)]\n    [MarkupExtensionReturnType(typeof(System.Windows.Media.Brush))]\n    public class LocBrushExtension : LocExtension\n    {\n        /// <inheritdoc/>\n        public LocBrushExtension()\n        { }\n\n        /// <inheritdoc/>\n        public LocBrushExtension(string key) : base(key) { }\n    }\n\n    /// <inheritdoc/>\n    [Obsolete(\"LocDoubleExtension is deprecated and will be removed in version 4.0, please use lex:Loc instead and see documentation\", false)]\n    [MarkupExtensionReturnType(typeof(double))]\n    public class LocDoubleExtension : LocExtension\n    {\n        /// <inheritdoc/>\n        public LocDoubleExtension()\n        { }\n\n        /// <inheritdoc/>\n        public LocDoubleExtension(string key) : base(key) { }\n    }\n\n    /// <inheritdoc/>\n    [MarkupExtensionReturnType(typeof(System.Windows.FlowDirection))]\n    [Obsolete(\"LocFlowDirectionExtension is deprecated and will be removed in version 4.0, please use lex:Loc instead and see documentation\", false)]\n    public class LocFlowDirectionExtension : LocExtension\n    {\n        /// <inheritdoc/>\n        public LocFlowDirectionExtension()\n        { }\n\n        /// <inheritdoc/>\n        public LocFlowDirectionExtension(string key) : base(key) { }\n    }\n\n    /// <inheritdoc/>\n    [MarkupExtensionReturnType(typeof(System.Windows.Media.Imaging.BitmapSource))]\n    [Obsolete(\"LocImageExtension is deprecated and will be removed in version 4.0, please use lex:Loc instead and see documentation\", false)]\n    public class LocImageExtension : LocExtension\n    {\n        /// <inheritdoc/>\n        public LocImageExtension()\n        { }\n\n        /// <inheritdoc/>\n        public LocImageExtension(string key) : base(key) { }\n    }\n\n    /// <inheritdoc/>\n    [MarkupExtensionReturnType(typeof(string))]\n    [Obsolete(\"LocTextExtension is deprecated and will be removed in version 4.0, please use lex:Loc instead and see documentation\", false)]\n    public class LocTextExtension : LocExtension\n    {\n        #region Constructors\n        /// <inheritdoc/>\n        public LocTextExtension()\n        { }\n\n        /// <inheritdoc/>\n        public LocTextExtension(string key) : base(key) { }\n        #endregion\n\n        #region Enum Definition\n        /// <summary>\n        /// This enumeration is used to determine the type\n        /// of the return value of <see cref=\"GetAppendText\"/>\n        /// </summary>\n        protected enum TextAppendType\n        {\n            /// <summary>\n            /// The return value is used as prefix\n            /// </summary>\n            Prefix,\n\n            /// <summary>\n            /// The return value is used as suffix\n            /// </summary>\n            Suffix\n        }\n        #endregion\n\n        #region Variables\n        /// <summary>\n        /// Holds the local prefix value\n        /// </summary>\n        private string _prefix;\n\n        /// <summary>\n        /// Holds the local suffix value\n        /// </summary>\n        private string _suffix;\n\n        /// <summary>\n        /// Holds the local format segment array\n        /// </summary>\n        private readonly string[] _formatSegments = new string[5];\n        #endregion\n\n        #region Properties\n        /// <summary>\n        /// Gets or sets a prefix for the localized text\n        /// </summary>\n        public string Prefix\n        {\n            get => _prefix;\n            set => _prefix = value;\n        }\n\n        /// <summary>\n        /// Gets or sets a suffix for the localized text\n        /// </summary>\n        public string Suffix\n        {\n            get => _suffix;\n            set => _suffix = value;\n        }\n\n        /// <summary>\n        /// Gets or sets the format segment 1.\n        /// This will be used to replace format place holders from the localized text.\n        /// <see cref=\"LocTextLowerExtension\"/> and <see cref=\"LocTextUpperExtension\"/> will format this segment.\n        /// </summary>\n        /// <value>The format segment 1.</value>\n        public string FormatSegment1\n        {\n            get => _formatSegments[0];\n            set => _formatSegments[0] = value;\n        }\n\n        /// <summary>\n        /// Gets or sets the format segment 2.\n        /// This will be used to replace format place holders from the localized text.\n        /// <see cref=\"LocTextUpperExtension\"/> and <see cref=\"LocTextLowerExtension\"/> will format this segment.\n        /// </summary>\n        /// <value>The format segment 2.</value>\n        public string FormatSegment2\n        {\n            get => _formatSegments[1];\n            set => _formatSegments[1] = value;\n        }\n\n        /// <summary>\n        /// Gets or sets the format segment 3.\n        /// This will be used to replace format place holders from the localized text.\n        /// <see cref=\"LocTextUpperExtension\"/> and <see cref=\"LocTextLowerExtension\"/> will format this segment.\n        /// </summary>\n        /// <value>The format segment 3.</value>\n        public string FormatSegment3\n        {\n            get => _formatSegments[2];\n            set => _formatSegments[2] = value;\n        }\n\n        /// <summary>\n        /// Gets or sets the format segment 4.\n        /// This will be used to replace format place holders from the localized text.\n        /// <see cref=\"LocTextUpperExtension\"/> and <see cref=\"LocTextLowerExtension\"/> will format this segment.\n        /// </summary>\n        /// <value>The format segment 4.</value>\n        public string FormatSegment4\n        {\n            get => _formatSegments[3];\n            set => _formatSegments[3] = value;\n        }\n\n        /// <summary>\n        /// Gets or sets the format segment 5.\n        /// This will be used to replace format place holders from the localized text.\n        /// <see cref=\"LocTextUpperExtension\"/> and <see cref=\"LocTextLowerExtension\"/> will format this segment.\n        /// </summary>\n        /// <value>The format segment 5.</value>\n        public string FormatSegment5\n        {\n            get => _formatSegments[4];\n            set => _formatSegments[4] = value;\n        }\n        #endregion\n\n        #region Text Formatting\n        /// <summary>\n        /// Returns the prefix or suffix text, depending on the supplied <see cref=\"TextAppendType\"/>.\n        /// If the prefix or suffix is null, it will be returned a string.empty.\n        /// </summary>\n        /// <param name=\"at\">The <see cref=\"TextAppendType\"/> defines the format of the return value</param>\n        /// <returns>Returns the formated prefix or suffix</returns>\n        private string GetAppendText(TextAppendType at)\n        {\n            // define a return value\n            var retVal = string.Empty;\n\n            // check if it should be a prefix, the format will be [PREFIX],\n            // or check if it should be a suffix, the format will be [SUFFIX]\n            if (at == TextAppendType.Prefix && !string.IsNullOrEmpty(_prefix))\n            {\n                retVal = _prefix ?? string.Empty;\n            }\n            else if (at == TextAppendType.Suffix && !string.IsNullOrEmpty(_suffix))\n            {\n                retVal = _suffix ?? string.Empty;\n            }\n\n            // return the formated prefix or suffix\n            return retVal;\n        }\n\n        /// <summary>\n        /// This method formats the localized text.\n        /// If the passed target text is null, string.empty will be returned.\n        /// </summary>\n        /// <param name=\"target\">The text to format.</param>\n        /// <returns>Returns the formated text or string.empty, if the target text was null.</returns>\n        protected virtual string FormatText(string target)\n        {\n            return target ?? string.Empty;\n        }\n\n        /// <inheritdoc/>\n        public override object FormatOutput(TargetInfo endPoint, TargetInfo info)\n        {\n            var textMain = base.FormatOutput(endPoint, info) as string ?? string.Empty;\n\n            try\n            {\n                // add some format segments, in case that the main text contains format place holders like {0}\n                textMain = string.Format(\n                    LocalizeDictionary.Instance.SpecificCulture,\n                    textMain,\n                    _formatSegments[0] ?? string.Empty,\n                    _formatSegments[1] ?? string.Empty,\n                    _formatSegments[2] ?? string.Empty,\n                    _formatSegments[3] ?? string.Empty,\n                    _formatSegments[4] ?? string.Empty);\n            }\n            catch (FormatException)\n            {\n                // if a format exception was thrown, change the text to an error string\n                textMain = \"TextFormatError: Max 5 Format PlaceHolders! {0} to {4}\";\n            }\n\n            // get the prefix\n            var textPrefix = GetAppendText(TextAppendType.Prefix);\n\n            // get the suffix\n            var textSuffix = GetAppendText(TextAppendType.Suffix);\n\n            // format the text with prefix and suffix to [PREFIX]LocalizedText[SUFFIX]\n            textMain = FormatText(textPrefix + textMain + textSuffix);\n\n            return textMain;\n        }\n        #endregion\n    }\n\n    /// <inheritdoc/>\n    [MarkupExtensionReturnType(typeof(string))]\n    [Obsolete(\"LocTextLowerExtension is deprecated and will be removed in version 4.0, please use lex:Loc instead and see documentation\", false)]\n    public class LocTextLowerExtension : LocTextExtension\n    {\n        #region Constructors\n        /// <inheritdoc/>\n        public LocTextLowerExtension()\n        { }\n\n        /// <inheritdoc/>\n        public LocTextLowerExtension(string key) : base(key) { }\n        #endregion\n\n        #region Text Formatting\n        /// <inheritdoc/>\n        protected override string FormatText(string target)\n        {\n            return target?.ToLower(GetForcedCultureOrDefault()) ?? string.Empty;\n        }\n        #endregion\n    }\n\n    /// <inheritdoc/>\n    [MarkupExtensionReturnType(typeof(string))]\n    [Obsolete(\"LocTextUpperExtension is deprecated and will be removed in version 4.0, please use lex:Loc instead and see documentation\", false)]\n    public class LocTextUpperExtension : LocTextExtension\n    {\n        #region Constructors\n        /// <inheritdoc/>\n        public LocTextUpperExtension()\n        { }\n\n        /// <inheritdoc/>\n        public LocTextUpperExtension(string key) : base(key) { }\n        #endregion\n\n        #region Text Formatting\n        /// <inheritdoc/>\n        protected override string FormatText(string target)\n        {\n            return target?.ToUpper(GetForcedCultureOrDefault()) ?? string.Empty;\n        }\n        #endregion\n    }\n\n    /// <inheritdoc/>\n    [MarkupExtensionReturnType(typeof(System.Windows.Thickness))]\n    [Obsolete(\"LocThicknessExtension is deprecated and will be removed in version 4.0, please use lex:Loc instead and see documentation\", false)]\n    public class LocThicknessExtension : LocExtension\n    {\n        /// <inheritdoc/>\n        public LocThicknessExtension()\n        { }\n\n        /// <inheritdoc/>\n        public LocThicknessExtension(string key) : base(key) { }\n    }\n}\n"
  },
  {
    "path": "src/Deprecated/Providers/CSVEmbeddedLocalizationProvider.cs",
    "content": "#region Copyright information\n// <copyright file=\"CSVEmbeddedLocalizationProvider.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Sébastien Sevrin</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Deprecated.Providers\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Collections.ObjectModel;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Reflection;\n    using System.Resources;\n    using System.Text;\n    using System.Windows;\n    using WPFLocalizeExtension.Engine;\n    using WPFLocalizeExtension.Providers;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <summary>\n    /// A singleton CSV provider that uses attached properties and the Parent property to iterate through the visual tree.\n    /// </summary>\n    [Obsolete(\"CSVEmbeddedLocalizationProvider is deprecated and will be removed in version 4.0, see documentation\", false)]\n    public class CSVEmbeddedLocalizationProvider : CSVLocalizationProviderBase\n    {\n        #region Dependency Properties\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> DefaultDictionary to set the fallback resource dictionary.\n        /// </summary>\n        public static readonly DependencyProperty DefaultDictionaryProperty =\n                DependencyProperty.RegisterAttached(\n                \"DefaultDictionary\",\n                typeof(string),\n                typeof(CSVEmbeddedLocalizationProvider),\n                new PropertyMetadata(null, AttachedPropertyChanged));\n\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> DefaultAssembly to set the fallback assembly.\n        /// </summary>\n        public static readonly DependencyProperty DefaultAssemblyProperty =\n            DependencyProperty.RegisterAttached(\n                \"DefaultAssembly\",\n                typeof(string),\n                typeof(CSVEmbeddedLocalizationProvider),\n                new PropertyMetadata(null, AttachedPropertyChanged));\n        #endregion\n\n        #region Dependency Property Callback\n        /// <summary>\n        /// Indicates, that one of the attached properties changed.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        private static void AttachedPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            Instance.OnProviderChanged(obj);\n        }\n        #endregion\n\n        #region Dependency Property Management\n        #region Get\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> default dictionary.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the default dictionary from.</param>\n        /// <returns>The default dictionary.</returns>\n        public static string GetDefaultDictionary(DependencyObject obj)\n        {\n            return obj.GetValueSync<string>(DefaultDictionaryProperty);\n        }\n\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> default assembly.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the default assembly from.</param>\n        /// <returns>The default assembly.</returns>\n        public static string GetDefaultAssembly(DependencyObject obj)\n        {\n            return obj.GetValueSync<string>(DefaultAssemblyProperty);\n        }\n        #endregion\n\n        #region Set\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> default dictionary.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the default dictionary to.</param>\n        /// <param name=\"value\">The dictionary.</param>\n        public static void SetDefaultDictionary(DependencyObject obj, string value)\n        {\n            obj.SetValueSync(DefaultDictionaryProperty, value);\n        }\n\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> default assembly.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the default assembly to.</param>\n        /// <param name=\"value\">The assembly.</param>\n        public static void SetDefaultAssembly(DependencyObject obj, string value)\n        {\n            obj.SetValueSync(DefaultAssemblyProperty, value);\n        }\n        #endregion\n        #endregion\n\n        #region Variables\n        /// <summary>\n        /// A dictionary for notification classes for changes of the individual target Parent changes.\n        /// </summary>\n        private readonly ParentNotifiers _parentNotifiers = new ParentNotifiers();\n        #endregion\n\n        #region Singleton Variables, Properties & Constructor\n        /// <summary>\n        /// The instance of the singleton.\n        /// </summary>\n        private static CSVEmbeddedLocalizationProvider _instance;\n\n        /// <summary>\n        /// Lock object for the creation of the singleton instance.\n        /// </summary>\n        private static readonly object InstanceLock = new object();\n\n        /// <summary>\n        /// Gets the <see cref=\"CSVEmbeddedLocalizationProvider\"/> singleton.\n        /// </summary>\n        public static CSVEmbeddedLocalizationProvider Instance\n        {\n            get\n            {\n                if (_instance == null)\n                {\n                    lock (InstanceLock)\n                    {\n                        if (_instance == null)\n                            _instance = new CSVEmbeddedLocalizationProvider();\n                    }\n                }\n\n                // return the existing/new instance\n                return _instance;\n            }\n        }\n\n        /// <summary>\n        /// The singleton constructor.\n        /// </summary>\n        private CSVEmbeddedLocalizationProvider()\n        {\n            ResourceManagerList = new Dictionary<string, ResourceManager>();\n            AvailableCultures = new ObservableCollection<CultureInfo> { CultureInfo.InvariantCulture };\n        }\n\n        private bool _hasHeader;\n        /// <summary>\n        /// A flag indicating, if it has a header row.\n        /// </summary>\n        public bool HasHeader\n        {\n            get => _hasHeader;\n            set => _hasHeader = value;\n        }\n        #endregion\n\n        #region Abstract assembly & dictionary lookup\n        /// <summary>\n        /// An action that will be called when a parent of one of the observed target objects changed.\n        /// </summary>\n        /// <param name=\"obj\">The target <see cref=\"DependencyObject\"/>.</param>\n        private void ParentChangedAction(DependencyObject obj)\n        {\n            OnProviderChanged(obj);\n        }\n\n        /// <summary>\n        /// Get the assembly from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The assembly name, if available.</returns>\n        protected override string GetAssembly(DependencyObject target)\n        {\n            return target?.GetValueOrRegisterParentNotifier<string>(DefaultAssemblyProperty, ParentChangedAction, _parentNotifiers);\n        }\n\n        /// <summary>\n        /// Get the dictionary from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The dictionary name, if available.</returns>\n        protected override string GetDictionary(DependencyObject target)\n        {\n            return target?.GetValueOrRegisterParentNotifier<string>(DefaultDictionaryProperty, ParentChangedAction, _parentNotifiers);\n        }\n\n        /// <summary>\n        /// Get the localized object.\n        /// </summary>\n        /// <param name=\"key\">The key to the value.</param>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"culture\">The culture to use.</param>\n        /// <returns>The value corresponding to the source/dictionary/key path for the given culture (otherwise NULL).</returns>\n        public override object GetLocalizedObject(string key, DependencyObject target, CultureInfo culture)\n        {\n            string ret = null;\n\n            var filename = \"\";\n\n            // Call this function to provide backward compatibility.\n            ParseKey(key, out var assembly, out var dictionary, out key);\n\n            // Now try to read out the default assembly and/or dictionary.\n            if (string.IsNullOrEmpty(assembly))\n                assembly = GetAssembly(target);\n\n            if (string.IsNullOrEmpty(dictionary))\n                dictionary = GetDictionary(target);\n\n            var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();\n            foreach (var assemblyInAppDomain in loadedAssemblies)\n            {\n                // get the assembly name object\n                var assemblyName = new AssemblyName(assemblyInAppDomain.FullName);\n\n                // check if the name of the assembly is the seached one\n                if (assemblyName.Name == assembly)\n                {\n                    //filename = assemblyInAppDomain.GetManifestResourceNames().Where(r => r.Contains(dictionary)).FirstOrDefault();\n                    filename = assemblyInAppDomain.GetManifestResourceNames().FirstOrDefault(r => r.Contains($\"{dictionary}{(string.IsNullOrEmpty(culture.Name) ? \"\" : \"-\")}{culture.Name}\"));\n                    if (filename != null)\n                    {\n                        using (var reader = new StreamReader(assemblyInAppDomain.GetManifestResourceStream(filename) ?? throw new InvalidOperationException(), Encoding.Default))\n                        {\n                            if (HasHeader && !reader.EndOfStream)\n                                reader.ReadLine();\n\n                            // Read each line and split it.\n                            while (!reader.EndOfStream)\n                            {\n                                var line = reader.ReadLine();\n                                if (line != null)\n                                {\n                                    var parts = line.Split(\";\".ToCharArray());\n\n                                    if (parts.Length < 2)\n                                        continue;\n\n                                    // Check the key (1st column).\n                                    if (parts[0] != key)\n                                        continue;\n\n                                    // Get the value (2nd column).\n                                    ret = parts[1];\n                                }\n                                break;\n                            }\n                        }\n                    }\n                }\n            }\n\n            // Nothing found -> Raise the error message.\n            if (ret == null)\n                OnProviderError(target, key, \"The key does not exist in \" + filename + \".\");\n\n            return ret;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Deprecated/Providers/CSVLocalizationProvider.cs",
    "content": "#region Copyright information\n// <copyright file=\"CSVLocalizationProvider.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Sébastien Sevrin</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Deprecated.Providers\n{\n    #region Usings\n    using System;\n    using System.Collections.ObjectModel;\n    using System.Globalization;\n    using System.IO;\n    using System.Text;\n    using System.Windows;\n    using WPFLocalizeExtension.Engine;\n    using WPFLocalizeExtension.Providers;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <summary>\n    /// A singleton CSV provider that uses attached properties and the Parent property to iterate through the visual tree.\n    /// </summary>\n    [Obsolete(\"CSVLocalizationProvider is deprecated and will be removed in version 4.0, see documentation\", false)]\n    public class CSVLocalizationProvider : CSVLocalizationProviderBase\n    {\n        #region Dependency Properties\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> DefaultDictionary to set the fallback resource dictionary.\n        /// </summary>\n        public static readonly DependencyProperty DefaultDictionaryProperty =\n                DependencyProperty.RegisterAttached(\n                \"DefaultDictionary\",\n                typeof(string),\n                typeof(CSVLocalizationProvider),\n                new PropertyMetadata(null, AttachedPropertyChanged));\n        #endregion\n\n        #region Dependency Property Callback\n        /// <summary>\n        /// Indicates, that one of the attached properties changed.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        private static void AttachedPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            Instance.OnProviderChanged(obj);\n        }\n        #endregion\n\n        #region Dependency Property Management\n        #region Get\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> default dictionary.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the default dictionary from.</param>\n        /// <returns>The default dictionary.</returns>\n        public static string GetDefaultDictionary(DependencyObject obj)\n        {\n            return obj.GetValueSync<string>(DefaultDictionaryProperty);\n        }\n        #endregion\n\n        #region Set\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> default dictionary.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the default dictionary to.</param>\n        /// <param name=\"value\">The dictionary.</param>\n        public static void SetDefaultDictionary(DependencyObject obj, string value)\n        {\n            obj.SetValueSync(DefaultDictionaryProperty, value);\n        }\n        #endregion\n        #endregion\n\n        #region Variables\n        /// <summary>\n        /// A dictionary for notification classes for changes of the individual target Parent changes.\n        /// </summary>\n        private readonly ParentNotifiers _parentNotifiers = new ParentNotifiers();\n        #endregion\n\n        #region Singleton Variables, Properties & Constructor\n        /// <summary>\n        /// The instance of the singleton.\n        /// </summary>\n        private static CSVLocalizationProvider _instance;\n\n        /// <summary>\n        /// Lock object for the creation of the singleton instance.\n        /// </summary>\n        private static readonly object InstanceLock = new object();\n\n        /// <summary>\n        /// Gets the <see cref=\"CSVLocalizationProvider\"/> singleton.\n        /// </summary>\n        public static CSVLocalizationProvider Instance\n        {\n            get\n            {\n                if (_instance == null)\n                {\n                    lock (InstanceLock)\n                    {\n                        if (_instance == null)\n                            _instance = new CSVLocalizationProvider();\n                    }\n                }\n\n                // return the existing/new instance\n                return _instance;\n            }\n        }\n\n        /// <summary>\n        /// The singleton constructor.\n        /// </summary>\n        private CSVLocalizationProvider()\n        {\n            AvailableCultures = new ObservableCollection<CultureInfo> { CultureInfo.InvariantCulture };\n        }\n\n        private bool _hasHeader;\n        /// <summary>\n        /// A flag indicating, if it has a header row.\n        /// </summary>\n        public bool HasHeader\n        {\n            get => _hasHeader;\n            set => _hasHeader = value;\n        }\n        #endregion\n\n        #region Abstract dictionary lookup\n        /// <summary>\n        /// An action that will be called when a parent of one of the observed target objects changed.\n        /// </summary>\n        /// <param name=\"obj\">The target <see cref=\"DependencyObject\"/>.</param>\n        private void ParentChangedAction(DependencyObject obj)\n        {\n            OnProviderChanged(obj);\n        }\n\n        /// <summary>\n        /// Get the dictionary from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The dictionary name, if available.</returns>\n        protected override string GetDictionary(DependencyObject target)\n        {\n            return target?.GetValueOrRegisterParentNotifier<string>(DefaultDictionaryProperty, ParentChangedAction, _parentNotifiers);\n        }\n\n        /// <summary>\n        /// Get the assembly from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The assembly name, if available.</returns>\n        protected override string GetAssembly(DependencyObject target)\n        {\n            return target?.GetValueOrRegisterParentNotifier<string>(CSVEmbeddedLocalizationProvider.DefaultAssemblyProperty, ParentChangedAction, _parentNotifiers);\n        }\n\n        /// <summary>\n        /// Get the localized object.\n        /// </summary>\n        /// <param name=\"key\">The key to the value.</param>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"culture\">The culture to use.</param>\n        /// <returns>The value corresponding to the source/dictionary/key path for the given culture (otherwise NULL).</returns>\n        public override object GetLocalizedObject(string key, DependencyObject target, CultureInfo culture)\n        {\n            string ret = null;\n            const string filename = \"\";\n\n            // Call this function to provide backward compatibility.\n            ParseKey(key, out _, out var dictionary, out key);\n\n            // Now try to read out the default assembly and/or dictionary.\n            if (string.IsNullOrEmpty(dictionary))\n                dictionary = GetDictionary(target);\n\n            // Try to get the culture specific file.\n            const string csvDirectory = \"Localization\";\n            var csvPath = \"\";\n\n            while (culture != CultureInfo.InvariantCulture)\n            {\n                csvPath = Path.Combine(csvDirectory, dictionary + (string.IsNullOrEmpty(culture.Name) ? \"\" : \".\" + culture.Name) + \".csv\");\n\n                if (File.Exists(csvPath))\n                    break;\n\n                culture = culture.Parent;\n            }\n\n            if (!File.Exists(csvPath))\n            {\n                // Take the invariant culture.\n                csvPath = Path.Combine(csvDirectory, dictionary + \".csv\");\n\n                if (!File.Exists(csvPath))\n                {\n                    OnProviderError(target, key, \"A file for the provided culture \" + culture.EnglishName + \" does not exist at \" + csvPath + \".\");\n                    return null;\n                }\n            }\n\n            // Open the file.\n            using (var reader = new StreamReader(csvPath, Encoding.Default))\n            {\n                // Skip the header if needed.\n                if (HasHeader && !reader.EndOfStream)\n                    reader.ReadLine();\n\n                // Read each line and split it.\n                while (!reader.EndOfStream)\n                {\n                    var line = reader.ReadLine();\n                    if (line != null)\n                    {\n                        var parts = line.Split(\";\".ToCharArray());\n\n                        if (parts.Length < 2)\n                            continue;\n\n                        // Check the key (1st column).\n                        if (parts[0] != key)\n                            continue;\n\n                        // Get the value (2nd column).\n                        ret = parts[1];\n                    }\n                    break;\n                }\n            }\n\n            // Nothing found -> Raise the error message.\n            if (ret == null)\n                OnProviderError(target, key, \"The key does not exist in \" + filename + \".\");\n\n            return ret;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Deprecated/Providers/CSVLocalizationProviderBase.cs",
    "content": "#region Copyright information\n// <copyright file=\"CSVLocalizationProviderBase.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Sébastien Sevrin</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Deprecated.Providers\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Collections.ObjectModel;\n    using System.Globalization;\n    using System.Reflection;\n    using System.Resources;\n    using System.Windows;\n    using WPFLocalizeExtension.Providers;\n    #endregion\n\n    /// <summary>\n    /// The base for CSV file providers.\n    /// </summary>\n    [Obsolete(\"CSVLocalizationProviderBase is deprecated and will be removed in version 4.0, see documentation\", false)]\n    public abstract class CSVLocalizationProviderBase : DependencyObject, ILocalizationProvider\n    {\n        #region Variables\n        /// <summary>\n        /// Gets the used ResourceManagers with their corresponding <c>namespaces</c>.\n        /// </summary>\n        protected Dictionary<string, ResourceManager> ResourceManagerList;\n\n        /// <summary>\n        /// Lock object for concurrent access to the resource manager list.\n        /// </summary>\n        protected object ResourceManagerListLock = new object();\n\n        /// <summary>\n        /// Lock object for concurrent access to the available culture list.\n        /// </summary>\n        protected object AvailableCultureListLock = new object();\n        #endregion\n\n        #region Helper functions\n        /// <summary>\n        /// Returns the <see cref=\"AssemblyName\"/> of the passed assembly instance\n        /// </summary>\n        /// <param name=\"assembly\">The Assembly where to get the name from</param>\n        /// <returns>The Assembly name</returns>\n        protected string GetAssemblyName(Assembly assembly)\n        {\n            if (assembly == null)\n                throw new ArgumentNullException(nameof(assembly));\n\n            if (assembly.FullName == null)\n                throw new NullReferenceException(\"assembly.FullName is null\");\n\n            return assembly.FullName.Split(',')[0];\n        }\n\n        /// <summary>\n        /// Parses a key ([[Assembly:]Dict:]Key and return the parts of it.\n        /// </summary>\n        /// <param name=\"inKey\">The key to parse.</param>\n        /// <param name=\"outAssembly\">The found or default assembly.</param>\n        /// <param name=\"outDict\">The found or default dictionary.</param>\n        /// <param name=\"outKey\">The found or default key.</param>\n        public static void ParseKey(string inKey, out string outAssembly, out string outDict, out string outKey)\n        {\n            // Reset everything to null.\n            outAssembly = null;\n            outDict = null;\n            outKey = null;\n\n            if (!string.IsNullOrEmpty(inKey))\n            {\n                var split = inKey.Trim().Split(\":\".ToCharArray());\n\n                // assembly:dict:key\n                if (split.Length == 3)\n                {\n                    outAssembly = !string.IsNullOrEmpty(split[0]) ? split[0] : null;\n                    outDict = !string.IsNullOrEmpty(split[1]) ? split[1] : null;\n                    outKey = split[2];\n                }\n\n                // dict:key\n                if (split.Length == 2)\n                {\n                    outDict = !string.IsNullOrEmpty(split[0]) ? split[0] : null;\n                    outKey = split[1];\n                }\n\n                // key\n                if (split.Length == 1)\n                    outKey = split[0];\n            }\n        }\n        #endregion\n\n        #region Abstract assembly & dictionary lookup\n        /// <summary>\n        /// Get the assembly from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The assembly name, if available.</returns>\n        protected abstract string GetAssembly(DependencyObject target);\n\n        /// <summary>\n        /// Get the dictionary from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The dictionary name, if available.</returns>\n        protected abstract string GetDictionary(DependencyObject target);\n        #endregion\n\n        #region Culture Management\n        /// <summary>\n        /// Thread-safe access to the AvailableCultures list.\n        /// </summary>\n        /// <param name=\"c\">The CultureInfo.</param>\n        protected void AddCulture(CultureInfo c)\n        {\n            lock (AvailableCultureListLock)\n            {\n                if (!AvailableCultures.Contains(c))\n                    AvailableCultures.Add(c);\n            }\n        }\n        #endregion\n\n        #region ILocalizationProvider implementation\n        /// <summary>\n        /// Uses the key and target to build a fully qualified resource key (Assembly, Dictionary, Key)\n        /// </summary>\n        /// <param name=\"key\">Key used as a base to find the full key</param>\n        /// <param name=\"target\">Target used to help determine key information</param>\n        /// <returns>Returns an object with all possible pieces of the given key (Assembly, Dictionary, Key)</returns>\n        public FullyQualifiedResourceKeyBase GetFullyQualifiedResourceKey(string key, DependencyObject target)\n        {\n            if (string.IsNullOrEmpty(key))\n                return null;\n\n            ParseKey(key, out var assembly, out var dictionary, out key);\n\n            if (target == null)\n                return new FQAssemblyDictionaryKey(key, assembly, dictionary);\n\n            if (string.IsNullOrEmpty(assembly))\n                assembly = GetAssembly(target);\n\n            if (string.IsNullOrEmpty(dictionary))\n                dictionary = GetDictionary(target);\n\n            return new FQAssemblyDictionaryKey(key, assembly, dictionary);\n        }\n\n        /// <summary>\n        /// Gets fired when the provider changed.\n        /// </summary>\n        public event ProviderChangedEventHandler ProviderChanged;\n\n        /// <summary>\n        /// An event that is fired when an error occurred.\n        /// </summary>\n        public event ProviderErrorEventHandler ProviderError;\n\n        /// <summary>\n        /// An event that is fired when a value changed.\n        /// </summary>\n        public event ValueChangedEventHandler ValueChanged;\n\n        /// <summary>\n        /// Calls the <see cref=\"ILocalizationProvider.ProviderChanged\"/> event.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        protected virtual void OnProviderChanged(DependencyObject target)\n        {\n            try\n            {\n                var assembly = GetAssembly(target);\n                var dictionary = GetDictionary(target);\n\n                //if (!String.IsNullOrEmpty(assembly) && !String.IsNullOrEmpty(dictionary))\n                //    GetResourceManager(assembly, dictionary);\n            }\n            catch\n            {\n                // ignored\n            }\n\n            ProviderChanged?.Invoke(this, new ProviderChangedEventArgs(target));\n        }\n\n        /// <summary>\n        /// Calls the <see cref=\"ILocalizationProvider.ProviderError\"/> event.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"message\">The error message.</param>\n        protected virtual void OnProviderError(DependencyObject target, string key, string message)\n        {\n            ProviderError?.Invoke(this, new ProviderErrorEventArgs(target, key, message));\n        }\n\n        /// <summary>\n        /// Calls the <see cref=\"ILocalizationProvider.ValueChanged\"/> event.\n        /// </summary>\n        /// <param name=\"key\">The key where the value was changed.</param>\n        /// <param name=\"value\">The new value.</param>\n        /// <param name=\"tag\">A custom tag.</param>\n        protected virtual void OnValueChanged(string key, object value, object tag)\n        {\n            ValueChanged?.Invoke(this, new ValueChangedEventArgs(key, value, tag));\n        }\n\n        /// <summary>\n        /// Get the localized object.\n        /// </summary>\n        /// <param name=\"key\">The key to the value.</param>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"culture\">The culture to use.</param>\n        /// <returns>The value corresponding to the source/dictionary/key path for the given culture (otherwise NULL).</returns>\n        public virtual object GetLocalizedObject(string key, DependencyObject target, CultureInfo culture)\n        {\n            throw new InvalidOperationException(\"GetLocalizedObject needs to be overriden\");\n        }\n\n        /// <summary>\n        /// An observable list of available cultures.\n        /// </summary>\n        public ObservableCollection<CultureInfo> AvailableCultures { get; protected set; }\n        #endregion\n    }\n}"
  },
  {
    "path": "src/Engine/EnumComboBox.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"EnumComboBox.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Engine\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel;\n    using System.Linq;\n    using System.Windows;\n    using System.Windows.Controls;\n    using System.Windows.Markup;\n    #endregion\n\n    /// <summary>\n    /// An extended combobox that is enumerating Enum values.\n    /// <para>Use the <see cref=\"T:System.ComponentModel.BrowsableAttribute\" /> to hide specific entries.</para>\n    /// </summary>\n    public class EnumComboBox : ComboBox\n    {\n        #region Type property\n        /// <summary>\n        /// The Type.\n        /// </summary>\n        public static DependencyProperty TypeProperty = DependencyProperty.Register(\"Type\", typeof(Type), typeof(EnumComboBox), new PropertyMetadata(TypeChanged));\n\n        /// <summary>\n        /// The backing property for <see cref=\"EnumComboBox.TypeProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public Type Type\n        {\n            get => (Type)GetValue(TypeProperty);\n            set => SetValue(TypeProperty, value);\n        }\n\n        private static void TypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\n        {\n            if (!(d is EnumComboBox ecb))\n                return;\n\n            ecb.SetType(ecb.Type);\n        }\n        #endregion\n\n        #region PrependType property\n        /// <summary>\n        /// This flag determines, if the type should be added using the given separator.\n        /// </summary>\n        public static DependencyProperty PrependTypeProperty = DependencyProperty.Register(\"PrependType\", typeof(bool), typeof(EnumComboBox), new PropertyMetadata(false));\n\n        /// <summary>\n        /// The backing property for <see cref=\"EnumComboBox.PrependTypeProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public bool PrependType\n        {\n            get => (bool)GetValue(PrependTypeProperty);\n            set => SetValue(PrependTypeProperty, value);\n        }\n        #endregion\n\n        #region Separator property\n        /// <summary>\n        /// The Separator.\n        /// </summary>\n        public static DependencyProperty SeparatorProperty = DependencyProperty.Register(\"Separator\", typeof(string), typeof(EnumComboBox), new PropertyMetadata(\"_\"));\n\n        /// <summary>\n        /// The backing property for <see cref=\"EnumComboBox.SeparatorProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public string Separator\n        {\n            get => (string)GetValue(SeparatorProperty);\n            set => SetValue(SeparatorProperty, value);\n        }\n        #endregion\n\n        #region Prefix property\n        /// <summary>\n        /// The Prefix.\n        /// </summary>\n        public static DependencyProperty PrefixProperty = DependencyProperty.Register(\"Prefix\", typeof(string), typeof(EnumComboBox), new PropertyMetadata(null));\n\n        /// <summary>\n        /// The backing property for <see cref=\"EnumComboBox.PrefixProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public string Prefix\n        {\n            get => (string)GetValue(PrefixProperty);\n            set => SetValue(PrefixProperty, value);\n        }\n        #endregion\n\n        #region XamlWriter Hack\n        /// <summary>\n        /// Overwrite and bypass the Items property.\n        /// </summary>\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new ItemCollection Items => base.Items;\n\n        private bool _shouldSerializeTemplate;\n\n        /// <inheritdoc/>\n        protected override void OnItemTemplateChanged(DataTemplate oldItemTemplate, DataTemplate newItemTemplate)\n        {\n            if (oldItemTemplate != null)\n                _shouldSerializeTemplate = true;\n\n            base.OnItemTemplateChanged(oldItemTemplate, newItemTemplate);\n        }\n\n        /// <inheritdoc/>\n        protected override bool ShouldSerializeProperty(DependencyProperty dp)\n        {\n            if (dp == ItemTemplateProperty && !_shouldSerializeTemplate)\n                return false;\n\n            return base.ShouldSerializeProperty(dp);\n        }\n        #endregion\n\n        private void SetType(Type type)\n        {\n            try\n            {\n                var items = new List<object>();\n\n                // First we need to get list of all enum fields\n                var fields = type.GetFields();\n\n                foreach (var field in fields)\n                {\n                    // Continue only for normal fields\n                    if (field.IsSpecialName)\n                        continue;\n\n                    // Get the first BrowsableAttribute and add the item accordingly.\n                    var attr = field.GetCustomAttributes(false).OfType<BrowsableAttribute>().FirstOrDefault();\n\n                    if (attr == null || attr.Browsable)\n                        items.Add(field.GetValue(0));\n                }\n\n                ItemsSource = items;\n            }\n            catch\n            {\n                // ignored\n            }\n        }\n\n        /// <summary>\n        /// Creates a new instance.\n        /// </summary>\n        public EnumComboBox()\n        {\n            var context = new ParserContext();\n\n            context.XmlnsDictionary.Add(\"\", \"http://schemas.microsoft.com/winfx/2006/xaml/presentation\");\n            context.XmlnsDictionary.Add(\"lex\", \"http://wpflocalizeextension.codeplex.com\");\n\n            var xaml = \"<DataTemplate><TextBlock><lex:EnumRun EnumValue=\\\"{Binding}\\\"\";\n            xaml += \" PrependType=\\\"{Binding PrependType, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=lex:EnumComboBox}}\\\"\";\n            xaml += \" Separator=\\\"{Binding Separator, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=lex:EnumComboBox}}\\\"\";\n            xaml += \" Prefix=\\\"{Binding Prefix, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=lex:EnumComboBox}}\\\"\";\n            xaml += \" /></TextBlock></DataTemplate>\";\n\n            ItemTemplate = (DataTemplate)XamlReader.Parse(xaml, context);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Engine/EnumRun.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"EnumRun.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Engine\n{\n    #region Usings\n    using System;\n    using System.ComponentModel;\n    using System.Windows;\n    using System.Windows.Documents;\n    using WPFLocalizeExtension.Extensions;\n    #endregion\n\n    /// <summary>\n    /// An extension of <see cref=\"T:System.Windows.Documents.Run\" /> for displaying localized enums.\n    /// </summary>\n    public class EnumRun : Run\n    {\n        /// <summary>\n        /// Our own <see cref=\"LocExtension\"/> instance.\n        /// </summary>\n        private LocExtension _ext;\n\n        #region EnumValue property\n        /// <summary>\n        /// The EnumValue.\n        /// </summary>\n        public static DependencyProperty EnumValueProperty = DependencyProperty.Register(\"EnumValue\", typeof(Enum), typeof(EnumRun), new PropertyMetadata(PropertiesChanged));\n\n        /// <summary>\n        /// The backing property for <see cref=\"EnumRun.EnumValueProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public Enum EnumValue\n        {\n            get => (Enum)GetValue(EnumValueProperty);\n            set => SetValue(EnumValueProperty, value);\n        }\n        #endregion\n\n        #region PrependType property\n        /// <summary>\n        /// This flag determines, if the type should be added using the given separator.\n        /// </summary>\n        public static DependencyProperty PrependTypeProperty = DependencyProperty.Register(\"PrependType\", typeof(bool), typeof(EnumRun), new PropertyMetadata(false, PropertiesChanged));\n\n        /// <summary>\n        /// The backing property for <see cref=\"EnumRun.PrependTypeProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public bool PrependType\n        {\n            get => (bool)GetValue(PrependTypeProperty);\n            set => SetValue(PrependTypeProperty, value);\n        }\n        #endregion\n\n        #region Separator property\n        /// <summary>\n        /// The Separator.\n        /// </summary>\n        public static DependencyProperty SeparatorProperty = DependencyProperty.Register(\"Separator\", typeof(string), typeof(EnumRun), new PropertyMetadata(\"_\", PropertiesChanged));\n\n        /// <summary>\n        /// The backing property for <see cref=\"EnumRun.SeparatorProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public string Separator\n        {\n            get => (string)GetValue(SeparatorProperty);\n            set => SetValue(SeparatorProperty, value);\n        }\n        #endregion\n\n        #region Prefix property\n        /// <summary>\n        /// The Prefix.\n        /// </summary>\n        public static DependencyProperty PrefixProperty = DependencyProperty.Register(\"Prefix\", typeof(string), typeof(EnumRun), new PropertyMetadata(null, PropertiesChanged));\n\n        /// <summary>\n        /// The backing property for <see cref=\"EnumRun.PrefixProperty\"/>\n        /// </summary>\n        [Category(\"Common\")]\n        public string Prefix\n        {\n            get => (string)GetValue(PrefixProperty);\n            set => SetValue(PrefixProperty, value);\n        }\n        #endregion\n\n        #region PropertiesChanged\n        /// <summary>\n        /// A notification handler for changed properties.\n        /// </summary>\n        /// <param name=\"d\">The object.</param>\n        /// <param name=\"e\">The event arguments.</param>\n        private static void PropertiesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\n        {\n            if (d is EnumRun run)\n            {\n                var value = run.EnumValue;\n                if (value != null)\n                {\n                    var key = value.ToString();\n\n                    if (run.PrependType)\n                        key = value.GetType().Name + run.Separator + key;\n                    if (!string.IsNullOrEmpty(run.Prefix))\n                        key = run.Prefix + run.Separator + key;\n\n                    if (run._ext == null)\n                    {\n                        run._ext = new LocExtension { Key = key };\n                        run._ext.SetBinding(run, run.GetType().GetProperty(\"Text\"));\n                    }\n                    else\n                        run._ext.Key = key;\n                }\n            }\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Engine/FallbackBehavior.cs",
    "content": "﻿namespace WPFLocalizeExtension.Engine\n{\n    /// <summary>\n    /// Behavior when key is not found at the localization provider.\n    /// </summary>\n    public enum FallbackBehavior\n    {\n        /// <summary>\n        /// Display \"Key: {key}\" string.\n        /// </summary>\n        Default,\n        \n        /// <summary>\n        /// Display key string itself.\n        /// </summary>\n        Key,\n        \n        /// <summary>\n        /// Display an empty string.\n        /// </summary>\n        EmptyString\n    }\n}"
  },
  {
    "path": "src/Engine/IDictionaryEventListener.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"IDictionaryEventListener.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Engine\n{\n    #region Usings\n    using System;\n    using System.Windows;\n    #endregion\n\n    /// <summary>\n    /// Interface for listeners on dictionary events of the <see cref=\"LocalizeDictionary\"/> class.\n    /// </summary>\n    public interface IDictionaryEventListener\n    {\n        /// <summary>\n        /// This method is called when the resource somehow changed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The event arguments.</param>\n        void ResourceChanged(DependencyObject sender, DictionaryEventArgs e);\n    }\n\n    /// <summary>\n    /// An enumeration of dictionary event types.\n    /// </summary>\n    public enum DictionaryEventType\n    {\n        /// <summary>\n        /// The separation changed.\n        /// </summary>\n        SeparationChanged,\n        /// <summary>\n        /// The provider changed.\n        /// </summary>\n        ProviderChanged,\n        /// <summary>\n        /// A provider reports an update.\n        /// </summary>\n        ProviderUpdated,\n        /// <summary>\n        /// The culture changed.\n        /// </summary>\n        CultureChanged,\n        /// <summary>\n        /// A certain value changed.\n        /// </summary>\n        ValueChanged,\n    }\n\n    /// <summary>\n    /// Event argument for dictionary events.\n    /// </summary>\n    public class DictionaryEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The type of the event.\n        /// </summary>\n        public DictionaryEventType Type { get; }\n\n        /// <summary>\n        /// A corresponding tag.\n        /// </summary>\n        public object Tag { get; }\n\n        /// <summary>\n        /// The constructor.\n        /// </summary>\n        /// <param name=\"type\">The type of the event.</param>\n        /// <param name=\"tag\">The corresponding tag.</param>\n        public DictionaryEventArgs(DictionaryEventType type, object tag)\n        {\n            Type = type;\n            Tag = tag;\n        }\n\n        /// <summary>\n        /// Returns the type and tag as a string.\n        /// </summary>\n        /// <returns>The type and tag as a string.</returns>\n        public override string ToString()\n        {\n            return Type + \": \" + Tag;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Engine/ListenerList.cs",
    "content": "﻿namespace WPFLocalizeExtension.Engine\n{\n    #region Usings\n    \n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    \n    #endregion\n    \n    /// <summary>\n    /// Represents a collection of listeners.\n    /// </summary>\n    internal class ListenersList\n    {\n        private readonly Dictionary<WeakReference, int> listeners;\n        private readonly Dictionary<int, List<WeakReference>> listenersHashCodes;\n        private readonly List<WeakReference> deadListeners;\n\n        /// <summary>\n        /// Create new empty <see cref=\"ListenersList\" /> instance.\n        /// </summary>\n        public ListenersList()\n        {\n            listeners = new Dictionary<WeakReference, int>();\n            listenersHashCodes = new Dictionary<int, List<WeakReference>>();\n            deadListeners = new List<WeakReference>();\n        }\n\n        /// <summary>\n        /// The count of listeners.\n        /// </summary>\n        public int Count => listeners.Count;\n\n        /// <summary>\n        /// Add new listener.\n        /// </summary>\n        public void AddListener(IDictionaryEventListener listener)\n        {\n            // Add listener if it not registered yet.\n            var weakReference = new WeakReference(listener);\n            var hashCode = listener.GetHashCode();\n            if (!listenersHashCodes.TryGetValue(hashCode, out var sameHashCodeListeners))\n            {\n                listeners.Add(weakReference, hashCode);\n                listenersHashCodes.Add(hashCode, new List<WeakReference> { weakReference });\n            }\n            else if (sameHashCodeListeners.All(wr => wr.Target != listener))\n            {\n                listeners.Add(weakReference, hashCode);\n                sameHashCodeListeners.Add(weakReference);\n            }\n        }\n\n        /// <summary>\n        /// Get all alive listeners.\n        /// </summary>\n        public IEnumerable<IDictionaryEventListener> GetListeners()\n        {\n            try\n            {\n                foreach (var listener in listeners)\n                {\n                    var listenerReference = listener.Key.Target as IDictionaryEventListener;\n                    if (listenerReference == null)\n                    {\n                        deadListeners.Add(listener.Key);\n                        continue;\n                    }\n\n                    yield return listenerReference;\n                }\n            }\n            finally\n            {\n                // Finally block is necessary because of `yield return`.\n                // It guarantees this method will be called even if listeners won't enumerate till the end.\n                ClearDeadReferences();\n            }\n        }\n\n        /// <summary>\n        /// Remove listener.\n        /// </summary>\n        public void RemoveListener(IDictionaryEventListener listener)\n        {\n            var hashCode = listener.GetHashCode();\n            if (!listenersHashCodes.TryGetValue(hashCode, out var hashCodes))\n                return;\n\n            var wr = hashCodes.FirstOrDefault(l => l.Target == listener);\n            if (wr == null)\n                return;\n\n            if (hashCodes.Count > 1)\n                hashCodes.Remove(wr);\n            else\n                listenersHashCodes.Remove(hashCode);\n\n            listeners.Remove(wr);\n        }\n\n        /// <summary>\n        /// Clear internal list from all dead listeners.\n        /// </summary>\n        private void ClearDeadReferences()\n        {\n            if (deadListeners.Count == 0)\n                return;\n            \n            foreach (var deadListener in deadListeners)\n            {\n                var hashCode = listeners[deadListener];\n                listenersHashCodes[hashCode].Remove(deadListener);\n                if (!listenersHashCodes[hashCode].Any())\n                    listenersHashCodes.Remove(hashCode);\n\n                listeners.Remove(deadListener);\n            }\n\n            deadListeners.Clear();\n        }\n    }\n}"
  },
  {
    "path": "src/Engine/LocalizeDictionary.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"LocalizeDictionary.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Bernhard Millauer</author>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Engine\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Collections.ObjectModel;\n    using System.Collections.Specialized;\n    using System.ComponentModel;\n    using System.Globalization;\n    using System.Linq;\n    using System.Threading;\n    using System.Windows;\n    using System.Windows.Input;\n    using System.Windows.Threading;\n    using WPFLocalizeExtension.Extensions;\n    using WPFLocalizeExtension.Providers;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <summary>\n    /// Represents the culture interface for localization\n    /// </summary>\n    public sealed class LocalizeDictionary : DependencyObject, INotifyPropertyChanged\n    {\n        #region INotifyPropertyChanged Implementation\n        /// <summary>\n        /// Informiert über sich ändernde Eigenschaften.\n        /// </summary>\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        /// <summary>\n        /// Notify that a property has changed\n        /// </summary>\n        /// <param name=\"property\">\n        /// The property that changed\n        /// </param>\n        internal void RaisePropertyChanged(string property)\n        {\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));\n        }\n        #endregion\n\n        #region Dependency Properties\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> DefaultProvider to set the default ILocalizationProvider.\n        /// </summary>\n        public static readonly DependencyProperty DefaultProviderProperty =\n            DependencyProperty.RegisterAttached(\n                \"DefaultProvider\",\n                typeof(ILocalizationProvider),\n                typeof(LocalizeDictionary),\n                new PropertyMetadata(null, SetDefaultProviderFromDependencyProperty));\n\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> Provider to set the ILocalizationProvider.\n        /// </summary>\n        public static readonly DependencyProperty ProviderProperty =\n            DependencyProperty.RegisterAttached(\n                \"Provider\",\n                typeof(ILocalizationProvider),\n                typeof(LocalizeDictionary),\n                new PropertyMetadata(null, SetProviderFromDependencyProperty));\n\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> DesignCulture to set the Culture.\n        /// Only supported at DesignTime.\n        /// </summary>\n        [DesignOnly(true)]\n        public static readonly DependencyProperty DesignCultureProperty =\n            DependencyProperty.RegisterAttached(\n                \"DesignCulture\",\n                typeof(string),\n                typeof(LocalizeDictionary),\n                new PropertyMetadata(SetCultureFromDependencyProperty));\n\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> Separation to set the separation character/string for resource name patterns.\n        /// </summary>\n        public static readonly DependencyProperty SeparationProperty =\n            DependencyProperty.RegisterAttached(\n                \"Separation\",\n                typeof(string),\n                typeof(LocalizeDictionary),\n                new PropertyMetadata(DefaultSeparation, SetSeparationFromDependencyProperty));\n\n        /// <summary>\n        /// A flag indicating that the invariant culture should be included.\n        /// </summary>\n        public static readonly DependencyProperty IncludeInvariantCultureProperty =\n            DependencyProperty.RegisterAttached(\n                \"IncludeInvariantCulture\",\n                typeof(bool),\n                typeof(LocalizeDictionary),\n                new PropertyMetadata(true, SetIncludeInvariantCultureFromDependencyProperty));\n\n        /// <summary>\n        /// A flag indicating that the cache is disabled.\n        /// </summary>\n        public static readonly DependencyProperty DisableCacheProperty =\n            DependencyProperty.RegisterAttached(\n                \"DisableCache\",\n                typeof(bool),\n                typeof(LocalizeDictionary),\n                new PropertyMetadata(false, SetDisableCacheFromDependencyProperty));\n\n        /// <summary>\n        /// A flag indicating that missing keys should be output.\n        /// </summary>\n        public static readonly DependencyProperty OutputMissingKeysProperty =\n            DependencyProperty.RegisterAttached(\n                \"OutputMissingKeys\",\n                typeof(bool),\n                typeof(LocalizeDictionary),\n                new PropertyMetadata(true, SetOutputMissingKeysFromDependencyProperty));\n        #endregion\n\n        #region Dependency Property Callbacks\n        /// <summary>\n        /// Callback function. Used to set the <see cref=\"LocalizeDictionary\"/>.Culture if set in Xaml.\n        /// Only supported at DesignTime.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        [DesignOnly(true)]\n        private static void SetCultureFromDependencyProperty(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            if (!Instance.GetIsInDesignMode())\n                return;\n\n            CultureInfo culture;\n\n            try\n            {\n                culture = new CultureInfo((string)args.NewValue);\n            }\n            catch\n            {\n                if (Instance.GetIsInDesignMode())\n                    culture = DefaultCultureInfo;\n                else\n                    throw;\n            }\n\n            if (culture != null)\n                Instance.Culture = culture;\n        }\n\n        /// <summary>\n        /// Callback function. Used to set the <see cref=\"LocalizeDictionary\"/>.Provider if set in Xaml.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        private static void SetProviderFromDependencyProperty(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            DictionaryEvent.Invoke(obj, new DictionaryEventArgs(DictionaryEventType.ProviderChanged, args.NewValue));\n\n            if (args.OldValue is ILocalizationProvider oldProvider)\n            {\n                oldProvider.ProviderChanged -= ProviderUpdated;\n                oldProvider.ValueChanged -= ValueChanged;\n                oldProvider.AvailableCultures.CollectionChanged -= Instance.AvailableCulturesCollectionChanged;\n            }\n\n            if (args.NewValue is ILocalizationProvider provider)\n            {\n                provider.ProviderChanged += ProviderUpdated;\n                provider.ValueChanged += ValueChanged;\n                provider.AvailableCultures.CollectionChanged += Instance.AvailableCulturesCollectionChanged;\n\n                foreach (var c in provider.AvailableCultures)\n                    if (!Instance.MergedAvailableCultures.Contains(c))\n                        Instance.MergedAvailableCultures.Add(c);\n            }\n        }\n\n        private static void ProviderUpdated(object sender, ProviderChangedEventArgs args)\n        {\n            DictionaryEvent.Invoke(args.Object, new DictionaryEventArgs(DictionaryEventType.ProviderUpdated, sender));\n        }\n\n        private static void ValueChanged(object sender, ValueChangedEventArgs args)\n        {\n            DictionaryEvent.Invoke(null, new DictionaryEventArgs(DictionaryEventType.ValueChanged, args));\n        }\n\n        /// <summary>\n        /// Callback function. Used to set the <see cref=\"LocalizeDictionary\"/>.DefaultProvider if set in Xaml.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        private static void SetDefaultProviderFromDependencyProperty(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            if (args.NewValue is ILocalizationProvider provider)\n                Instance.DefaultProvider = provider;\n        }\n\n        /// <summary>\n        /// Callback function. Used to set the <see cref=\"LocalizeDictionary\"/>.Separation if set in Xaml.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        private static void SetSeparationFromDependencyProperty(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n        }\n\n        /// <summary>\n        /// Callback function. Used to set the <see cref=\"LocalizeDictionary\"/>.IncludeInvariantCulture if set in Xaml.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        private static void SetIncludeInvariantCultureFromDependencyProperty(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            if (args.NewValue is bool b)\n                Instance.IncludeInvariantCulture = b;\n        }\n\n        /// <summary>\n        /// Callback function. Used to set the <see cref=\"LocalizeDictionary\"/>.DisableCache if set in Xaml.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        private static void SetDisableCacheFromDependencyProperty(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            if (args.NewValue is bool b)\n                Instance.DisableCache = b;\n        }\n\n        /// <summary>\n        /// Callback function. Used to set the <see cref=\"LocalizeDictionary\"/>.OutputMissingKeys if set in Xaml.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        private static void SetOutputMissingKeysFromDependencyProperty(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            if (args.NewValue is bool b)\n                Instance.OutputMissingKeys = b;\n        }\n        #endregion\n\n        #region Dependency Property Management\n        #region Get\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> Provider.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the provider from.</param>\n        /// <returns>The provider.</returns>\n        public static ILocalizationProvider GetProvider(DependencyObject obj)\n        {\n            return obj.GetValueSync<ILocalizationProvider>(ProviderProperty);\n        }\n\n#pragma warning disable IDE0060\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> DefaultProvider.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the default provider from.</param>\n        /// <returns>The default provider.</returns>\n        public static ILocalizationProvider GetDefaultProvider(DependencyObject obj)\n        {\n            return Instance.DefaultProvider;\n        }\n\n        /// <summary>\n        /// Tries to get the separation from the given target object or of one of its parents.\n        /// </summary>\n        /// <param name=\"target\">The target object for context.</param>\n        /// <returns>The separation of the given context or the default.</returns>\n        public static string GetSeparation(DependencyObject target)\n        {\n            return Instance.Separation;\n        }\n\n        /// <summary>\n        /// Tries to get the flag from the given target object or of one of its parents.\n        /// </summary>\n        /// <param name=\"target\">The target object for context.</param>\n        /// <returns>The flag.</returns>\n        public static bool GetIncludeInvariantCulture(DependencyObject target)\n        {\n            return Instance.IncludeInvariantCulture;\n        }\n\n        /// <summary>\n        /// Tries to get the flag from the given target object or of one of its parents.\n        /// </summary>\n        /// <param name=\"target\">The target object for context.</param>\n        /// <returns>The flag.</returns>\n        public static bool GetDisableCache(DependencyObject target)\n        {\n            return Instance.DisableCache;\n        }\n\n        /// <summary>\n        /// Tries to get the flag from the given target object or of one of its parents.\n        /// </summary>\n        /// <param name=\"target\">The target object for context.</param>\n        /// <returns>The flag.</returns>\n        public static bool GetOutputMissingKeys(DependencyObject target)\n        {\n            return Instance.OutputMissingKeys;\n        }\n#pragma warning restore IDE0060\n\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> DesignCulture.\n        /// Only supported at DesignTime.\n        /// If its in Runtime, <see cref=\"LocalizeDictionary\"/>.Culture will be returned.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the design culture from.</param>\n        /// <returns>The design culture at design time or the current culture at runtime.</returns>\n        [DesignOnly(true)]\n        public static string GetDesignCulture(DependencyObject obj)\n        {\n            if (Instance.GetIsInDesignMode())\n                return obj.GetValueSync<string>(DesignCultureProperty);\n\n            return Instance.Culture.ToString();\n        }\n        #endregion\n\n        #region Set\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> Provider.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the provider to.</param>\n        /// <param name=\"value\">The provider.</param>\n        public static void SetProvider(DependencyObject obj, ILocalizationProvider value)\n        {\n            obj.SetValueSync(ProviderProperty, value);\n        }\n\n#pragma warning disable IDE0060\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> DefaultProvider.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the default provider to.</param>\n        /// <param name=\"value\">The default provider.</param>\n        public static void SetDefaultProvider(DependencyObject obj, ILocalizationProvider value)\n        {\n            Instance.DefaultProvider = value;\n        }\n\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> Separation.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the separation to.</param>\n        /// <param name=\"value\">The separation.</param>\n        public static void SetSeparation(DependencyObject obj, string value)\n        {\n            Instance.Separation = value;\n        }\n\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> IncludeInvariantCulture.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the separation to.</param>\n        /// <param name=\"value\">The flag.</param>\n        public static void SetIncludeInvariantCulture(DependencyObject obj, bool value)\n        {\n            Instance.IncludeInvariantCulture = value;\n        }\n\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> DisableCache.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the separation to.</param>\n        /// <param name=\"value\">The flag.</param>\n        public static void SetDisableCache(DependencyObject obj, bool value)\n        {\n            Instance.DisableCache = value;\n        }\n\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> OutputMissingKeys.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the separation to.</param>\n        /// <param name=\"value\">The flag.</param>\n        public static void SetOutputMissingKeys(DependencyObject obj, bool value)\n        {\n            Instance.OutputMissingKeys = value;\n        }\n#pragma warning restore IDE0060\n\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> DesignCulture.\n        /// Only supported at DesignTime.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the culture to.</param>\n        /// <param name=\"value\">The value.</param>\n        [DesignOnly(true)]\n        public static void SetDesignCulture(DependencyObject obj, string value)\n        {\n            if (Instance.GetIsInDesignMode())\n                obj.SetValueSync(DesignCultureProperty, value);\n        }\n        #endregion\n        #endregion\n\n        #region Variables\n        /// <summary>\n        /// Holds a SyncRoot to be thread safe\n        /// </summary>\n        private static readonly object SyncRoot = new object();\n\n        /// <summary>\n        /// Holds the instance of singleton\n        /// </summary>\n        private static LocalizeDictionary _instance;\n\n        /// <summary>\n        /// Holds the current chosen <see cref=\"CultureInfo\"/>\n        /// </summary>\n        private CultureInfo _culture;\n\n        /// <summary>\n        /// Holds the separation char/string.\n        /// </summary>\n        private string _separation = DefaultSeparation;\n\n        /// <summary>\n        /// Determines, if the <see cref=\"MergedAvailableCultures\"/> contains the invariant culture.\n        /// </summary>\n        private bool _includeInvariantCulture = true;\n\n        /// <summary>\n        /// Determines, if the cache is disabled.\n        /// </summary>\n        private bool _disableCache = true;\n\n        /// <summary>\n        /// Determines, if missing keys should be output.\n        /// </summary>\n        private bool _outputMissingKeys = true;\n\n        /// <summary>\n        /// A default provider.\n        /// </summary>\n        private ILocalizationProvider _defaultProvider;\n\n        /// <summary>\n        /// Determines, if the CurrentThread culture is set along with the Culture property.\n        /// </summary>\n        private bool _setCurrentThreadCulture = true;\n\n        /// <summary>\n        /// Determines if the code is run in DesignMode or not.\n        /// </summary>\n        private bool? _isInDesignMode;\n\n        #endregion\n\n        #region Constructor\n        /// <summary>\n        /// Prevents a default instance of the <see cref=\"T:WPFLocalizeExtension.Engine.LocalizeDictionary\" /> class from being created.\n        /// Static Constructor\n        /// </summary>\n        private LocalizeDictionary()\n        {\n            DefaultProvider = ResxLocalizationProvider.Instance;\n            SetCultureCommand = new CultureInfoDelegateCommand(SetCulture);\n        }\n\n        private void AvailableCulturesCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)\n        {\n            Dispatcher.BeginInvoke(new Action<NotifyCollectionChangedEventArgs>(args =>\n            {\n                if (args.NewItems != null)\n                {\n                    foreach (CultureInfo c in args.NewItems)\n                    {\n                        if (!MergedAvailableCultures.Contains(c))\n                            MergedAvailableCultures.Add(c);\n                    }\n                }\n\n                if (args.OldItems != null)\n                {\n                    foreach (CultureInfo c in args.OldItems)\n                    {\n                        if (MergedAvailableCultures.Contains(c))\n                            MergedAvailableCultures.Remove(c);\n                    }\n                }\n\n                if (!_includeInvariantCulture && MergedAvailableCultures.Count > 1 && MergedAvailableCultures.Contains(CultureInfo.InvariantCulture))\n                    MergedAvailableCultures.Remove(CultureInfo.InvariantCulture);\n            }), e);\n        }\n\n        /// <summary>\n        /// Destructor code.\n        /// </summary>\n        ~LocalizeDictionary()\n        {\n            LocExtension.ClearResourceBuffer();\n            FELoc.ClearResourceBuffer();\n            BLoc.ClearResourceBuffer();\n        }\n        #endregion\n\n        #region Static Properties\n        /// <summary>\n        /// Gets the default <see cref=\"CultureInfo\"/> to initialize the <see cref=\"LocalizeDictionary\"/>.<see cref=\"CultureInfo\"/>\n        /// </summary>\n        public static CultureInfo DefaultCultureInfo => CultureInfo.InvariantCulture;\n\n        /// <summary>\n        /// Gets the default separation char/string.\n        /// </summary>\n        public static string DefaultSeparation => \"_\";\n\n        /// <summary>\n        /// Gets the <see cref=\"LocalizeDictionary\"/> singleton.\n        /// If the underlying instance is null, a instance will be created.\n        /// </summary>\n        public static LocalizeDictionary Instance\n        {\n            get\n            {\n                // check if the underlying instance is null\n                if (_instance == null)\n                {\n                    // if it is null, lock the syncroot.\n                    // if another thread is accessing this too,\n                    // it have to wait until the syncroot is released\n                    lock (SyncRoot)\n                    {\n                        // check again, if the underlying instance is null\n                        if (_instance == null)\n                        {\n                            // create a new instance\n                            _instance = new LocalizeDictionary();\n                        }\n                    }\n                }\n\n                // return the existing/new instance\n                return _instance;\n            }\n        }\n\n        /// <summary>\n        /// Gets the culture of the singleton instance.\n        /// </summary>\n        public static CultureInfo CurrentCulture => Instance.Culture;\n\n        #endregion\n\n        #region Properties\n        /// <summary>\n        /// Gets or sets the <see cref=\"CultureInfo\"/> for localization.\n        /// On set, <see cref=\"DictionaryEvent\"/> is raised.\n        /// </summary>\n        /// <exception cref=\"System.InvalidOperationException\">\n        /// You have to set <see cref=\"LocalizeDictionary\"/>.Culture first or\n        /// wait until System.Windows.Application.Current.MainWindow is created.\n        /// Otherwise you will get an Exception.</exception>\n        /// <exception cref=\"System.ArgumentNullException\">thrown if Culture will be set to null</exception>\n        public CultureInfo Culture\n        {\n            get\n            {\n                if (_culture == null)\n                    _culture = DefaultCultureInfo;\n\n                return _culture;\n            }\n\n            set\n            {\n                // the cultureinfo cannot contain a null reference\n                if (value == null)\n                    value = DefaultCultureInfo;\n\n                // Let's see if we already got this culture\n                var newCulture = value;\n\n                if (!GetIsInDesignMode())\n                {\n                    foreach (var c in MergedAvailableCultures)\n                        if (c == CultureInfo.InvariantCulture && !IncludeInvariantCulture)\n                            continue;\n                        else if (c.Name == value.Name)\n                        {\n                            newCulture = c;\n                            break;\n                        }\n                        else if (c.Parent.Name == value.Name)\n                        {\n                            // We found a parent culture, but continue - maybe there is a specific one available too.\n                            newCulture = c;\n                        }\n                        else if (value.Parent.Name == c.Name)\n                        {\n                            // We found a parent culture, but continue - maybe there is a specific one available too.\n                            newCulture = value;\n                        }\n                }\n\n                if (_culture != newCulture)\n                {\n                    if (newCulture != null && !MergedAvailableCultures.Contains(newCulture))\n                        MergedAvailableCultures.Add(newCulture);\n\n                    _culture = newCulture;\n\n                    // Change the CurrentThread culture if needed.\n                    if (_setCurrentThreadCulture && !GetIsInDesignMode())\n                    {\n                        Thread.CurrentThread.CurrentCulture = _culture;\n                        Thread.CurrentThread.CurrentUICulture = _culture;\n                    }\n\n                    // Raise the OnLocChanged event\n                    DictionaryEvent.Invoke(null, new DictionaryEventArgs(DictionaryEventType.CultureChanged, value));\n\n                    RaisePropertyChanged(nameof(Culture));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets a flag that determines, if the CurrentThread culture should be changed along with the Culture property.\n        /// </summary>\n        public bool SetCurrentThreadCulture\n        {\n            get => _setCurrentThreadCulture;\n            set\n            {\n                if (_setCurrentThreadCulture != value)\n                {\n                    _setCurrentThreadCulture = value;\n                    RaisePropertyChanged(nameof(SetCurrentThreadCulture));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the flag indicating if the invariant culture is included in the <see cref=\"MergedAvailableCultures\"/> list.\n        /// </summary>\n        public bool IncludeInvariantCulture\n        {\n            get => _includeInvariantCulture;\n            set\n            {\n                if (_includeInvariantCulture != value)\n                {\n                    _includeInvariantCulture = value;\n\n                    var c = CultureInfo.InvariantCulture;\n                    var existing = MergedAvailableCultures.Contains(c);\n\n                    if (_includeInvariantCulture && !existing)\n                        MergedAvailableCultures.Insert(0, c);\n                    else if (!_includeInvariantCulture && existing && MergedAvailableCultures.Count > 1)\n                        MergedAvailableCultures.Remove(c);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the flag that disables the cache.\n        /// </summary>\n        public bool DisableCache\n        {\n            get => _disableCache;\n            set => _disableCache = value;\n        }\n\n        /// <summary>\n        /// Gets or sets the flag that controls the output of missing keys.\n        /// </summary>\n        public bool OutputMissingKeys\n        {\n            get => _outputMissingKeys;\n            set => _outputMissingKeys = value;\n        }\n\n        /// <summary>\n        /// The separation char for automatic key retrieval.\n        /// </summary>\n        public string Separation\n        {\n            get => _separation;\n            set\n            {\n                _separation = value;\n                DictionaryEvent.Invoke(null, new DictionaryEventArgs(DictionaryEventType.SeparationChanged, value));\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the default <see cref=\"ILocalizationProvider\"/>.\n        /// </summary>\n        public ILocalizationProvider DefaultProvider\n        {\n            get => _defaultProvider;\n            set\n            {\n                if (_defaultProvider != value)\n                {\n                    if (_defaultProvider != null)\n                    {\n                        _defaultProvider.ProviderChanged -= ProviderUpdated;\n                        _defaultProvider.ValueChanged -= ValueChanged;\n                        _defaultProvider.AvailableCultures.CollectionChanged -= AvailableCulturesCollectionChanged;\n                    }\n\n                    _defaultProvider = value;\n\n                    if (_defaultProvider != null)\n                    {\n                        _defaultProvider.ProviderChanged += ProviderUpdated;\n                        _defaultProvider.ValueChanged += ValueChanged;\n                        _defaultProvider.AvailableCultures.CollectionChanged += AvailableCulturesCollectionChanged;\n\n                        foreach (var c in _defaultProvider.AvailableCultures)\n                        {\n                            if (!MergedAvailableCultures.Contains(c))\n                                MergedAvailableCultures.Add(c);\n                        }\n                    }\n\n                    RaisePropertyChanged(nameof(DefaultProvider));\n                }\n            }\n        }\n\n        private ObservableCollection<CultureInfo> _mergedAvailableCultures;\n\n        /// <summary>\n        /// Gets the merged list of all available cultures.\n        /// </summary>\n        public ObservableCollection<CultureInfo> MergedAvailableCultures\n        {\n            get\n            {\n                if (_mergedAvailableCultures == null)\n                {\n                    _mergedAvailableCultures = new ObservableCollection<CultureInfo> { CultureInfo.InvariantCulture };\n                    _mergedAvailableCultures.CollectionChanged += (s, e) => { Culture = Culture; };\n                }\n\n                return _mergedAvailableCultures;\n            }\n        }\n\n        /// <summary>\n        /// A command for culture changes.\n        /// </summary>\n        public ICommand SetCultureCommand { get; }\n\n        /// <summary>\n        /// Gets the specific <see cref=\"CultureInfo\"/> of the current culture.\n        /// This can be used for format manners.\n        /// If the Culture is an invariant <see cref=\"CultureInfo\"/>,\n        /// SpecificCulture will also return an invariant <see cref=\"CultureInfo\"/>.\n        /// </summary>\n        public CultureInfo SpecificCulture => CultureInfo.CreateSpecificCulture(Culture.ToString());\n\n        #endregion\n\n        #region Localization Core\n        /// <summary>\n        /// Get the localized object using the built-in ResxLocalizationProvider.\n        /// </summary>\n        /// <param name=\"source\">The source of the dictionary.</param>\n        /// <param name=\"dictionary\">The dictionary with key/value pairs.</param>\n        /// <param name=\"key\">The key to the value.</param>\n        /// <param name=\"culture\">The culture to use.</param>\n        /// <returns>The value corresponding to the source/dictionary/key path for the given culture (otherwise NULL).</returns>\n        public object GetLocalizedObject(string source, string dictionary, string key, CultureInfo culture)\n        {\n            return GetLocalizedObject(source + \":\" + dictionary + \":\" + key, null, culture, DefaultProvider);\n        }\n\n        /// <summary>\n        /// Get the localized object using the given target for context information.\n        /// </summary>\n        /// <param name=\"key\">The key to the value.</param>\n        /// <param name=\"target\">The target <see cref=\"DependencyObject\"/>.</param>\n        /// <param name=\"culture\">The culture to use.</param>\n        /// <returns>The value corresponding to the source/dictionary/key path for the given culture (otherwise NULL).</returns>\n        public object GetLocalizedObject(string key, DependencyObject target, CultureInfo culture)\n        {\n            if (DefaultProvider is IInheritingLocalizationProvider)\n                return GetLocalizedObject(key, target, culture, DefaultProvider);\n\n            var provider = target?.GetValue(GetProvider);\n\n            if (provider == null)\n                provider = DefaultProvider;\n\n            return GetLocalizedObject(key, target, culture, provider);\n        }\n\n        /// <summary>\n        /// Get the localized object using the given target and provider.\n        /// </summary>\n        /// <param name=\"key\">The key to the value.</param>\n        /// <param name=\"target\">The target <see cref=\"DependencyObject\"/>.</param>\n        /// <param name=\"culture\">The culture to use.</param>\n        /// <param name=\"provider\">The provider to use.</param>\n        /// <returns>The value corresponding to the source/dictionary/key path for the given culture (otherwise NULL).</returns>\n        public object GetLocalizedObject(string key, DependencyObject target, CultureInfo culture, ILocalizationProvider provider)\n        {\n            if (provider == null)\n                throw new InvalidOperationException(\"No provider found and no default provider given.\");\n\n            return provider.GetLocalizedObject(key, target, culture);\n        }\n\n        /// <summary>\n        /// Uses the key and target to build a fully qualified resource key (Assembly, Dictionary, Key)\n        /// </summary>\n        /// <param name=\"key\">Key used as a base to find the full key</param>\n        /// <param name=\"target\">Target used to help determine key information</param>\n        /// <returns>Returns an object with all possible pieces of the given key (Assembly, Dictionary, Key)</returns>\n        public FullyQualifiedResourceKeyBase GetFullyQualifiedResourceKey(string key, DependencyObject target)\n        {\n            if (DefaultProvider is IInheritingLocalizationProvider)\n                return GetFullyQualifiedResourceKey(key, target, DefaultProvider);\n\n            var provider = target?.GetValue(GetProvider);\n\n            if (provider == null)\n                provider = DefaultProvider;\n\n            return GetFullyQualifiedResourceKey(key, target, provider);\n        }\n\n        /// <summary>\n        /// Uses the key and target to build a fully qualified resource key (Assembly, Dictionary, Key)\n        /// </summary>\n        /// <param name=\"key\">Key used as a base to find the full key</param>\n        /// <param name=\"target\">Target used to help determine key information</param>\n        /// <param name=\"provider\">Provider to use</param>\n        /// <returns>Returns an object with all possible pieces of the given key (Assembly, Dictionary, Key)</returns>\n        public FullyQualifiedResourceKeyBase GetFullyQualifiedResourceKey(string key, DependencyObject target, ILocalizationProvider provider)\n        {\n            if (provider == null)\n                throw new InvalidOperationException(\"No provider found and no default provider given.\");\n\n            return provider.GetFullyQualifiedResourceKey(key, target);\n        }\n\n        /// <summary>\n        /// Looks up the ResourceManagers for the searched <paramref name=\"resourceKey\"/>\n        /// in the <paramref name=\"resourceDictionary\"/> in the <paramref name=\"resourceAssembly\"/>\n        /// with an Invariant Culture.\n        /// </summary>\n        /// <param name=\"resourceAssembly\">The resource assembly</param>\n        /// <param name=\"resourceDictionary\">The dictionary to look up</param>\n        /// <param name=\"resourceKey\">The key of the searched entry</param>\n        /// <returns>\n        /// TRUE if the searched one is found, otherwise FALSE\n        /// </returns>\n        public bool ResourceKeyExists(string resourceAssembly, string resourceDictionary, string resourceKey)\n        {\n            return ResourceKeyExists(resourceAssembly, resourceDictionary, resourceKey, CultureInfo.InvariantCulture);\n        }\n\n        /// <summary>\n        /// Looks up the ResourceManagers for the searched <paramref name=\"resourceKey\"/>\n        /// in the <paramref name=\"resourceDictionary\"/> in the <paramref name=\"resourceAssembly\"/>\n        /// with the passed culture. If the searched one does not exists with the passed culture, is will searched\n        /// until the invariant culture is used.\n        /// </summary>\n        /// <param name=\"resourceAssembly\">The resource assembly</param>\n        /// <param name=\"resourceDictionary\">The dictionary to look up</param>\n        /// <param name=\"resourceKey\">The key of the searched entry</param>\n        /// <param name=\"cultureToUse\">The culture to use.</param>\n        /// <returns>\n        /// TRUE if the searched one is found, otherwise FALSE\n        /// </returns>\n        public bool ResourceKeyExists(string resourceAssembly, string resourceDictionary, string resourceKey, CultureInfo cultureToUse)\n        {\n            var provider = ResxLocalizationProvider.Instance;\n\n            return ResourceKeyExists(resourceAssembly + \":\" + resourceDictionary + \":\" + resourceKey, cultureToUse, provider);\n        }\n\n        /// <summary>\n        /// Looks up the ResourceManagers for the searched <paramref name=\"key\"/>\n        /// with the passed culture. If the searched one does not exists with the passed culture, is will searched\n        /// until the invariant culture is used.\n        /// </summary>\n        /// <param name=\"key\">The key of the searched entry</param>\n        /// <param name=\"cultureToUse\">The culture to use.</param>\n        /// <param name=\"provider\">The localization provider.</param>\n        /// <returns>\n        /// TRUE if the searched one is found, otherwise FALSE\n        /// </returns>\n        public bool ResourceKeyExists(string key, CultureInfo cultureToUse, ILocalizationProvider provider)\n        {\n            return provider.GetLocalizedObject(key, null, cultureToUse) != null;\n        }\n        #endregion\n\n        #region Helper Functions\n        /// <summary>\n        /// Gets the status of the design mode\n        /// </summary>\n        /// <returns>TRUE if in design mode, else FALSE</returns>\n        public bool GetIsInDesignMode()\n        {\n            lock (SyncRoot)\n            {\n                if (_isInDesignMode.HasValue)\n                    return _isInDesignMode.Value;\n\n                if (Dispatcher?.Thread == null || !Dispatcher.Thread.IsAlive)\n                {\n                    _isInDesignMode = false;\n                    return _isInDesignMode.Value;\n                }\n\n                if (!Dispatcher.CheckAccess())\n                {\n                    try\n                    {\n                        _isInDesignMode = (bool)Dispatcher.Invoke(DispatcherPriority.Normal, TimeSpan.FromMilliseconds(100), new Func<bool>(GetIsInDesignMode));\n                    }\n                    catch (Exception)\n                    {\n                        _isInDesignMode = default(bool);\n                    }\n\n                    return _isInDesignMode.Value;\n                }\n                _isInDesignMode = DesignerProperties.GetIsInDesignMode(this);\n                return _isInDesignMode.Value;\n            }\n        }\n        #endregion\n\n        #region MissingKeyEvent (standard event)\n        /// <summary>\n        /// An event for missing keys.\n        /// </summary>\n        public event EventHandler<MissingKeyEventArgs> MissingKeyEvent;\n\n        /// <summary>\n        /// Triggers a MissingKeyEvent.\n        /// </summary>\n        /// <param name=\"sender\">The sender of the event.</param>\n        /// <param name=\"key\">The missing key.</param>\n        /// <returns>True, if a reload should be performed.</returns>\n        internal MissingKeyEventArgs OnNewMissingKeyEvent(object sender, string key)\n        {\n            var args = new MissingKeyEventArgs(key);\n            MissingKeyEvent?.Invoke(sender, args);\n            return args;\n        }\n        #endregion\n\n        #region DictionaryEvent (using weak references)\n        internal static class DictionaryEvent\n        {\n            /// <summary>\n            /// The list of listeners\n            /// </summary>\n            private static readonly ListenersList Listeners = new ListenersList();\n            private static readonly object ListenersLock = new object();\n\n            /// <summary>\n            /// Fire the event.\n            /// </summary>\n            /// <param name=\"sender\">The sender of the event.</param>\n            /// <param name=\"args\">The event arguments.</param>\n            internal static void Invoke(DependencyObject sender, DictionaryEventArgs args)\n            {\n                lock (ListenersLock)\n                {\n                    var exceptions = new List<Exception>();\n                    \n                    foreach (var listener in Listeners.GetListeners())\n                    {\n                        try\n                        {\n                            listener.ResourceChanged(sender, args);\n                        }\n                        catch (Exception e)\n                        {\n                            exceptions.Add(e);\n                        }\n                    }\n\n                    if (exceptions.Count > 0)\n                        throw new AggregateException(exceptions);\n                }\n            }\n\n            /// <summary>\n            /// Adds a listener to the inner list of listeners.\n            /// </summary>\n            /// <param name=\"listener\">The listener to add.</param>\n            internal static void AddListener(IDictionaryEventListener listener)\n            {\n                if (listener == null)\n                    return;\n                \n                lock (ListenersLock)\n                {\n                    Listeners.AddListener(listener);\n                }\n            }\n\n            /// <summary>\n            /// Removes a listener from the inner list of listeners.\n            /// </summary>\n            /// <param name=\"listener\">The listener to remove.</param>\n            internal static void RemoveListener(IDictionaryEventListener listener)\n            {\n                if (listener == null)\n                    return;\n\n                lock (ListenersLock)\n                {\n                    Listeners.RemoveListener(listener);\n                }\n            }\n\n            /// <summary>\n            /// Enumerates all listeners of type T.\n            /// </summary>\n            /// <typeparam name=\"T\">The listener type.</typeparam>\n            /// <returns>An enumeration of listeners.</returns>\n            internal static IEnumerable<T> EnumerateListeners<T>()\n            {\n                lock (ListenersLock)\n                {\n                    foreach (var listener in Listeners.GetListeners().OfType<T>())\n                    {\n                        yield return listener;\n                    }\n                }\n            }\n        }\n        #endregion\n\n        #region CultureInfoDelegateCommand\n        private void SetCulture(CultureInfo c)\n        {\n            Culture = c;\n        }\n\n        /// <summary>\n        /// A class for culture commands.\n        /// </summary>\n        internal class CultureInfoDelegateCommand : ICommand\n        {\n            #region Functions for execution and evaluation\n            /// <summary>\n            /// Predicate that determines if an object can execute\n            /// </summary>\n            private readonly Predicate<CultureInfo> _canExecute;\n\n            /// <summary>\n            /// The action to execute when the command is invoked\n            /// </summary>\n            private readonly Action<CultureInfo> _execute;\n            #endregion\n\n            #region Constructor\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"CultureInfoDelegateCommand\"/> class.\n            /// Creates a new command that can always execute.\n            /// </summary>\n            /// <param name=\"execute\">\n            /// The execution logic.\n            /// </param>\n            public CultureInfoDelegateCommand(Action<CultureInfo> execute)\n                : this(execute, null)\n            {\n            }\n\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"CultureInfoDelegateCommand\"/> class.\n            /// Creates a new command.\n            /// </summary>\n            /// <param name=\"execute\">\n            /// The execution logic.\n            /// </param>\n            /// <param name=\"canExecute\">\n            /// The execution status logic.\n            /// </param>\n            public CultureInfoDelegateCommand(Action<CultureInfo> execute, Predicate<CultureInfo> canExecute)\n            {\n                _execute = execute ?? throw new ArgumentNullException(nameof(execute));\n                _canExecute = canExecute;\n            }\n            #endregion\n\n            #region ICommand interface\n            /// <summary>\n            /// Occurs when changes occur that affect whether or not the command should execute.\n            /// </summary>\n            public event EventHandler CanExecuteChanged\n            {\n                add => CommandManager.RequerySuggested += value;\n                remove => CommandManager.RequerySuggested -= value;\n            }\n\n            /// <summary>\n            /// Determines whether the command can execute in its current state.\n            /// </summary>\n            /// <param name=\"parameter\">Data used by the command. If the command does not require data to be passed, this object can be set to null.</param>\n            /// <returns>true if this command can be executed; otherwise, false.</returns>\n            public bool CanExecute(object parameter)\n            {\n                return _canExecute == null || _canExecute((CultureInfo)parameter);\n            }\n\n            /// <summary>\n            /// Is called when the command is invoked.\n            /// </summary>\n            /// <param name=\"parameter\">Data used by the command. If the command does not require data to be passed, this object can be set to null.</param>\n            public void Execute(object parameter)\n            {\n                var c = new CultureInfo((string)parameter);\n                _execute(c);\n            }\n            #endregion\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Engine/MissingKeyEventArgs.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"MissingKeyEventArgs.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Engine\n{\n    #region Usings\n    using System;\n    #endregion\n\n    /// <summary>\n    /// Event arguments for a missing key event.\n    /// </summary>\n    public class MissingKeyEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The key that is missing or has no data.\n        /// </summary>\n        public string Key { get; }\n\n        /// <summary>\n        /// A flag indicating that a reload should be performed.\n        /// </summary>\n        public bool Reload { get; set; }\n\n        /// <summary>\n        /// A custom returnmessage for the missing key\n        /// </summary>\n        public string MissingKeyResult { get; set; }\n\n        /// <summary>\n        /// Creates a new instance of <see cref=\"MissingKeyEventArgs\"/>.\n        /// </summary>\n        /// <param name=\"key\">The missing key.</param>\n        public MissingKeyEventArgs(string key)\n        {\n            Key = key;\n            Reload = false;\n            MissingKeyResult = null;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Engine/ObjectDependencyManager.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"ObjectDependencyManager.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Bernhard Millauer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Engine\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.CompilerServices;\n    #endregion\n\n    /// <summary>\n    /// This class ensures, that a specific object lives as long a associated object is alive.\n    /// </summary>\n    public static class ObjectDependencyManager\n    {\n        /// <summary>\n        /// This member holds the list of all <see cref=\"WeakReference\"/>s and their appropriate objects.\n        /// </summary>\n        private static readonly Dictionary<object, List<WeakReference>> InternalList;\n\n        /// <summary>\n        /// Initializes static members of the <see cref=\"ObjectDependencyManager\"/> class.\n        /// Static Constructor. Creates a new instance of\n        /// Dictionary(object, <see cref=\"WeakReference\"/>) and set it to the <see cref=\"InternalList\"/>.\n        /// </summary>\n        static ObjectDependencyManager()\n        {\n            InternalList = new Dictionary<object, List<WeakReference>>();\n        }\n\n        /// <summary>\n        /// This method adds a new object dependency\n        /// </summary>\n        /// <param name=\"weakRefDp\">The <see cref=\"WeakReference\"/>, which ensures the live cycle of <paramref name=\"objToHold\"/></param>\n        /// <param name=\"objToHold\">The object, which should stay alive as long <paramref name=\"weakRefDp\"/> is alive</param>\n        /// <returns>\n        /// true, if the binding was successfully, otherwise false\n        /// </returns>\n        /// <exception cref=\"System.ArgumentNullException\">\n        /// The <paramref name=\"objToHold\"/> cannot be null\n        /// </exception>\n        /// <exception cref=\"System.ArgumentException\">\n        /// <paramref name=\"objToHold\"/> cannot be type of <see cref=\"WeakReference\"/>\n        /// </exception>\n        /// <exception cref=\"System.InvalidOperationException\">\n        /// The <see cref=\"WeakReference\"/>.Target cannot be the same as <paramref name=\"objToHold\"/>\n        /// </exception>\n        [MethodImpl(MethodImplOptions.Synchronized)]\n        public static bool AddObjectDependency(WeakReference weakRefDp, object objToHold)\n        {\n            // run the clean up to ensure that only objects are watched they are realy still alive\n            CleanUp();\n\n            // if the objToHold is null, we cannot handle this afterwards.\n            if (objToHold == null)\n            {\n                throw new ArgumentNullException(nameof(objToHold), \"The objToHold cannot be null\");\n            }\n\n            // if the objToHold is a weakreference, we cannot handle this type afterwards.\n            if (objToHold.GetType() == typeof(WeakReference))\n            {\n                throw new ArgumentException(\"objToHold cannot be type of WeakReference\", nameof(objToHold));\n            }\n\n            // if the target of the weakreference is the objToHold, this would be a cycling play.\n            if (weakRefDp.Target == objToHold)\n            {\n                throw new InvalidOperationException(\"The WeakReference.Target cannot be the same as objToHold\");\n            }\n\n            // holds the status of registration of the object dependency\n            var itemRegistered = false;\n\n            // check if the objToHold is contained in the internalList.\n            if (!InternalList.ContainsKey(objToHold))\n            {\n                // add the objToHold to the internal list.\n                List<WeakReference> lst = new List<WeakReference> { weakRefDp };\n\n                InternalList.Add(objToHold, lst);\n\n                itemRegistered = true;\n            }\n            else\n            {\n                // otherweise, check if the weakRefDp exists and add it if necessary\n                List<WeakReference> lst = InternalList[objToHold];\n                if (!lst.Contains(weakRefDp))\n                {\n                    lst.Add(weakRefDp);\n\n                    itemRegistered = true;\n                }\n            }\n\n            // return the status of the registration\n            return itemRegistered;\n        }\n\n        /// <summary>\n        /// This method cleans up all independent (!<see cref=\"WeakReference\"/>.IsAlive) objects.\n        /// </summary>\n        public static void CleanUp()\n        {\n            // call the overloaded method\n            CleanUp(null);\n        }\n\n        /// <summary>\n        /// This method cleans up all independent (!<see cref=\"WeakReference\"/>.IsAlive) objects or a single object.\n        /// </summary>\n        /// <param name=\"objToRemove\">\n        /// If defined, the associated object dependency will be removed instead of a full CleanUp\n        /// </param>\n        [MethodImpl(MethodImplOptions.Synchronized)]\n        public static void CleanUp(object objToRemove)\n        {\n            // if a particular object is passed, remove it.\n            if (objToRemove != null)\n            {\n                // if the key wasnt found, throw an exception.\n                if (!InternalList.Remove(objToRemove))\n                {\n                    throw new Exception(\"Key was not found!\");\n                }\n\n                // stop here\n                return;\n            }\n\n            // perform an full clean up\n\n            // this list will hold all keys they has to be removed\n            List<object> keysToRemove = new List<object>();\n\n            // step through all object dependenies\n            foreach (KeyValuePair<object, List<WeakReference>> kvp in InternalList)\n            {\n                // step recursive through all weak references\n                for (int i = kvp.Value.Count - 1; i >= 0; i--)\n                {\n                    // if this weak reference is no more alive, remove it\n                    var targetReference = kvp.Value[i].Target;\n                    if (targetReference == null)\n                    {\n                        kvp.Value.RemoveAt(i);\n                    }\n                }\n\n                // if the list of weak references is empty, temove the whole entry\n                if (kvp.Value.Count == 0)\n                {\n                    keysToRemove.Add(kvp.Key);\n                }\n            }\n\n            // step recursive through all keys that have to be remove\n            for (int i = keysToRemove.Count - 1; i >= 0; i--)\n            {\n                // remove the key from the internalList\n                InternalList.Remove(keysToRemove[i]);\n            }\n\n            // clear up the keysToRemove\n            keysToRemove.Clear();\n        }\n    }\n}"
  },
  {
    "path": "src/Engine/ParentNotifiers.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"ParentChangedNotifierHelper.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Bernhard Millauer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Engine\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Windows;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <summary>\n    /// A memory safe dictionary storage for <see cref=\"ParentChangedNotifier\"/> instances.\n    /// </summary>\n    public class ParentNotifiers\n    {\n        readonly Dictionary<WeakReference<DependencyObject>, ParentChangedNotifier> _inner =\n            new Dictionary<WeakReference<DependencyObject>, ParentChangedNotifier>();\n\n        /// <summary>\n        /// Check, if it contains the key.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>True, if the key exists.</returns>\n        public bool ContainsKey(DependencyObject target)\n        {\n            return _inner.Keys.Any(x => x.TryGetTarget(out var item) && ReferenceEquals(item, target));\n        }\n\n        /// <summary>\n        /// Removes the entry.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        public void Remove(DependencyObject target)\n        {\n            if (_inner.Count == 0)\n                return;\n\n            var deadItems = new List<KeyValuePair<WeakReference<DependencyObject>, ParentChangedNotifier>>();\n\n            foreach (var item in _inner)\n            {\n                // If we can't get target (== target is dead) or this is the item which we have to remove - add it to the collection for removing.\n                if (!item.Key.TryGetTarget(out var itemTarget) || ReferenceEquals(itemTarget, target))\n                {\n                    deadItems.Add(item);\n                }\n            }\n\n            foreach (var deadItem in deadItems)\n            {\n                deadItem.Value?.Dispose();\n                _inner.Remove(deadItem.Key);\n            }\n        }\n\n        /// <summary>\n        /// Adds the key-value-pair.\n        /// </summary>\n        /// <param name=\"target\">The target key object.</param>\n        /// <param name=\"parentChangedNotifier\">The notifier.</param>\n        public void Add(DependencyObject target, ParentChangedNotifier parentChangedNotifier)\n        {\n            _inner.Add(new WeakReference<DependencyObject>(target), parentChangedNotifier);\n        }\n    }\n}"
  },
  {
    "path": "src/Engine/SafeTargetInfo.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"SafeTargetInfo.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Engine\n{\n    #region Usings\n    using System;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <summary>\n    /// An extension to the <see cref=\"T:XAMLMarkupExtensions.Base.TargetInfo\" /> class with WeakReference instead of direct object linking.\n    /// </summary>\n    public class SafeTargetInfo : TargetInfo\n    {\n        /// <summary>\n        /// Gets the target object reference.\n        /// </summary>\n        public WeakReference TargetObjectReference { get; }\n\n        /// <summary>\n        /// Creates a new TargetInfo instance.\n        /// </summary>\n        /// <param name=\"targetObject\">The target object.</param>\n        /// <param name=\"targetProperty\">The target property.</param>\n        /// <param name=\"targetPropertyType\">The target property type.</param>\n        /// <param name=\"targetPropertyIndex\">The target property index.</param>\n        public SafeTargetInfo(object targetObject, object targetProperty, Type targetPropertyType, int targetPropertyIndex)\n            : base(null, targetProperty, targetPropertyType, targetPropertyIndex)\n        {\n            TargetObjectReference = new WeakReference(targetObject);\n        }\n\n        /// <summary>\n        /// Creates a new <see cref=\"SafeTargetInfo\"/> based on a <see cref=\"XAMLMarkupExtensions.Base.TargetInfo\"/> template.\n        /// </summary>\n        /// <param name=\"targetInfo\">The target information.</param>\n        /// <returns>A new instance with safe references.</returns>\n        public static SafeTargetInfo FromTargetInfo(TargetInfo targetInfo)\n        {\n            return new SafeTargetInfo(targetInfo.TargetObject, targetInfo.TargetProperty, targetInfo.TargetPropertyType, targetInfo.TargetPropertyIndex);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Engine/WeakReference.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"ParentChangedNotifierHelper.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Bernhard Millauer</author>\n#endregion\n\n#if NET35 || NET40\nnamespace WPFLocalizeExtension.Engine\n{\n#region Usings\n    using System;\n    using System.Runtime.Serialization;\n#endregion\n\n    /// <summary>\n    /// This class implements an wrapper for .NET35, because this is starting from NET45 of <see cref=\"WeakReference\"/>.\n    /// </summary>\n    /// <typeparam name=\"T\">The reference type.</typeparam>\n    public class WeakReference<T> : WeakReference\n    {\n        /// <summary>\n        /// Creates a new instance.\n        /// </summary>\n        /// <param name=\"target\">The target.</param>\n\t\tpublic WeakReference(T target) : base(target)\n        {\n        }\n\n        /// <summary>\n        /// Creates a new instance.\n        /// </summary>\n        /// <param name=\"target\">The target.</param>\n        /// <param name=\"trackResurrection\">The track resurrection flag.</param>\n        public WeakReference(T target, bool trackResurrection)\n            : base(target, trackResurrection)\n        {\n        }\n\n        /// <summary>\n        /// Creates a new instance.\n        /// </summary>\n        /// <param name=\"info\">The serialization info.</param>\n        /// <param name=\"context\">The streaming context.</param>\n        protected WeakReference(SerializationInfo info, StreamingContext context)\n            : base(info, context)\n        {\n        }\n\n        /// <summary>\n        /// Tries to retrieve the target object that is referenced by the current WeakReference&lt;T&gt; object.\n        /// </summary>\n        /// <param name=\"target\">The target.</param>\n        /// <returns>true if the target was retrieved; otherwise, false.</returns>\n        public bool TryGetTarget(out T target)\n        {\n            var baseTarget = base.Target;\n            if (baseTarget != null)\n            {\n                target = (T)baseTarget;\n                return true;\n            }\n            target = default;\n            return false;\n        }\n\n        // / <summary>\n        // / Gets or sets the target.\n        // / </summary>\n        //public new T Target\n        //{\n        //    get\n        //    {\n        //        var baseTarget = base.Target;\n        //        if (IsAlive && baseTarget != null)\n        //        {\n        //            return (T)base.Target;\n        //        }\n        //        return default(T);\n        //    }\n        //    set { base.Target = value; }\n        //}\n    }\n}\n#endif\n"
  },
  {
    "path": "src/Extensions/BLoc.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"BLoc.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Bernhard Millauer</author>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Extensions\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel;\n    using System.Globalization;\n    using System.Windows;\n    using System.Windows.Data;\n    using WPFLocalizeExtension.Engine;\n    #endregion\n\n    /// <summary>\n    /// A localization extension based on <see cref=\"Binding\"/>.\n    /// </summary>\n    public class BLoc : Binding, INotifyPropertyChanged, IDictionaryEventListener, IDisposable\n    {\n        #region PropertyChanged Logic\n        /// <summary>\n        /// Informiert über sich ändernde Eigenschaften.\n        /// </summary>\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        /// <summary>\n        /// Notify that a property has changed\n        /// </summary>\n        /// <param name=\"property\">\n        /// The property that changed\n        /// </param>\n        internal void RaisePropertyChanged(string property)\n        {\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));\n        }\n        #endregion\n\n        #region Variables & Properties\n        private static readonly object ResourceBufferLock = new object();\n        private static Dictionary<string, object> _resourceBuffer = new Dictionary<string, object>();\n\n        private object _value;\n        /// <summary>\n        /// The value, the internal binding is pointing at.\n        /// </summary>\n        public object Value\n        {\n            get => _value;\n            set\n            {\n                if (_value != value)\n                {\n                    _value = value;\n                    RaisePropertyChanged(nameof(Value));\n                }\n            }\n        }\n\n        private string _key;\n        /// <summary>\n        /// Gets or sets the Key to a .resx object\n        /// </summary>\n        public string Key\n        {\n            get => _key;\n            set\n            {\n                if (_key != value)\n                {\n                    _key = value;\n                    UpdateNewValue();\n                    RaisePropertyChanged(nameof(Key));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the culture to force a fixed localized object\n        /// </summary>\n        public string ForceCulture { get; set; }\n        #endregion\n\n        #region Resource buffer handling.\n        /// <summary>\n        /// Clears the common resource buffer.\n        /// </summary>\n        public static void ClearResourceBuffer()\n        {\n            lock (ResourceBufferLock)\n            {\n                _resourceBuffer?.Clear();\n                _resourceBuffer = null;\n            }\n        }\n\n        /// <summary>\n        /// Adds an item to the resource buffer (threadsafe).\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"item\">The item.</param>\n        internal static void SafeAddItemToResourceBuffer(string key, object item)\n        {\n            lock (ResourceBufferLock)\n            {\n                if (!LocalizeDictionary.Instance.DisableCache && !_resourceBuffer.ContainsKey(key))\n                    _resourceBuffer.Add(key, item);\n            }\n        }\n\n        /// <summary>\n        /// Removes an item from the resource buffer (threadsafe).\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        internal static void SafeRemoveItemFromResourceBuffer(string key)\n        {\n            lock (ResourceBufferLock)\n            {\n                if (_resourceBuffer.ContainsKey(key))\n                    _resourceBuffer.Remove(key);\n            }\n        }\n        #endregion\n\n        #region Block some Binding Parameters\n        /// <inheritdoc/>\n        [EditorBrowsable(EditorBrowsableState.Never)]\n        public new PropertyPath Path\n        {\n            get { return null; }\n            set\n            {\n                throw new Exception(nameof(Path) + \" not allowed for BLoc\");\n            }\n        }\n\n        /// <inheritdoc/>\n        [EditorBrowsable(EditorBrowsableState.Never)]\n        public new object Source\n        {\n            get => null;\n            set => throw new Exception(nameof(Source) + \" not allowed for BLoc\");\n        }\n\n        /// <inheritdoc/>\n        [EditorBrowsable(EditorBrowsableState.Never)]\n        public new RelativeSource RelativeSource\n        {\n            get => null;\n            set => throw new Exception(nameof(RelativeSource) + \" not allowed for BLoc\");\n        }\n\n        /// <inheritdoc/>\n        [EditorBrowsable(EditorBrowsableState.Never)]\n        public new string ElementName\n        {\n            get => null;\n            set => throw new Exception(nameof(ElementName) + \" not allowed for BLoc\");\n        }\n\n        /// <inheritdoc/>\n        [EditorBrowsable(EditorBrowsableState.Never)]\n        public new BindingMode Mode\n        {\n            get => BindingMode.Default;\n            set => throw new Exception(nameof(Mode) + \" not allowed for BLoc\");\n        }\n\n        /// <inheritdoc/>\n        [EditorBrowsable(EditorBrowsableState.Never)]\n        public new string XPath\n        {\n            get => null;\n            set => throw new Exception(nameof(XPath) + \" not allowed for BLoc\");\n        }\n        #endregion\n\n        #region Constructors & Dispose\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BLoc\"/> class.\n        /// </summary>\n        public BLoc()\n        {\n            LocalizeDictionary.DictionaryEvent.AddListener(this);\n            base.Path = new PropertyPath(\"Value\");\n            base.Source = this;\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BLoc\"/> class.\n        /// </summary>\n        /// <param name=\"key\">The resource identifier.</param>\n        public BLoc(string key)\n            : this()\n        {\n            Key = key;\n        }\n\n        /// <summary>\n        /// Removes the listener from the dictionary.\n        /// </summary>\n        public void Dispose()\n        {\n            LocalizeDictionary.DictionaryEvent.RemoveListener(this);\n        }\n\n        /// <summary>\n        /// The finalizer.\n        /// </summary>\n        ~BLoc()\n        {\n            Dispose();\n        }\n        #endregion\n\n        #region Forced culture handling\n        /// <summary>\n        /// If Culture property defines a valid <see cref=\"CultureInfo\"/>, a <see cref=\"CultureInfo\"/> instance will get\n        /// created and returned, otherwise <see cref=\"LocalizeDictionary\"/>.Culture will get returned.\n        /// </summary>\n        /// <returns>The <see cref=\"CultureInfo\"/></returns>\n        /// <exception cref=\"System.ArgumentException\">\n        /// thrown if the parameter Culture don't defines a valid <see cref=\"CultureInfo\"/>\n        /// </exception>\n        protected CultureInfo GetForcedCultureOrDefault()\n        {\n            // define a culture info\n            CultureInfo cultureInfo;\n\n            // check if the forced culture is not null or empty\n            if (!string.IsNullOrEmpty(ForceCulture))\n            {\n                // try to create a valid cultureinfo, if defined\n                try\n                {\n                    // try to create a specific culture from the forced one\n                    // cultureInfo = CultureInfo.CreateSpecificCulture(this.ForceCulture);\n                    cultureInfo = new CultureInfo(ForceCulture);\n                }\n                catch (ArgumentException ex)\n                {\n                    // on error, check if designmode is on\n                    if (LocalizeDictionary.Instance.GetIsInDesignMode())\n                    {\n                        // cultureInfo will be set to the current specific culture\n                        cultureInfo = LocalizeDictionary.Instance.SpecificCulture;\n                    }\n                    else\n                    {\n                        // tell the customer, that the forced culture cannot be converted propperly\n                        throw new ArgumentException(\"Cannot create a CultureInfo with '\" + ForceCulture + \"'\", ex);\n                    }\n                }\n            }\n            else\n            {\n                // take the current specific culture\n                cultureInfo = LocalizeDictionary.Instance.SpecificCulture;\n            }\n\n            // return the evaluated culture info\n            return cultureInfo;\n        }\n        #endregion\n\n        /// <summary>\n        /// This method is called when the resource somehow changed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The event arguments.</param>\n        public void ResourceChanged(DependencyObject sender, DictionaryEventArgs e)\n        {\n            UpdateNewValue();\n        }\n\n        private void UpdateNewValue()\n        {\n            Value = FormatOutput();\n        }\n\n        #region Future TargetMarkupExtension implementation\n        /// <summary>\n        /// This function returns the properly prepared output of the markup extension.\n        /// </summary>\n        public object FormatOutput()\n        {\n            object result = null;\n\n            // Try to get the localized input from the resource.\n            string resourceKey = LocalizeDictionary.Instance.GetFullyQualifiedResourceKey(Key, null);\n\n            var ci = GetForcedCultureOrDefault();\n\n            var key = ci.Name + \":\";\n\n            // Check, if the key is already in our resource buffer.\n            lock (ResourceBufferLock)\n            {\n                if (_resourceBuffer.ContainsKey(key + resourceKey))\n                    result = _resourceBuffer[key + resourceKey];\n            }\n\n            if (result == null)\n            {\n                result = LocalizeDictionary.Instance.GetLocalizedObject(resourceKey, null, ci);\n\n                if (result == null)\n                {\n                    var missingKeyEventResult = LocalizeDictionary.Instance.OnNewMissingKeyEvent(this, resourceKey);\n\n                    if (missingKeyEventResult.Reload)\n                        UpdateNewValue();\n\n                    if (LocalizeDictionary.Instance.OutputMissingKeys\n                        && !string.IsNullOrEmpty(_key))\n                    {\n                        if (missingKeyEventResult.MissingKeyResult != null)\n                            result = missingKeyEventResult.MissingKeyResult;\n                        else\n                            result = \"Key: \" + _key;\n                    }\n                }\n                else\n                {\n                    key += resourceKey;\n                    SafeAddItemToResourceBuffer(key, result);\n                }\n            }\n\n            return result;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Extensions/FELoc.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"FELoc.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Bernhard Millauer</author>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Extensions\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel;\n    using System.Globalization;\n    using System.Reflection;\n    using System.Windows;\n    using System.Windows.Data;\n    using System.Windows.Markup.Primitives;\n    using System.Windows.Media;\n    using System.Windows.Media.Imaging;\n    using WPFLocalizeExtension.Engine;\n    using WPFLocalizeExtension.TypeConverters;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <summary>\n    /// A localization utility based on <see cref=\"FrameworkElement\"/>.\n    /// </summary>\n    public class FELoc : FrameworkElement, IDictionaryEventListener, INotifyPropertyChanged, IDisposable\n    {\n        #region PropertyChanged Logic\n        /// <summary>\n        /// Informiert über sich ändernde Eigenschaften.\n        /// </summary>\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        /// <summary>\n        /// Notify that a property has changed\n        /// </summary>\n        /// <param name=\"property\">\n        /// The property that changed\n        /// </param>\n        internal void RaisePropertyChanged(string property)\n        {\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));\n        }\n        #endregion\n\n        #region Private variables\n        private static readonly object ResourceBufferLock = new object();\n        private static Dictionary<string, object> _resourceBuffer = new Dictionary<string, object>();\n\n        private ParentChangedNotifier _parentChangedNotifier;\n        private TargetInfo _targetInfo;\n        #endregion\n\n        #region Resource buffer handling.\n        /// <summary>\n        /// Clears the common resource buffer.\n        /// </summary>\n        public static void ClearResourceBuffer()\n        {\n            lock (ResourceBufferLock)\n            {\n                _resourceBuffer?.Clear();\n                _resourceBuffer = null;\n            }\n        }\n\n        /// <summary>\n        /// Adds an item to the resource buffer (threadsafe).\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"item\">The item.</param>\n        internal static void SafeAddItemToResourceBuffer(string key, object item)\n        {\n            lock (ResourceBufferLock)\n            {\n                if (!LocalizeDictionary.Instance.DisableCache && !_resourceBuffer.ContainsKey(key))\n                    _resourceBuffer.Add(key, item);\n            }\n        }\n\n        /// <summary>\n        /// Removes an item from the resource buffer (threadsafe).\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        internal static void SafeRemoveItemFromResourceBuffer(string key)\n        {\n            lock (ResourceBufferLock)\n            {\n                if (_resourceBuffer.ContainsKey(key))\n                    _resourceBuffer.Remove(key);\n            }\n        }\n        #endregion\n\n        #region DependencyProperty: Key\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> Key to set the resource key.\n        /// </summary>\n        public static readonly DependencyProperty KeyProperty =\n                DependencyProperty.Register(\n                \"Key\",\n                typeof(string),\n                typeof(FELoc),\n                new PropertyMetadata(null, DependencyPropertyChanged));\n\n        /// <summary>\n        /// The resource key.\n        /// </summary>\n        public string Key\n        {\n            get => this.GetValueSync<string>(KeyProperty);\n            set => this.SetValueSync(KeyProperty, value);\n        }\n        #endregion\n\n        #region DependencyProperty: Converter\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> Converter to set the <see cref=\"IValueConverter\"/> used to adapt to the target.\n        /// </summary>\n        public static readonly DependencyProperty ConverterProperty =\n                DependencyProperty.Register(\n                \"Converter\",\n                typeof(IValueConverter),\n                typeof(FELoc),\n                new PropertyMetadata(new DefaultConverter(), DependencyPropertyChanged));\n\n        /// <summary>\n        /// Gets or sets the custom value converter.\n        /// </summary>\n        public IValueConverter Converter\n        {\n            get => this.GetValueSync<IValueConverter>(ConverterProperty);\n            set => this.SetValueSync(ConverterProperty, value);\n        }\n        #endregion\n\n        #region DependencyProperty: ConverterParameter\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> ConverterParameter.\n        /// </summary>\n        public static readonly DependencyProperty ConverterParameterProperty =\n                DependencyProperty.Register(\n                \"ConverterParameter\",\n                typeof(object),\n                typeof(FELoc),\n                new PropertyMetadata(null, DependencyPropertyChanged));\n\n        /// <summary>\n        /// Gets or sets the converter parameter.\n        /// </summary>\n        public object ConverterParameter\n        {\n            get => this.GetValueSync<object>(ConverterParameterProperty);\n            set => this.SetValueSync(ConverterParameterProperty, value);\n        }\n        #endregion\n\n        #region DependencyProperty: ForceCulture\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> ForceCulture.\n        /// </summary>\n        public static readonly DependencyProperty ForceCultureProperty =\n                DependencyProperty.Register(\n                \"ForceCulture\",\n                typeof(string),\n                typeof(FELoc),\n                new PropertyMetadata(null, DependencyPropertyChanged));\n\n        /// <summary>\n        /// Gets or sets the forced culture.\n        /// </summary>\n        public string ForceCulture\n        {\n            get => this.GetValueSync<string>(ForceCultureProperty);\n            set => this.SetValueSync(ForceCultureProperty, value);\n        }\n        #endregion\n\n        #region DependencyProperty: Content - used for value transfer only!\n        ///// <summary>\n        ///// <see cref=\"DependencyProperty\"/> ForceCulture.\n        ///// </summary>\n        //public static readonly DependencyProperty ContentProperty =\n        //        DependencyProperty.Register(\n        //        \"Content\",\n        //        typeof(object),\n        //        typeof(FELoc));\n\n        ///// <summary>\n        ///// Gets or sets the content.\n        ///// </summary>\n        //public object Content\n        //{\n        //    get { return GetValue(ContentProperty); }\n        //    set { SetValue(ContentProperty, value); }\n        //}\n\n        private object _content;\n        /// <summary>\n        /// Gets or sets the content.\n        /// </summary>\n        public object Content\n        {\n            get => _content;\n            set\n            {\n                if (_content != value)\n                {\n                    _content = value;\n                    RaisePropertyChanged(nameof(Content));\n                }\n            }\n        }\n        #endregion\n\n        /// <summary>\n        /// Indicates, that the key changed.\n        /// </summary>\n        /// <param name=\"obj\">The FELoc object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        private static void DependencyPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            if (obj is FELoc loc)\n                loc.UpdateNewValue();\n        }\n\n        #region Parent changed event\n        /// <summary>\n        /// Based on http://social.msdn.microsoft.com/Forums/en/wpf/thread/580234cb-e870-4af1-9a91-3e3ba118c89c\n        /// </summary>\n        /// <param name=\"element\">The target object.</param>\n        /// <returns>The list of DependencyProperties of the object.</returns>\n        private IEnumerable<DependencyProperty> GetDependencyProperties(object element)\n        {\n            var properties = new List<DependencyProperty>();\n            var markupObject = MarkupWriter.GetMarkupObjectFor(element);\n\n            foreach (var mp in markupObject.Properties)\n                if (mp.DependencyProperty != null)\n                    properties.Add(mp.DependencyProperty);\n\n            return properties;\n        }\n\n        private void RegisterParentNotifier()\n        {\n            _parentChangedNotifier = new ParentChangedNotifier(this, () =>\n            {\n                _parentChangedNotifier.Dispose();\n                _parentChangedNotifier = null;\n                var targetObject = Parent;\n                if (targetObject != null)\n                {\n                    var properties = GetDependencyProperties(targetObject);\n                    foreach (var p in properties)\n                    {\n                        if (targetObject.GetValue(p) == this)\n                        {\n                            _targetInfo = new TargetInfo(targetObject, p, p.PropertyType, -1);\n\n                            var binding = new Binding(\"Content\")\n                            {\n                                Source = this,\n                                Converter = Converter,\n                                ConverterParameter = ConverterParameter,\n                                Mode = BindingMode.OneWay\n                            };\n\n                            BindingOperations.SetBinding(targetObject, p, binding);\n                            UpdateNewValue();\n                        }\n                    }\n                }\n            });\n        }\n        #endregion\n\n        #region Constructors & Dispose\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BLoc\"/> class.\n        /// </summary>\n        public FELoc()\n        {\n            LocalizeDictionary.DictionaryEvent.AddListener(this);\n            RegisterParentNotifier();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BLoc\"/> class.\n        /// </summary>\n        /// <param name=\"key\">The resource identifier.</param>\n        public FELoc(string key)\n            : this()\n        {\n            Key = key;\n        }\n\n        /// <summary>\n        /// Removes the listener from the dictionary.\n        /// </summary>\n        public void Dispose()\n        {\n            LocalizeDictionary.DictionaryEvent.RemoveListener(this);\n        }\n\n        /// <summary>\n        /// The finalizer.\n        /// </summary>\n        ~FELoc()\n        {\n            Dispose();\n        }\n        #endregion\n\n        #region Forced culture handling\n        /// <summary>\n        /// If Culture property defines a valid <see cref=\"CultureInfo\"/>, a <see cref=\"CultureInfo\"/> instance will get\n        /// created and returned, otherwise <see cref=\"LocalizeDictionary\"/>.Culture will get returned.\n        /// </summary>\n        /// <returns>The <see cref=\"CultureInfo\"/></returns>\n        /// <exception cref=\"System.ArgumentException\">\n        /// thrown if the parameter Culture don't defines a valid <see cref=\"CultureInfo\"/>\n        /// </exception>\n        protected CultureInfo GetForcedCultureOrDefault()\n        {\n            // define a culture info\n            CultureInfo cultureInfo;\n\n            // check if the forced culture is not null or empty\n            if (!string.IsNullOrEmpty(ForceCulture))\n            {\n                // try to create a valid cultureinfo, if defined\n                try\n                {\n                    // try to create a specific culture from the forced one\n                    // cultureInfo = CultureInfo.CreateSpecificCulture(this.ForceCulture);\n                    cultureInfo = new CultureInfo(ForceCulture);\n                }\n                catch (ArgumentException ex)\n                {\n                    // on error, check if designmode is on\n                    if (LocalizeDictionary.Instance.GetIsInDesignMode())\n                    {\n                        // cultureInfo will be set to the current specific culture\n                        cultureInfo = LocalizeDictionary.Instance.SpecificCulture;\n                    }\n                    else\n                    {\n                        // tell the customer, that the forced culture cannot be converted propperly\n                        throw new ArgumentException(\"Cannot create a CultureInfo with '\" + ForceCulture + \"'\", ex);\n                    }\n                }\n            }\n            else\n            {\n                // take the current specific culture\n                cultureInfo = LocalizeDictionary.Instance.SpecificCulture;\n            }\n\n            // return the evaluated culture info\n            return cultureInfo;\n        }\n        #endregion\n\n        /// <summary>\n        /// This method is called when the resource somehow changed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The event arguments.</param>\n        public void ResourceChanged(DependencyObject sender, DictionaryEventArgs e)\n        {\n            UpdateNewValue();\n        }\n\n        private void UpdateNewValue()\n        {\n            Content = FormatOutput();\n        }\n\n        #region Resource loopkup\n        /// <summary>\n        /// This function returns the properly prepared output of the markup extension.\n        /// </summary>\n        public object FormatOutput()\n        {\n            object result = null;\n\n            if (_targetInfo == null)\n                return null;\n\n            var targetObject = _targetInfo.TargetObject as DependencyObject;\n\n            // Get target type. Change ImageSource to BitmapSource in order to use our own converter.\n            var targetType = _targetInfo.TargetPropertyType;\n\n            if (targetType == typeof(ImageSource))\n                targetType = typeof(BitmapSource);\n\n            // Try to get the localized input from the resource.\n            string resourceKey = LocalizeDictionary.Instance.GetFullyQualifiedResourceKey(Key, targetObject);\n\n            var ci = GetForcedCultureOrDefault();\n\n            // Extract the names of the endpoint object and property\n            var epName = \"\";\n            var epProp = \"\";\n\n            if (targetObject is FrameworkElement element)\n                epName = element.GetValueSync<string>(NameProperty);\n            else if (targetObject is FrameworkContentElement)\n                epName = ((FrameworkContentElement)targetObject).GetValueSync<string>(FrameworkContentElement.NameProperty);\n\n            if (_targetInfo.TargetProperty is PropertyInfo info)\n                epProp = info.Name;\n            else if (_targetInfo.TargetProperty is DependencyProperty)\n                epProp = ((DependencyProperty)_targetInfo.TargetProperty).Name;\n\n            // What are these names during design time good for? Any suggestions?\n            if (epProp.Contains(\"FrameworkElementWidth5\"))\n                epProp = \"Height\";\n            else if (epProp.Contains(\"FrameworkElementWidth6\"))\n                epProp = \"Width\";\n            else if (epProp.Contains(\"FrameworkElementMargin12\"))\n                epProp = \"Margin\";\n\n            var resKeyBase = ci.Name + \":\" + targetType.Name + \":\";\n            string resKeyNameProp = LocalizeDictionary.Instance.GetFullyQualifiedResourceKey(epName + LocalizeDictionary.GetSeparation(targetObject) + epProp, targetObject);\n            string resKeyName = LocalizeDictionary.Instance.GetFullyQualifiedResourceKey(epName, targetObject);\n\n            // Check, if the key is already in our resource buffer.\n            object input = null;\n\n            if (!string.IsNullOrEmpty(resourceKey))\n            {\n                // We've got a resource key. Try to look it up or get it from the dictionary.\n                lock (ResourceBufferLock)\n                {\n                    if (_resourceBuffer.ContainsKey(resKeyBase + resourceKey))\n                        result = _resourceBuffer[resKeyBase + resourceKey];\n                    else\n                    {\n                        input = LocalizeDictionary.Instance.GetLocalizedObject(resourceKey, targetObject, ci);\n                        resKeyBase += resourceKey;\n                    }\n                }\n            }\n            else\n            {\n                // Try the automatic lookup function.\n                // First, look for a resource entry named: [FrameworkElement name][Separator][Property name]\n                lock (ResourceBufferLock)\n                {\n                    if (_resourceBuffer.ContainsKey(resKeyBase + resKeyNameProp))\n                        result = _resourceBuffer[resKeyBase + resKeyNameProp];\n                    else\n                    {\n                        // It was not stored in the buffer - try to retrieve it from the dictionary.\n                        input = LocalizeDictionary.Instance.GetLocalizedObject(resKeyNameProp, targetObject, ci);\n\n                        if (input == null)\n                        {\n                            // Now, try to look for a resource entry named: [FrameworkElement name]\n                            // Note - this has to be nested here, as it would take precedence over the first step in the buffer lookup step.\n                            if (_resourceBuffer.ContainsKey(resKeyBase + resKeyName))\n                                result = _resourceBuffer[resKeyBase + resKeyName];\n                            else\n                            {\n                                input = LocalizeDictionary.Instance.GetLocalizedObject(resKeyName, targetObject, ci);\n                                resKeyBase += resKeyName;\n                            }\n                        }\n                        else\n                            resKeyBase += resKeyNameProp;\n                    }\n                }\n            }\n\n            // If no result was found, convert the input and add it to the buffer.\n            if (result == null && input != null)\n            {\n                result = Converter.Convert(input, targetType, ConverterParameter, ci);\n                SafeAddItemToResourceBuffer(resKeyBase, result);\n            }\n\n            return result;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Extensions/LocExtension.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"LocExtension.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Bernhard Millauer</author>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Extensions\n{\n    #region Usings\n    using System;\n    using System.Collections;\n    using System.Collections.Generic;\n    using System.ComponentModel;\n    using System.Data.SqlTypes;\n    using System.Globalization;\n    using System.Linq;\n    using System.Reflection;\n    using System.Windows;\n    using System.Windows.Data;\n    using System.Windows.Markup;\n    using System.Windows.Media;\n    using System.Windows.Media.Imaging;\n    using System.Windows.Media.Media3D;\n    using WPFLocalizeExtension.Engine;\n    using WPFLocalizeExtension.Providers;\n    using WPFLocalizeExtension.TypeConverters;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <summary>\n    /// A generic localization extension.\n    /// </summary>\n    [ContentProperty(\"ResourceIdentifierKey\")]\n    public class LocExtension : NestedMarkupExtension, INotifyPropertyChanged, IDictionaryEventListener, IDisposable\n    {\n        #region PropertyChanged Logic\n        /// <summary>\n        /// Informiert über sich ändernde Eigenschaften.\n        /// </summary>\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        /// <summary>\n        /// Notify that a property has changed\n        /// </summary>\n        /// <param name=\"property\">\n        /// The property that changed\n        /// </param>\n        internal void OnNotifyPropertyChanged(string property)\n        {\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));\n        }\n        #endregion\n\n        #region Variables\n        private static readonly object ResourceBufferLock = new object();\n        private static readonly object ResolveLock = new object();\n\n        private static Dictionary<string, object> _resourceBuffer = new Dictionary<string, object>();\n\n        /// <summary>\n        /// Holds the Key to a .resx object\n        /// </summary>\n        private string _key;\n\n        /// <summary>\n        /// Holds the Binding to get the key\n        /// </summary>\n        private Binding _binding;\n\n        /// <summary>\n        /// the Name of the cached dynamic generated DependencyProperties\n        /// </summary>\n        private string cacheDPName = null;\n\n        /// <summary>\n        /// Cached DependencyProperty for this object\n        /// </summary>\n        private DependencyProperty cacheDPThis;\n\n        /// <summary>\n        /// Cached DependencyProperty for key string\n        /// </summary>\n        private DependencyProperty cacheDPKey;\n\n        /// <summary>\n        /// A custom converter, supplied in the XAML code.\n        /// </summary>\n        private IValueConverter _converter;\n\n        /// <summary>\n        /// A parameter that can be supplied along with the converter object.\n        /// </summary>\n        private object _converterParameter;\n\n        /// <summary>\n        /// The last endpoint that was used for this extension.\n        /// </summary>\n        private SafeTargetInfo _lastEndpoint;\n        #endregion\n\n        #region Resource buffer handling.\n        /// <summary>\n        /// Clears the common resource buffer.\n        /// </summary>\n        public static void ClearResourceBuffer()\n        {\n            lock (ResourceBufferLock)\n            {\n                _resourceBuffer?.Clear();\n                _resourceBuffer = null;\n            }\n        }\n\n        /// <summary>\n        /// Adds an item to the resource buffer (threadsafe).\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"item\">The item.</param>\n        internal static void SafeAddItemToResourceBuffer(string key, object item)\n        {\n            lock (ResourceBufferLock)\n            {\n                if (!LocalizeDictionary.Instance.DisableCache && !_resourceBuffer.ContainsKey(key))\n                    _resourceBuffer.Add(key, item);\n            }\n        }\n\n        /// <summary>\n        /// Removes an item from the resource buffer (threadsafe).\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        internal static void SafeRemoveItemFromResourceBuffer(string key)\n        {\n            lock (ResourceBufferLock)\n            {\n                if (_resourceBuffer.ContainsKey(key))\n                    _resourceBuffer.Remove(key);\n            }\n        }\n        #endregion\n\n        #region GetBoundExtension\n        /// <summary>\n        /// Gets the extension that is bound to a given target. Please note, that only the last endpoint of each extension can be evaluated.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"property\">The target property name.</param>\n        /// <param name=\"propertyIndex\">The index in the property (if applicable).</param>\n        /// <returns>The bound extension or null, if not available.</returns>\n        public static LocExtension GetBoundExtension(object target, string property, int propertyIndex = -1)\n        {\n            foreach (var ext in LocalizeDictionary.DictionaryEvent.EnumerateListeners<LocExtension>())\n            {\n                var ep = ext._lastEndpoint;\n\n                if (ep.TargetObjectReference.Target == null)\n                    continue;\n\n                var epProp = GetPropertyName(ep.TargetProperty);\n\n                if (ep.TargetObjectReference.Target == target &&\n                    epProp == property &&\n                    ep.TargetPropertyIndex == propertyIndex)\n                    return ext;\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// Get the name of a property (regular or DependencyProperty).\n        /// </summary>\n        /// <param name=\"property\">The property object.</param>\n        /// <returns>The name of the property.</returns>\n        private static string GetPropertyName(object property)\n        {\n            var epProp = \"\";\n\n            if (property is PropertyInfo info)\n                epProp = info.Name;\n            else if (property is DependencyProperty)\n            {\n                epProp = ((DependencyProperty)property).Name;\n            }\n\n            // What are these names during design time good for? Any suggestions?\n            if (epProp.Contains(\"FrameworkElementWidth5\"))\n                epProp = \"Height\";\n            else if (epProp.Contains(\"FrameworkElementWidth6\"))\n                epProp = \"Width\";\n            else if (epProp.Contains(\"FrameworkElementMargin12\"))\n                epProp = \"Margin\";\n\n            return epProp;\n        }\n        #endregion\n\n        #region Properties\n        /// <summary>\n        /// Gets or sets the Key to a .resx object\n        /// </summary>\n        public string Key\n        {\n            get => _key;\n            set\n            {\n                if (_key != value)\n                {\n                    _key = value;\n                    UpdateNewValue();\n\n                    OnNotifyPropertyChanged(nameof(Key));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the custom value converter.\n        /// </summary>\n        public IValueConverter Converter\n        {\n            get\n            {\n                if (_converter == null)\n                    _converter = new DefaultConverter();\n\n                return _converter;\n            }\n            set => _converter = value;\n        }\n\n        /// <summary>\n        /// Gets or sets the converter parameter.\n        /// </summary>\n        public object ConverterParameter\n        {\n            get => _converterParameter;\n            set => _converterParameter = value;\n        }\n\n        /// <summary>\n        /// Gets or sets the culture to force a fixed localized object\n        /// </summary>\n        public string ForceCulture { get; set; }\n\n        /// <summary>\n        /// Gets or sets the initialize value.\n        /// This is ONLY used to support the localize extension in blend!\n        /// </summary>\n        /// <value>The initialize value.</value>\n        [EditorBrowsable(EditorBrowsableState.Never)]\n        [ConstructorArgument(\"key\")]\n        public object InitializeValue { get; set; }\n\n        /// <summary>\n        /// Gets or sets the Key that identifies a resource (Assembly:Dictionary:Key)\n        /// </summary>\n        [EditorBrowsable(EditorBrowsableState.Never)]\n        public object ResourceIdentifierKey\n        {\n            get => _key ?? \"(null)\";\n            set => _key = value.ToString();\n        }\n        \n        /// <summary>\n        /// Behavior when key is not found at the localization provider.\n        /// </summary>\n        public FallbackBehavior FallbackBehavior { get; set; }\n        \n        #endregion\n\n        #region Constructors\n        \n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"LocExtension\"/> class.\n        /// </summary>\n        public LocExtension()\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"LocExtension\"/> class.\n        /// </summary>\n        /// <param name=\"key\">The resource identifier.</param>\n        public LocExtension(object key)\n            : this()\n        {\n            if (key is TemplateBindingExpression tbe)\n            {\n                var newBinding = new Binding();\n\n                var tb = tbe.TemplateBindingExtension;\n                newBinding.Converter = tb.Converter;\n                newBinding.ConverterParameter = tb.ConverterParameter;\n                newBinding.Path = new PropertyPath(tb.Property.Name);\n                newBinding.RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent);\n                key = newBinding;\n            }\n\n            if (key is Binding binding)\n                _binding = binding;\n            else\n                Key = key?.ToString();\n        }\n\n        #endregion\n\n        #region OnFirstTargetAdded/OnLastTargetRemoved\n\n        /// <inheritdoc />\n        protected override void OnFirstTargetAdded()\n        {\n            base.OnFirstTargetAdded();\n            \n            LocalizeDictionary.DictionaryEvent.AddListener(this);\n        }\n\n        /// <inheritdoc />\n        protected override void OnLastTargetRemoved()\n        {\n            base.OnLastTargetRemoved();\n            \n            LocalizeDictionary.DictionaryEvent.RemoveListener(this);\n        }\n\n        #endregion\n        \n        #region IDictionaryEventListener implementation\n        /// <summary>\n        /// This method is called when the resource somehow changed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The event arguments.</param>\n        public void ResourceChanged(DependencyObject sender, DictionaryEventArgs e)\n        {\n            ClearItemFromResourceBuffer(e);\n            if (sender == null)\n            {\n                UpdateNewValue();\n                return;\n            }\n\n            // Update, if this object is in our endpoint list.\n            var targetDOs = (from p in GetTargetPropertyPaths()\n                             select p.EndPoint.TargetObject as DependencyObject);\n\n            foreach (var dObj in targetDOs)\n            {\n                if (LocalizeDictionary.Instance.DefaultProvider is IInheritingLocalizationProvider)\n                {\n                    UpdateNewValue();\n                    break;\n                }\n\n                var doParent = dObj;\n                while (doParent != null)\n                {\n                    if (sender == doParent)\n                    {\n                        UpdateNewValue();\n                        break;\n                    }\n                    if (!(doParent is Visual) && !(doParent is Visual3D) && !(doParent is FrameworkContentElement))\n                    {\n                        UpdateNewValue();\n                        break;\n                    }\n                    try\n                    {\n                        DependencyObject doParent2;\n\n                        if (doParent is FrameworkContentElement element)\n                            doParent2 = element.Parent;\n                        else\n                            doParent2 = doParent.GetParent(true);\n\n                        if (doParent2 == null && doParent is FrameworkElement)\n                            doParent2 = ((FrameworkElement)doParent).Parent;\n\n                        doParent = doParent2;\n                    }\n                    catch\n                    {\n                        UpdateNewValue();\n                        break;\n                    }\n                }\n            }\n        }\n\n        private void ClearItemFromResourceBuffer(DictionaryEventArgs dictionaryEventArgs)\n        {\n            if (dictionaryEventArgs.Type == DictionaryEventType.ValueChanged && (dictionaryEventArgs.Tag is ValueChangedEventArgs vceArgs))\n            {\n                string ciName = (vceArgs.Tag as CultureInfo)?.Name;\n\n                lock (ResolveLock)\n                {\n                    foreach (var key in _resourceBuffer.Keys.ToList())\n                    {\n                        if (key.EndsWith(vceArgs.Key))\n                        {\n                            if (ciName == null || key.StartsWith(ciName))\n                            {\n                                if (_resourceBuffer[key] != vceArgs.Value)\n                                    SafeRemoveItemFromResourceBuffer(key);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        #endregion\n\n        #region Forced culture handling\n        /// <summary>\n        /// If Culture property defines a valid <see cref=\"CultureInfo\"/>, a <see cref=\"CultureInfo\"/> instance will get\n        /// created and returned, otherwise <see cref=\"LocalizeDictionary\"/>.Culture will get returned.\n        /// </summary>\n        /// <returns>The <see cref=\"CultureInfo\"/></returns>\n        /// <exception cref=\"System.ArgumentException\">\n        /// thrown if the parameter Culture don't defines a valid <see cref=\"CultureInfo\"/>\n        /// </exception>\n        protected CultureInfo GetForcedCultureOrDefault()\n        {\n            // define a culture info\n            CultureInfo cultureInfo;\n\n            // check if the forced culture is not null or empty\n            if (!string.IsNullOrEmpty(ForceCulture))\n            {\n                // try to create a valid cultureinfo, if defined\n                try\n                {\n                    // try to create a specific culture from the forced one\n                    // cultureInfo = CultureInfo.CreateSpecificCulture(this.ForceCulture);\n                    cultureInfo = new CultureInfo(ForceCulture);\n                }\n                catch (ArgumentException ex)\n                {\n                    // on error, check if designmode is on\n                    if (LocalizeDictionary.Instance.GetIsInDesignMode())\n                    {\n                        // cultureInfo will be set to the current specific culture\n                        cultureInfo = LocalizeDictionary.Instance.SpecificCulture;\n                    }\n                    else\n                    {\n                        // tell the customer, that the forced culture cannot be converted propperly\n                        throw new ArgumentException(\"Cannot create a CultureInfo with '\" + ForceCulture + \"'\", ex);\n                    }\n                }\n            }\n            else\n            {\n                // take the current specific culture\n                cultureInfo = LocalizeDictionary.Instance.SpecificCulture;\n            }\n\n            // return the evaluated culture info\n            return cultureInfo;\n        }\n        #endregion\n\n        #region TargetMarkupExtension implementation\n        /// <inheritdoc/>\n        public override object FormatOutput(TargetInfo endPoint, TargetInfo info)\n        {\n            if (_binding != null && endPoint.TargetObject is DependencyObject dpo && endPoint.TargetProperty is DependencyProperty dp)\n            {\n                try\n                {\n                    var name = \"LocExtension.\" + dp.OwnerType.FullName + \".\" + dp.Name;\n                    if (endPoint.TargetPropertyIndex != -1)\n                        name += $\"[{endPoint.TargetPropertyIndex}]\";\n\n                    if (name != cacheDPName)\n                    {\n                        MethodInfo mi = typeof(DependencyProperty).GetMethod(\"FromName\", BindingFlags.Static | BindingFlags.NonPublic);\n\n                        cacheDPThis = mi.Invoke(null, new object[] { name, typeof(LocExtension) }) as DependencyProperty\n                            ?? DependencyProperty.RegisterAttached(name, typeof(NestedMarkupExtension), typeof(LocExtension),\n                                           new PropertyMetadata(null));\n\n                        cacheDPKey = mi.Invoke(null, new object[] { name + \".Key\", typeof(LocExtension) }) as DependencyProperty\n                            ?? DependencyProperty.RegisterAttached(name + \".Key\", typeof(string), typeof(LocExtension),\n                                            new PropertyMetadata(\"\", (d, e) => { (d?.GetValue(cacheDPThis) as LocExtension)?.UpdateNewValue(); }));\n                        cacheDPName = name;\n                    }\n\n                    if (dpo.GetValue(cacheDPThis) == null)\n                    {\n                        BindingOperations.SetBinding(dpo, cacheDPKey, _binding);\n                        dpo.SetValue(cacheDPThis, this);\n                    }\n\n                    _key = (string)dpo.GetValue(cacheDPKey);\n                }\n                catch\n                {\n                }\n            }\n\n            object result = null;\n\n            if (endPoint == null)\n                return null;\n            else\n                _lastEndpoint = SafeTargetInfo.FromTargetInfo(endPoint);\n\n            var targetObject = endPoint.TargetObject as DependencyObject;\n\n            // Get target type. Change ImageSource to BitmapSource in order to use our own converter.\n            var targetType = info.TargetPropertyType;\n\n            if (targetType == typeof(ImageSource))\n                targetType = typeof(BitmapSource);\n\n            // In case of a list target, get the correct list element type.\n            if ((info.TargetPropertyIndex != -1) && typeof(IList).IsAssignableFrom(info.TargetPropertyType))\n                targetType = info.TargetPropertyType.GetGenericArguments()[0];\n\n            // Try to get the localized input from the resource.\n            var resourceKey = LocalizeDictionary.Instance.GetFullyQualifiedResourceKey(Key, targetObject);\n            var ci = GetForcedCultureOrDefault();\n\n            // Extract the names of the endpoint object and property\n            var epProp = GetPropertyName(endPoint.TargetProperty);\n            var epName = \"\";\n\n            if (endPoint.TargetObject is FrameworkElement)\n                epName = ((FrameworkElement)endPoint.TargetObject).GetValueSync<string>(FrameworkElement.NameProperty);\n            else if (endPoint.TargetObject is FrameworkContentElement)\n                epName = ((FrameworkContentElement)endPoint.TargetObject).GetValueSync<string>(FrameworkContentElement.NameProperty);\n\n            var resKeyBase = ci.Name + \":\" + targetType.Name + \":\";\n            // Check, if the key is already in our resource buffer.\n            object input = null;\n            var isDefaultConverter = Converter is DefaultConverter;\n\n            if (!String.IsNullOrEmpty(resourceKey))\n            {\n                // We've got a resource key. Try to look it up or get it from the dictionary.\n                lock (ResourceBufferLock)\n                {\n                    if (isDefaultConverter && _resourceBuffer.ContainsKey(resKeyBase + resourceKey))\n                        result = _resourceBuffer[resKeyBase + resourceKey];\n                    else\n                    {\n                        input = LocalizeDictionary.Instance.GetLocalizedObject(resourceKey, targetObject, ci);\n                        resKeyBase += resourceKey;\n                    }\n                }\n            }\n            else\n            {\n                var resKeyNameProp = LocalizeDictionary.Instance.GetFullyQualifiedResourceKey(epName + LocalizeDictionary.GetSeparation(targetObject) + epProp, targetObject);\n\n                // Try the automatic lookup function.\n                // First, look for a resource entry named: [FrameworkElement name][Separator][Property name]\n                lock (ResourceBufferLock)\n                {\n                    if (isDefaultConverter && _resourceBuffer.ContainsKey(resKeyBase + resKeyNameProp))\n                        result = _resourceBuffer[resKeyBase + resKeyNameProp];\n                    else\n                    {\n                        // It was not stored in the buffer - try to retrieve it from the dictionary.\n                        input = LocalizeDictionary.Instance.GetLocalizedObject(resKeyNameProp, targetObject, ci);\n\n                        if (input == null)\n                        {\n                            var resKeyName = LocalizeDictionary.Instance.GetFullyQualifiedResourceKey(epName, targetObject);\n\n                            // Now, try to look for a resource entry named: [FrameworkElement name]\n                            // Note - this has to be nested here, as it would take precedence over the first step in the buffer lookup step.\n                            if (isDefaultConverter && _resourceBuffer.ContainsKey(resKeyBase + resKeyName))\n                                result = _resourceBuffer[resKeyBase + resKeyName];\n                            else\n                            {\n                                input = LocalizeDictionary.Instance.GetLocalizedObject(resKeyName, targetObject, ci);\n                                resKeyBase += resKeyName;\n                            }\n                        }\n                        else\n                            resKeyBase += resKeyNameProp;\n                    }\n                }\n            }\n\n            // If no result was found, convert the input and add it to the buffer.\n            if (result == null)\n            {\n                if (input != null)\n                {\n                    result = Converter.Convert(input, targetType, ConverterParameter, ci);\n                    if (isDefaultConverter)\n                        SafeAddItemToResourceBuffer(resKeyBase, result);\n                }\n                else\n                {\n                    var missingKeyEventResult = LocalizeDictionary.Instance.OnNewMissingKeyEvent(this, _key);\n\n                    if (missingKeyEventResult.Reload)\n                        UpdateNewValue();\n\n                    if (LocalizeDictionary.Instance.OutputMissingKeys\n                        && !string.IsNullOrEmpty(_key) && (targetType == typeof(String) || targetType == typeof(object)))\n                    {\n                        if (missingKeyEventResult.MissingKeyResult != null)\n                            result = missingKeyEventResult.MissingKeyResult;\n                        else\n                        {\n                            switch (FallbackBehavior)\n                            {\n                                case FallbackBehavior.Key:\n                                    result = _key;\n                                    break;\n                                \n                                case FallbackBehavior.EmptyString:\n                                    result = string.Empty;\n                                    break;\n                                \n                                case FallbackBehavior.Default:\n                                default:\n                                    result = \"Key: \" + _key;\n                                    break;\n                            }\n                        }\n                    }\n                }\n            }\n\n            return result;\n        }\n\n        /// <inheritdoc/>\n        protected override bool UpdateOnEndpoint(TargetInfo endpoint)\n        {\n            // This extension must be updated, when an endpoint is reached.\n            return true;\n        }\n        #endregion\n\n        #region Resolve functions\n        /// <summary>\n        /// Gets a localized value.\n        /// </summary>\n        /// <typeparam name=\"TValue\">The type of the returned value.</typeparam>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"converter\">An optional converter.</param>\n        /// <param name=\"converterParameter\">An optional converter parameter.</param>\n        /// <returns>The resolved localized object.</returns>\n        public static TValue GetLocalizedValue<TValue>(string key, IValueConverter converter = null, object converterParameter = null)\n        {\n            var targetCulture = LocalizeDictionary.Instance.SpecificCulture;\n            return GetLocalizedValue<TValue>(key, targetCulture, null, converter, converterParameter);\n        }\n\n        /// <summary>\n        /// Gets a localized value.\n        /// </summary>\n        /// <typeparam name=\"TValue\">The type of the returned value.</typeparam>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"targetCulture\">The target culture.</param>\n        /// <param name=\"converter\">An optional converter.</param>\n        /// <param name=\"converterParameter\">An optional converter parameter.</param>\n        /// <returns>The resolved localized object.</returns>\n        public static TValue GetLocalizedValue<TValue>(string key, CultureInfo targetCulture, IValueConverter converter = null, object converterParameter = null)\n        {\n            return GetLocalizedValue<TValue>(key, targetCulture, null, converter, converterParameter);\n        }\n\n        /// <summary>\n        /// Gets a localized value.\n        /// </summary>\n        /// <typeparam name=\"TValue\">The type of the returned value.</typeparam>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"target\">The target <see cref=\"DependencyObject\"/>.</param>\n        /// <param name=\"converter\">An optional converter.</param>\n        /// <param name=\"converterParameter\">An optional converter parameter.</param>\n        /// <returns>The resolved localized object.</returns>\n        public static TValue GetLocalizedValue<TValue>(string key, DependencyObject target, IValueConverter converter = null, object converterParameter = null)\n        {\n            var targetCulture = LocalizeDictionary.Instance.SpecificCulture;\n            return GetLocalizedValue<TValue>(key, targetCulture, target, converter, converterParameter);\n        }\n\n        /// <summary>\n        /// Gets a localized value.\n        /// </summary>\n        /// <typeparam name=\"TValue\">The type of the returned value.</typeparam>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"targetCulture\">The target culture.</param>\n        /// <param name=\"target\">The target <see cref=\"DependencyObject\"/>.</param>\n        /// <param name=\"converter\">An optional converter.</param>\n        /// <param name=\"converterParameter\">An optional converter parameter.</param>\n        /// <returns>The resolved localized object.</returns>\n        public static TValue GetLocalizedValue<TValue>(string key, CultureInfo targetCulture, DependencyObject target, IValueConverter converter = null, object converterParameter = null)\n        {\n            lock (ResolveLock)\n            {\n                var result = default(TValue);\n\n                var resourceKey = LocalizeDictionary.Instance.GetFullyQualifiedResourceKey(key, target);\n\n                // Get the localized object from the dictionary\n                var resKey = targetCulture.Name + \":\" + typeof(TValue).Name + \":\" + resourceKey;\n                var isDefaultConverter = converter is DefaultConverter;\n\n                if (isDefaultConverter && _resourceBuffer.ContainsKey(resKey))\n                    result = (TValue)_resourceBuffer[resKey];\n                else\n                {\n                    var localizedObject = LocalizeDictionary.Instance.GetLocalizedObject(resourceKey, target,\n                        targetCulture);\n\n                    if (localizedObject == null)\n                        return result;\n\n                    if (converter == null)\n                        converter = new DefaultConverter();\n\n                    var tmp = converter.Convert(localizedObject, typeof(TValue), converterParameter, targetCulture);\n\n                    if (tmp is TValue value)\n                    {\n                        result = value;\n                        if (isDefaultConverter)\n                            SafeAddItemToResourceBuffer(resKey, result);\n                    }\n                }\n\n                return result;\n            }\n        }\n\n        /// <summary>\n        /// Gets a localized value.\n        /// </summary>\n        /// <param name=\"t\">The type of the returned value.</param>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"targetCulture\">The target culture.</param>\n        /// <param name=\"target\">The target <see cref=\"DependencyObject\"/>.</param>\n        /// <param name=\"converter\">An optional converter.</param>\n        /// <param name=\"converterParameter\">An optional converter parameter.</param>\n        /// <returns>The resolved localized object.</returns>\n        public static object GetLocalizedValue(Type t,string key, CultureInfo targetCulture, DependencyObject target, IValueConverter converter = null, object converterParameter = null)\n        {\n            lock (ResolveLock)\n            {\n                object result = null;\n\n                var resourceKey = LocalizeDictionary.Instance.GetFullyQualifiedResourceKey(key, target);\n\n                // Get the localized object from the dictionary\n                var resKey = targetCulture.Name + \":\" + t.Name + \":\" + resourceKey;\n                var isDefaultConverter = converter is DefaultConverter;\n\n                if (isDefaultConverter && _resourceBuffer.ContainsKey(resKey))\n                    result = _resourceBuffer[resKey];\n                else\n                {\n                    var localizedObject = LocalizeDictionary.Instance.GetLocalizedObject(resourceKey, target,\n                        targetCulture);\n\n                    if (localizedObject == null)\n                        return result;\n\n                    if (converter == null)\n                        converter = new DefaultConverter();\n\n                    var tmp = converter.Convert(localizedObject, t, converterParameter, targetCulture);\n\n                    if (t.IsAssignableFrom(tmp.GetType()))\n                    {\n                        result = tmp;\n                        if (isDefaultConverter)\n                            SafeAddItemToResourceBuffer(resKey, result);\n                    }\n                }\n\n                return result;\n            }\n        }\n\n        /// <summary>\n        /// Resolves the localized value of the current Assembly, Dict, Key pair.\n        /// </summary>\n        /// <param name=\"resolvedValue\">The resolved value.</param>\n        /// <typeparam name=\"TValue\">The type of the return value.</typeparam>\n        /// <returns>\n        /// True if the resolve was success, otherwise false.\n        /// </returns>\n        public bool ResolveLocalizedValue<TValue>(out TValue resolvedValue)\n        {\n            // return the resolved localized value with the current or forced culture.\n            return ResolveLocalizedValue(out resolvedValue, GetForcedCultureOrDefault(), null);\n        }\n\n        /// <summary>\n        /// Resolves the localized value of the current Assembly, Dict, Key pair and the given target.\n        /// </summary>\n        /// <param name=\"resolvedValue\">The resolved value.</param>\n        /// <typeparam name=\"TValue\">The type of the return value.</typeparam>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>\n        /// True if the resolve was success, otherwise false.\n        /// </returns>\n        public bool ResolveLocalizedValue<TValue>(out TValue resolvedValue, DependencyObject target)\n        {\n            // return the resolved localized value with the current or forced culture.\n            return ResolveLocalizedValue(out resolvedValue, GetForcedCultureOrDefault(), target);\n        }\n\n        /// <summary>\n        /// Resolves the localized value of the current Assembly, Dict, Key pair.\n        /// </summary>\n        /// <param name=\"resolvedValue\">The resolved value.</param>\n        /// <param name=\"targetCulture\">The target culture.</param>\n        /// <typeparam name=\"TValue\">The type of the return value.</typeparam>\n        /// <returns>\n        /// True if the resolve was success, otherwise false.\n        /// </returns>\n        public bool ResolveLocalizedValue<TValue>(out TValue resolvedValue, CultureInfo targetCulture)\n        {\n            return ResolveLocalizedValue(out resolvedValue, targetCulture, null);\n        }\n\n        /// <summary>\n        /// Resolves the localized value of the current Assembly, Dict, Key pair and the given target.\n        /// </summary>\n        /// <param name=\"resolvedValue\">The resolved value.</param>\n        /// <param name=\"targetCulture\">The target culture.</param>\n        /// <param name=\"target\">The target object.</param>\n        /// <typeparam name=\"TValue\">The type of the return value.</typeparam>\n        /// <returns>\n        /// True if the resolve was success, otherwise false.\n        /// </returns>\n        public bool ResolveLocalizedValue<TValue>(out TValue resolvedValue, CultureInfo targetCulture, DependencyObject target)\n        {\n            // define the default value of the resolved value\n            resolvedValue = default;\n\n            var resourceKey = LocalizeDictionary.Instance.GetFullyQualifiedResourceKey(Key, target);\n\n            // get the localized object from the dictionary\n            var resKey = targetCulture.Name + \":\" + typeof(TValue).Name + \":\" + resourceKey;\n            var isDefaultConverter = Converter is DefaultConverter;\n\n            lock (ResourceBufferLock)\n            {\n                if (isDefaultConverter && _resourceBuffer.ContainsKey(resKey))\n                {\n                    resolvedValue = (TValue)_resourceBuffer[resKey];\n                }\n                else\n                {\n                    var localizedObject = LocalizeDictionary.Instance.GetLocalizedObject(resourceKey, target, targetCulture);\n\n                    if (localizedObject == null)\n                        return false;\n\n                    var result = Converter.Convert(localizedObject, typeof(TValue), ConverterParameter, targetCulture);\n\n                    if (result is TValue value)\n                    {\n                        resolvedValue = value;\n                        if (isDefaultConverter)\n                            SafeAddItemToResourceBuffer(resKey, resolvedValue);\n                    }\n                }\n            }\n\n            if (resolvedValue != null)\n                return true;\n\n            return false;\n        }\n        #endregion\n\n        #region Code-behind binding\n        /// <summary>\n        /// Sets a binding between a <see cref=\"DependencyObject\"/> with its <see cref=\"DependencyProperty\"/>\n        /// or <see cref=\"PropertyInfo\"/> and the <c>LocExtension</c>.\n        /// </summary>\n        /// <param name=\"targetObject\">The target dependency object</param>\n        /// <param name=\"targetProperty\">The target property</param>\n        /// <returns>\n        /// TRUE if the binding was setup successfully, otherwise FALSE (Binding already exists).\n        /// </returns>\n        /// <exception cref=\"ArgumentException\">\n        /// If the <paramref name=\"targetProperty\"/> is\n        /// not a <see cref=\"DependencyProperty\"/> or <see cref=\"PropertyInfo\"/>.\n        /// </exception>\n        public bool SetBinding(DependencyObject targetObject, object targetProperty)\n        {\n            return SetBinding((object)targetObject, targetProperty, -1);\n        }\n\n        /// <summary>\n        /// Sets a binding between a <see cref=\"DependencyObject\"/> with its <see cref=\"DependencyProperty\"/>\n        /// or <see cref=\"PropertyInfo\"/> and the <c>LocExtension</c>.\n        /// </summary>\n        /// <param name=\"targetObject\">The target object</param>\n        /// <param name=\"targetProperty\">The target property</param>\n        /// <returns>\n        /// TRUE if the binding was setup successfully, otherwise FALSE (Binding already exists).\n        /// </returns>\n        /// <exception cref=\"ArgumentException\">\n        /// If the <paramref name=\"targetProperty\"/> is\n        /// not a <see cref=\"DependencyProperty\"/> or <see cref=\"PropertyInfo\"/>.\n        /// </exception>\n        public bool SetBinding(object targetObject, object targetProperty)\n        {\n            return SetBinding(targetObject, targetProperty, -1);\n        }\n\n        /// <summary>\n        /// Sets a binding between a <see cref=\"DependencyObject\"/> with its <see cref=\"DependencyProperty\"/>\n        /// or <see cref=\"PropertyInfo\"/> and the <c>LocExtension</c>.\n        /// </summary>\n        /// <param name=\"targetObject\">The target dependency object</param>\n        /// <param name=\"targetProperty\">The target property</param>\n        /// <param name=\"targetPropertyIndex\">The index of the target property. (only used for Lists)</param>\n        /// <returns>\n        /// TRUE if the binding was setup successfully, otherwise FALSE (Binding already exists).\n        /// </returns>\n        /// <exception cref=\"ArgumentException\">\n        /// If the <paramref name=\"targetProperty\"/> is\n        /// not a <see cref=\"DependencyProperty\"/> or <see cref=\"PropertyInfo\"/>.\n        /// </exception>\n        public bool SetBinding(DependencyObject targetObject, object targetProperty, int targetPropertyIndex)\n        {\n            return SetBinding((object)targetObject, targetProperty, targetPropertyIndex);\n        }\n\n        /// <summary>\n        /// Sets a binding between a <see cref=\"DependencyObject\"/> with its <see cref=\"DependencyProperty\"/>\n        /// or <see cref=\"PropertyInfo\"/> and the <c>LocExtension</c>.\n        /// </summary>\n        /// <param name=\"targetObject\">The target object</param>\n        /// <param name=\"targetProperty\">The target property</param>\n        /// <param name=\"targetPropertyIndex\">The index of the target property. (only used for Lists)</param>\n        /// <returns>\n        /// TRUE if the binding was setup successfully, otherwise FALSE (Binding already exists).\n        /// </returns>\n        /// <exception cref=\"ArgumentException\">\n        /// If the <paramref name=\"targetProperty\"/> is\n        /// not a <see cref=\"DependencyProperty\"/> or <see cref=\"PropertyInfo\"/>.\n        /// </exception>\n        public bool SetBinding(object targetObject, object targetProperty, int targetPropertyIndex)\n        {\n            var existingBinding = (from info in GetTargetPropertyPaths()\n                                   where (info.EndPoint.TargetObject == targetObject) && (info.EndPoint.TargetProperty == targetProperty)\n                                   select info).FirstOrDefault();\n\n            // Return false, if the binding already exists\n            if (existingBinding != null)\n                return false;\n\n            Type targetPropertyType = null;\n\n            if (targetProperty is DependencyProperty)\n                targetPropertyType = ((DependencyProperty)targetProperty).PropertyType;\n            else if (targetProperty is PropertyInfo)\n                targetPropertyType = ((PropertyInfo)targetProperty).PropertyType;\n\n            var result = ProvideValue(new SimpleProvideValueServiceProvider(targetObject, targetProperty, targetPropertyType, targetPropertyIndex));\n\n            SetPropertyValue(result, new TargetInfo(targetObject, targetProperty, targetPropertyType, targetPropertyIndex), false);\n\n            return true;\n        }\n        #endregion\n\n        #region ToString\n        /// <summary>\n        /// Overridden, to return the key of this instance.\n        /// </summary>\n        /// <returns>Loc: + key</returns>\n        public override string ToString()\n        {\n            return \"Loc:\" + _key;\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "src/Providers/FQAssemblyDictionaryKey.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"FullyQualifiedResourceKeyBase.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Justin Pihony</author>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Providers\n{\n    #region Usings\n    using System.Linq;\n    #endregion\n\n    /// <summary>\n    /// A class that bundles the key, assembly and dictionary information.\n    /// </summary>\n    public class FQAssemblyDictionaryKey : FullyQualifiedResourceKeyBase\n    {\n        private readonly string _key;\n        /// <summary>\n        /// The key.\n        /// </summary>\n        public string Key => _key;\n\n        private readonly string _assembly;\n        /// <summary>\n        /// The assembly of the dictionary.\n        /// </summary>\n        public string Assembly => _assembly;\n\n        private readonly string _dictionary;\n        /// <summary>\n        /// The resource dictionary.\n        /// </summary>\n        public string Dictionary => _dictionary;\n\n        /// <summary>\n        /// Creates a new instance of <see cref=\"FullyQualifiedResourceKeyBase\"/>.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"assembly\">The assembly of the dictionary.</param>\n        /// <param name=\"dictionary\">The resource dictionary.</param>\n        public FQAssemblyDictionaryKey(string key, string assembly = null, string dictionary = null)\n        {\n            _key = key;\n            _assembly = assembly;\n            _dictionary = dictionary;\n        }\n\n        /// <summary>\n        /// Converts the object to a string.\n        /// </summary>\n        /// <returns>The joined version of the assembly, dictionary and key.</returns>\n        public \n            override string ToString()\n        {\n            return string.Join(\":\", new[] { Assembly, Dictionary, Key }.Where(x => !string.IsNullOrEmpty(x)).ToArray());\n        }\n    }\n}\n"
  },
  {
    "path": "src/Providers/FullyQualifiedResourceKeyBase.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"FullyQualifiedResourceKeyBase.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Justin Pihony</author>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Providers\n{\n    /// <summary>\n    /// An abstract class for key identification.\n    /// </summary>\n    public abstract class FullyQualifiedResourceKeyBase\n    {\n        /// <summary>\n        /// Implicit string operator.\n        /// </summary>\n        /// <param name=\"fullyQualifiedResourceKey\">The object.</param>\n        /// <returns>The joined version of the assembly, dictionary and key.</returns>\n        public static implicit operator string(FullyQualifiedResourceKeyBase fullyQualifiedResourceKey)\n        {\n            return fullyQualifiedResourceKey?.ToString();\n        }\n    }\n}"
  },
  {
    "path": "src/Providers/IInheritingLocalizationProvider.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"ILocalizationProvider.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Providers\n{\n    #region Usings\n    using System.Collections.ObjectModel;\n    using System.Globalization;\n    using System.Windows;\n    #endregion\n\n    /// <summary>\n    /// An interface describing classes that provide localized values based on a source/dictionary/key combination.\n    /// and used for a localization provider that uses Inheriting Dependency Properties\n    /// </summary>\n    public interface IInheritingLocalizationProvider: ILocalizationProvider\n    {\n    \n    }\n}\n"
  },
  {
    "path": "src/Providers/ILocalizationProvider.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"ILocalizationProvider.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Providers\n{\n    #region Usings\n    using System.Collections.ObjectModel;\n    using System.Globalization;\n    using System.Windows;\n    #endregion\n\n    /// <summary>\n    /// An interface describing classes that provide localized values based on a source/dictionary/key combination.\n    /// </summary>\n    public interface ILocalizationProvider\n    {\n        /// <summary>\n        /// Uses the key and target to build a fully qualified resource key (Assembly, Dictionary, Key)\n        /// </summary>\n        /// <param name=\"key\">Key used as a base to find the full key</param>\n        /// <param name=\"target\">Target used to help determine key information</param>\n        /// <returns>Returns an object with all possible pieces of the given key (Assembly, Dictionary, Key)</returns>\n        FullyQualifiedResourceKeyBase GetFullyQualifiedResourceKey(string key, DependencyObject target);\n\n        /// <summary>\n        /// Get the localized object.\n        /// </summary>\n        /// <param name=\"key\">The key to the value.</param>\n        /// <param name=\"target\">The target <see cref=\"DependencyObject\"/>.</param>\n        /// <param name=\"culture\">The culture to use.</param>\n        /// <returns>The value corresponding to the source/dictionary/key path for the given culture (otherwise NULL).</returns>\n        object GetLocalizedObject(string key, DependencyObject target, CultureInfo culture);\n\n        /// <summary>\n        /// An observable list of available cultures.\n        /// </summary>\n        ObservableCollection<CultureInfo> AvailableCultures { get; }\n\n        /// <summary>\n        /// An event that is fired when the provider changed.\n        /// </summary>\n        event ProviderChangedEventHandler ProviderChanged;\n\n        /// <summary>\n        /// An event that is fired when an error occurred.\n        /// </summary>\n        event ProviderErrorEventHandler ProviderError;\n\n        /// <summary>\n        /// An event that is fired when a value changed.\n        /// </summary>\n        event ValueChangedEventHandler ValueChanged;\n    }\n}\n"
  },
  {
    "path": "src/Providers/InheritingResxLocalizationProvider.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"InheritingResxLocalizationProvider.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Providers\n{\n    #region Usings\n    using System.Collections.Generic;\n    using System.Collections.ObjectModel;\n    using System.Globalization;\n    using System.Resources;\n    using System.Windows;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <summary>\n    /// A singleton RESX provider that uses inheriting attached properties.\n    /// </summary>\n    public class InheritingResxLocalizationProvider : ResxLocalizationProviderBase, IInheritingLocalizationProvider\n    {\n        #region Dependency Properties\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> DefaultDictionary to set the fallback resource dictionary.\n        /// </summary>\n        public static readonly DependencyProperty DefaultDictionaryProperty =\n                DependencyProperty.RegisterAttached(\n                \"DefaultDictionary\",\n                typeof(string),\n                typeof(InheritingResxLocalizationProvider),\n                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits, AttachedPropertyChanged));\n\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> DefaultAssembly to set the fallback assembly.\n        /// </summary>\n        public static readonly DependencyProperty DefaultAssemblyProperty =\n            DependencyProperty.RegisterAttached(\n                \"DefaultAssembly\",\n                typeof(string),\n                typeof(InheritingResxLocalizationProvider),\n                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits, AttachedPropertyChanged));\n        #endregion\n\n        #region Dependency Property Callback\n        /// <summary>\n        /// Indicates, that one of the attached properties changed.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"args\">The event argument.</param>\n        private static void AttachedPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\n        {\n            Instance.OnProviderChanged(obj);\n        }\n        #endregion\n\n        #region Dependency Property Management\n        #region Get\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> default dictionary.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the default dictionary from.</param>\n        /// <returns>The default dictionary.</returns>\n        public static string GetDefaultDictionary(DependencyObject obj)\n        {\n            return obj.GetValueSync<string>(DefaultDictionaryProperty);\n        }\n\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> default assembly.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the default assembly from.</param>\n        /// <returns>The default assembly.</returns>\n        public static string GetDefaultAssembly(DependencyObject obj)\n        {\n            return obj.GetValueSync<string>(DefaultAssemblyProperty);\n        }\n        #endregion\n\n        #region Set\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> default dictionary.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the default dictionary to.</param>\n        /// <param name=\"value\">The dictionary.</param>\n        public static void SetDefaultDictionary(DependencyObject obj, string value)\n        {\n            obj.SetValueSync(DefaultDictionaryProperty, value);\n        }\n\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> default assembly.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the default assembly to.</param>\n        /// <param name=\"value\">The assembly.</param>\n        public static void SetDefaultAssembly(DependencyObject obj, string value)\n        {\n            obj.SetValueSync(DefaultAssemblyProperty, value);\n        }\n        #endregion\n        #endregion\n\n        #region Singleton Variables, Properties & Constructor\n        /// <summary>\n        /// The instance of the singleton.\n        /// </summary>\n        private static InheritingResxLocalizationProvider _instance;\n\n        /// <summary>\n        /// Lock object for the creation of the singleton instance.\n        /// </summary>\n        private static readonly object InstanceLock = new object();\n\n        /// <summary>\n        /// Gets the <see cref=\"ResxLocalizationProvider\"/> singleton.\n        /// </summary>\n        public static InheritingResxLocalizationProvider Instance\n        {\n            get\n            {\n                if (_instance == null)\n                {\n                    lock (InstanceLock)\n                    {\n                        if (_instance == null)\n                            _instance = new InheritingResxLocalizationProvider();\n                    }\n                }\n\n                // return the existing/new instance\n                return _instance;\n            }\n        }\n\n        /// <summary>\n        /// The singleton constructor.\n        /// </summary>\n        private InheritingResxLocalizationProvider()\n        {\n            ResourceManagerList = new Dictionary<string, ResourceManager>();\n            AvailableCultures = new ObservableCollection<CultureInfo> { CultureInfo.InvariantCulture };\n        }\n        #endregion\n\n        #region Abstract assembly & dictionary lookup\n        /// <inheritdoc/>\n        protected override string GetAssembly(DependencyObject target)\n        {\n            return target?.GetValue(DefaultAssemblyProperty) as string;\n        }\n\n        /// <inheritdoc/>\n        protected override string GetDictionary(DependencyObject target)\n        {\n            return target?.GetValue(DefaultDictionaryProperty) as string;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Providers/ParentChangedNotifierHelper.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"ParentChangedNotifierHelper.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Providers\n{\n    #region Usings\n    using System;\n    using System.Windows;\n    using System.Windows.Media;\n    using System.Windows.Media.Media3D;\n    using WPFLocalizeExtension.Engine;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <summary>\n    /// Extension methods for <see cref=\"DependencyObject\"/> in conjunction with the <see cref=\"XAMLMarkupExtensions.Base.ParentChangedNotifier\"/>.\n    /// </summary>\n    public static class ParentChangedNotifierHelper\n    {\n        /// <summary>\n        /// Tries to get a value that is stored somewhere in the visual tree above this <see cref=\"DependencyObject\"/>.\n        /// <para>If this is not available, it will register a <see cref=\"XAMLMarkupExtensions.Base.ParentChangedNotifier\"/> on the last element.</para>\n        /// </summary>\n        /// <typeparam name=\"T\">The return type.</typeparam>\n        /// <param name=\"target\">The <see cref=\"DependencyObject\"/>.</param>\n        /// <param name=\"getFunction\">The function that gets the value from a <see cref=\"DependencyObject\"/>.</param>\n        /// <param name=\"parentChangedAction\">The notification action on the change event of the Parent property.</param>\n        /// <param name=\"parentNotifiers\">A dictionary of already registered notifiers.</param>\n        /// <returns>The value, if possible.</returns>\n        public static T GetValueOrRegisterParentNotifier<T>(\n            this DependencyObject target,\n            Func<DependencyObject, T> getFunction,\n            Action<DependencyObject> parentChangedAction,\n            ParentNotifiers parentNotifiers)\n        {\n            var ret = default(T);\n\n            if (target == null) return ret;\n\n            var depObj = target;\n            var weakTarget = new WeakReference(target);\n\n            while (ret == null)\n            {\n                // Try to get the value using the provided GetFunction.\n                ret = getFunction(depObj);\n\n                if (ret != null)\n                    parentNotifiers.Remove(target);\n\n                // Try to get the parent using the visual tree helper. This may fail on some occations.\n                if (depObj is System.Windows.Controls.ToolTip)\n                    break;\n\n                if (!(depObj is Visual) && !(depObj is Visual3D) && !(depObj is FrameworkContentElement))\n                    break;\n\n                if (depObj is Window)\n                    break;\n\n                DependencyObject depObjParent;\n\n                if (depObj is FrameworkContentElement element)\n                    depObjParent = element.Parent;\n                else\n                {\n                    try\n                    {\n                        depObjParent = depObj.GetParent(false);\n                    }\n                    catch\n                    {\n                        depObjParent = null;\n                    }\n                }\n\n                if (depObjParent == null)\n                {\n                    try\n                    {\n                        depObjParent = depObj.GetParent(true);\n                    }\n                    catch\n                    {\n                        break;\n                    }\n                }\n\n                // If this failed, try again using the Parent property (sometimes this is not covered by the VisualTreeHelper class :-P.\n                if (depObjParent == null && depObj is FrameworkElement)\n                    depObjParent = ((FrameworkElement)depObj).Parent;\n\n                if (ret == null && depObjParent == null)\n                {\n                    // Try to establish a notification on changes of the Parent property of dp.\n                    if (depObj is FrameworkElement frameworkElement && !parentNotifiers.ContainsKey(target))\n                    {\n                        var pcn = new ParentChangedNotifier(frameworkElement, () =>\n                        {\n                            var localTarget = (DependencyObject)weakTarget.Target;\n                            if (localTarget == null)\n                                return;\n\n                            // Call the action...\n                            parentChangedAction(localTarget);\n                            // ...and remove the notifier - it will probably not be used again.\n                            parentNotifiers.Remove(localTarget);\n                        });\n\n                        parentNotifiers.Add(target, pcn);\n                    }\n                    break;\n                }\n\n                // Assign the parent to the current DependencyObject and start the next iteration.\n                depObj = depObjParent;\n            }\n\n            return ret;\n        }\n\n        /// <summary>\n        /// Tries to get a value that is stored somewhere in the visual tree above this <see cref=\"DependencyObject\"/>.\n        /// </summary>\n        /// <typeparam name=\"T\">The return type.</typeparam>\n        /// <param name=\"target\">The <see cref=\"DependencyObject\"/>.</param>\n        /// <param name=\"getFunction\">The function that gets the value from a <see cref=\"DependencyObject\"/>.</param>\n        /// <returns>The value, if possible.</returns>\n        public static T GetValue<T>(this DependencyObject target, Func<DependencyObject, T> getFunction)\n        {\n            var ret = default(T);\n\n            if (target != null)\n            {\n                var depObj = target;\n\n                while (ret == null)\n                {\n                    // Try to get the value using the provided GetFunction.\n                    ret = getFunction(depObj);\n\n                    // Try to get the parent using the visual tree helper. This may fail on some occations.\n                    if (!(depObj is Visual) && !(depObj is Visual3D) && !(depObj is FrameworkContentElement))\n                        break;\n\n                    DependencyObject depObjParent;\n\n                    if (depObj is FrameworkContentElement element)\n                        depObjParent = element.Parent;\n                    else\n                    {\n                        try\n                        {\n                            depObjParent = depObj.GetParent(true);\n                        }\n                        catch\n                        {\n                            break;\n                        }\n                    }\n                    // If this failed, try again using the Parent property (sometimes this is not covered by the VisualTreeHelper class :-P.\n                    if (depObjParent == null && depObj is FrameworkElement)\n                        depObjParent = ((FrameworkElement)depObj).Parent;\n\n                    if (ret == null && depObjParent == null)\n                        break;\n\n                    // Assign the parent to the current DependencyObject and start the next iteration.\n                    depObj = depObjParent;\n                }\n            }\n\n            return ret;\n        }\n\n        /// <summary>\n        /// Tries to get a value from a <see cref=\"DependencyProperty\"/> that is stored somewhere in the visual tree above this <see cref=\"DependencyObject\"/>.\n        /// If this is not available, it will register a <see cref=\"XAMLMarkupExtensions.Base.ParentChangedNotifier\"/> on the last element.\n        /// </summary>\n        /// <typeparam name=\"T\">The return type.</typeparam>\n        /// <param name=\"target\">The <see cref=\"DependencyObject\"/>.</param>\n        /// <param name=\"property\">A <see cref=\"DependencyProperty\"/> that will be read out.</param>\n        /// <param name=\"parentChangedAction\">The notification action on the change event of the Parent property.</param>\n        /// <param name=\"parentNotifiers\">A dictionary of already registered notifiers.</param>\n        /// <returns>The value, if possible.</returns>\n        public static T GetValueOrRegisterParentNotifier<T>(\n            this DependencyObject target,\n            DependencyProperty property,\n            Action<DependencyObject> parentChangedAction,\n            ParentNotifiers parentNotifiers)\n        {\n            return target.GetValueOrRegisterParentNotifier(depObj => depObj.GetValueSync<T>(property), parentChangedAction, parentNotifiers);\n        }\n\n        /// <summary>\n        /// Gets the parent in the visual or logical tree.\n        /// </summary>\n        /// <param name=\"depObj\">The dependency object.</param>\n        /// <param name=\"isVisualTree\">True for visual tree, false for logical tree.</param>\n        /// <returns>The parent, if available.</returns>\n        public static DependencyObject GetParent(this DependencyObject depObj, bool isVisualTree)\n        {\n            if (depObj.CheckAccess())\n                return GetParentInternal(depObj, isVisualTree);\n\n            return (DependencyObject)depObj.Dispatcher.Invoke(new Func<DependencyObject>(() => GetParentInternal(depObj, isVisualTree)));\n        }\n\n        private static DependencyObject GetParentInternal(DependencyObject depObj, bool isVisualTree)\n        {\n            if (isVisualTree)\n                return VisualTreeHelper.GetParent(depObj);\n\n            return LogicalTreeHelper.GetParent(depObj);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Providers/ProviderEventArgs.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"ProviderEventArgs.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Providers\n{\n    #region Usings\n    using System;\n    using System.Windows;\n    #endregion\n\n    /// <summary>\n    /// Events arguments for a ProviderChangedEventHandler.\n    /// </summary>\n    public class ProviderChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The target object.\n        /// </summary>\n        public DependencyObject Object { get; }\n\n        /// <summary>\n        /// Creates a new <see cref=\"ProviderChangedEventArgs\"/> instance.\n        /// </summary>\n        /// <param name=\"obj\">The target object.</param>\n        public ProviderChangedEventArgs(DependencyObject obj)\n        {\n            Object = obj;\n        }\n    }\n\n    /// <summary>\n    /// An event handler for notification of provider changes.\n    /// </summary>\n    /// <param name=\"sender\">The sender.</param>\n    /// <param name=\"args\">The event arguments.</param>\n    public delegate void ProviderChangedEventHandler(object sender, ProviderChangedEventArgs args);\n\n    /// <summary>\n    /// Events arguments for a ProviderErrorEventHandler.\n    /// </summary>\n    public class ProviderErrorEventArgs : EventArgs\n    {\n        /// <summary>\n        /// The target object.\n        /// </summary>\n        public DependencyObject Object { get; }\n\n        /// <summary>\n        /// The key.\n        /// </summary>\n        public string Key { get; }\n\n        /// <summary>\n        /// The message.\n        /// </summary>\n        public string Message { get; }\n\n        /// <summary>\n        /// Creates a new <see cref=\"ProviderErrorEventArgs\"/> instance.\n        /// </summary>\n        /// <param name=\"obj\">The target object.</param>\n        /// <param name=\"key\">The key that caused the error.</param>\n        /// <param name=\"message\">The error message.</param>\n        public ProviderErrorEventArgs(DependencyObject obj, string key, string message)\n        {\n            Object = obj;\n            Key = key;\n            Message = message;\n        }\n    }\n\n    /// <summary>\n    /// An event handler for notification of provider erorrs.\n    /// </summary>\n    /// <param name=\"sender\">The sender.</param>\n    /// <param name=\"args\">The event arguments.</param>\n    public delegate void ProviderErrorEventHandler(object sender, ProviderErrorEventArgs args);\n\n    /// <summary>\n    /// Events arguments for a ValueChangedEventHandler.\n    /// </summary>\n    public class ValueChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// A custom tag.\n        /// </summary>\n        public object Tag { get; }\n\n        /// <summary>\n        /// The new value.\n        /// </summary>\n        public object Value { get; }\n\n        /// <summary>\n        /// The key.\n        /// </summary>\n        public string Key { get; }\n\n        /// <summary>\n        /// Creates a new <see cref=\"ValueChangedEventArgs\"/> instance.\n        /// </summary>\n        /// <param name=\"key\">The key where the value was changed.</param>\n        /// <param name=\"value\">The new value.</param>\n        /// <param name=\"tag\">A custom tag.</param>\n        public ValueChangedEventArgs(string key, object value, object tag)\n        {\n            Key = key;\n            Value = value;\n            Tag = tag;\n        }\n    }\n\n    /// <summary>\n    /// An event handler for notification of changes of localized values.\n    /// </summary>\n    /// <param name=\"sender\">The sender.</param>\n    /// <param name=\"args\">The event arguments.</param>\n    public delegate void ValueChangedEventHandler(object sender, ValueChangedEventArgs args);\n}\n"
  },
  {
    "path": "src/Providers/ResxLocalizationProvider.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"ResxLocalizationProvider.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Providers\n{\n    #region Usings\n    using System.Collections.Generic;\n    using System.Collections.ObjectModel;\n    using System.Globalization;\n    using System.Resources;\n    using System.Windows;\n    using WPFLocalizeExtension.Engine;\n    using XAMLMarkupExtensions.Base;\n    #endregion\n\n    /// <summary>\n    /// A singleton RESX provider that uses attached properties and the Parent property to iterate through the visual tree.\n    /// </summary>\n    public class ResxLocalizationProvider : ResxLocalizationProviderBase\n    {\n        #region Dependency Properties\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> DefaultDictionary to set the fallback resource dictionary.\n        /// </summary>\n        public static readonly DependencyProperty DefaultDictionaryProperty =\n                DependencyProperty.RegisterAttached(\n                \"DefaultDictionary\",\n                typeof(string),\n                typeof(ResxLocalizationProvider),\n                new PropertyMetadata(null, DefaultDictionaryChanged));\n\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> DefaultAssembly to set the fallback assembly.\n        /// </summary>\n        public static readonly DependencyProperty DefaultAssemblyProperty =\n            DependencyProperty.RegisterAttached(\n                \"DefaultAssembly\",\n                typeof(string),\n                typeof(ResxLocalizationProvider),\n                new PropertyMetadata(null, DefaultAssemblyChanged));\n\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> IgnoreCase to set the case sensitivity.\n        /// </summary>\n        public static readonly DependencyProperty IgnoreCaseProperty =\n            DependencyProperty.RegisterAttached(\n                \"IgnoreCase\",\n                typeof(bool),\n                typeof(ResxLocalizationProvider),\n                new PropertyMetadata(true, IgnoreCaseChanged));\n        #endregion\n\n        #region Dependency Property Callback\n        /// <summary>\n        /// Indicates, that the <see cref=\"DefaultDictionaryProperty\"/> attached property changed.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"e\">The event argument.</param>\n        private static void DefaultDictionaryChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)\n        {\n            Instance.FallbackDictionary = e.NewValue?.ToString();\n            Instance.OnProviderChanged(obj);\n        }\n\n        /// <summary>\n        /// Indicates, that the <see cref=\"DefaultAssemblyProperty\"/> attached property changed.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"e\">The event argument.</param>\n        private static void DefaultAssemblyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)\n        {\n            Instance.FallbackAssembly = e.NewValue?.ToString();\n            Instance.OnProviderChanged(obj);\n        }\n\n        /// <summary>\n        /// Indicates, that the <see cref=\"IgnoreCaseProperty\"/> attached property changed.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object.</param>\n        /// <param name=\"e\">The event argument.</param>\n        private static void IgnoreCaseChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)\n        {\n            Instance.IgnoreCase = (bool)e.NewValue;\n            Instance.OnProviderChanged(obj);\n        }\n\n        #endregion\n\n        #region Dependency Property Management\n        #region Get\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> default dictionary.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the default dictionary from.</param>\n        /// <returns>The default dictionary.</returns>\n        public static string GetDefaultDictionary(DependencyObject obj)\n        {\n            return obj.GetValueSync<string>(DefaultDictionaryProperty);\n        }\n\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> default assembly.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the default assembly from.</param>\n        /// <returns>The default assembly.</returns>\n        public static string GetDefaultAssembly(DependencyObject obj)\n        {\n            return obj.GetValueSync<string>(DefaultAssemblyProperty);\n        }\n\n        /// <summary>\n        /// Getter of <see cref=\"DependencyProperty\"/> ignore case flag.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to get the ignore case flag from.</param>\n        /// <returns>The ignore case flag.</returns>\n        public static bool GetIgnoreCase(DependencyObject obj)\n        {\n            return obj.GetValueSync<bool>(IgnoreCaseProperty);\n        }\n        #endregion\n\n        #region Set\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> default dictionary.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the default dictionary to.</param>\n        /// <param name=\"value\">The dictionary.</param>\n        public static void SetDefaultDictionary(DependencyObject obj, string value)\n        {\n            obj.SetValueSync(DefaultDictionaryProperty, value);\n        }\n\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> default assembly.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the default assembly to.</param>\n        /// <param name=\"value\">The assembly.</param>\n        public static void SetDefaultAssembly(DependencyObject obj, string value)\n        {\n            obj.SetValueSync(DefaultAssemblyProperty, value);\n        }\n\n        /// <summary>\n        /// Setter of <see cref=\"DependencyProperty\"/> ignore case flag.\n        /// </summary>\n        /// <param name=\"obj\">The dependency object to set the ignore case flag to.</param>\n        /// <param name=\"value\">The ignore case flag.</param>\n        public static void SetIgnoreCase(DependencyObject obj, bool value)\n        {\n            obj.SetValueSync(IgnoreCaseProperty, value);\n        }\n        #endregion\n        #endregion\n\n        #region Variables\n        /// <summary>\n        /// A dictionary for notification classes for changes of the individual target Parent changes.\n        /// </summary>\n        private readonly ParentNotifiers _parentNotifiers = new ParentNotifiers();\n\n        /// <summary>\n        /// To use when no assembly is specified.\n        /// </summary>\n        public string FallbackAssembly { get; set; }\n\n        /// <summary>\n        /// To use when no dictionary is specified.\n        /// </summary>\n        public string FallbackDictionary { get; set; }\n        #endregion\n\n        #region Singleton Variables, Properties & Constructor\n        /// <summary>\n        /// The instance of the singleton.\n        /// </summary>\n        private static ResxLocalizationProvider _instance;\n\n        /// <summary>\n        /// Lock object for the creation of the singleton instance.\n        /// </summary>\n        private static readonly object InstanceLock = new object();\n\n        /// <summary>\n        /// Gets the <see cref=\"ResxLocalizationProvider\"/> singleton.\n        /// </summary>\n        public static ResxLocalizationProvider Instance\n        {\n            get\n            {\n                if (_instance == null)\n                {\n                    lock (InstanceLock)\n                    {\n                        if (_instance == null)\n                            _instance = new ResxLocalizationProvider();\n                    }\n                }\n\n                // return the existing/new instance\n                return _instance;\n            }\n\n            set\n            {\n                lock (InstanceLock)\n                {\n                    _instance = value;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Resets the instance that is used for the ResxLocationProvider\n        /// </summary>\n        public static void Reset()\n        {\n            Instance = null;\n        }\n\n        /// <summary>\n        /// The singleton constructor.\n        /// </summary>\n        protected ResxLocalizationProvider()\n        {\n            ResourceManagerList = new Dictionary<string, ResourceManager>();\n            AvailableCultures = new ObservableCollection<CultureInfo> { CultureInfo.InvariantCulture };\n        }\n        #endregion\n\n        #region Abstract assembly & dictionary lookup\n        /// <summary>\n        /// An action that will be called when a parent of one of the observed target objects changed.\n        /// </summary>\n        /// <param name=\"obj\">The target <see cref=\"DependencyObject\"/>.</param>\n        private void ParentChangedAction(DependencyObject obj)\n        {\n            OnProviderChanged(obj);\n        }\n\n        /// <inheritdoc/>\n        protected override string GetAssembly(DependencyObject target)\n        {\n            if (target == null)\n                return FallbackAssembly;\n\n            var assembly = target.GetValueOrRegisterParentNotifier<string>(DefaultAssemblyProperty, ParentChangedAction, _parentNotifiers);\n            return string.IsNullOrEmpty(assembly) ? FallbackAssembly : assembly;\n        }\n\n        /// <inheritdoc/>\n        protected override string GetDictionary(DependencyObject target)\n        {\n            if (target == null)\n                return FallbackDictionary;\n\n            var dictionary = target.GetValueOrRegisterParentNotifier<string>(DefaultDictionaryProperty, ParentChangedAction, _parentNotifiers);\n            return string.IsNullOrEmpty(dictionary) ? FallbackDictionary : dictionary;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Providers/ResxLocalizationProviderBase.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"ResxLocalizationProviderBase.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n// <author>Bernhard Millauer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.Providers\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Collections.ObjectModel;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Management;\n    using System.Reflection;\n    using System.Resources;\n    using System.Windows;\n    #endregion\n\n    /// <summary>\n    /// The base for RESX file providers.\n    /// </summary>\n    public abstract class ResxLocalizationProviderBase : DependencyObject, ILocalizationProvider\n    {\n        #region Variables\n        /// <summary>\n        /// Holds the name of the Resource Manager.\n        /// </summary>\n        private const string ResourceManagerName = \"ResourceManager\";\n\n        /// <summary>\n        /// Holds the extension of the resource files.\n        /// </summary>\n        private const string ResourceFileExtension = \".resources\";\n\n        /// <summary>\n        /// Holds the binding flags for the reflection to find the resource files.\n        /// </summary>\n        private const BindingFlags ResourceBindingFlags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;\n\n        /// <summary>\n        /// Gets the used ResourceManagers with their corresponding <c>namespaces</c>.\n        /// </summary>\n        protected Dictionary<string, ResourceManager> ResourceManagerList;\n\n        /// <summary>\n        /// Lock object for concurrent access to the resource manager list.\n        /// </summary>\n        protected object ResourceManagerListLock = new object();\n\n        /// <summary>\n        /// Lock object for concurrent access to the available culture list.\n        /// </summary>\n        protected object AvailableCultureListLock = new object();\n\n        private bool _ignoreCase = true;\n        /// <summary>\n        /// Gets or sets the ignore case flag.\n        /// </summary>\n        public bool IgnoreCase\n        {\n            get => _ignoreCase;\n            set => _ignoreCase = value;\n        }\n\n        private List<CultureInfo> searchCultures = null;\n        /// <summary>\n        /// Gets or sets the cultures there the RESX Provider search for.\n        /// </summary>\n        public List<CultureInfo> SearchCultures\n        {\n            get\n            {\n                if (searchCultures == null)\n                    searchCultures = CultureInfo.GetCultures(CultureTypes.AllCultures).ToList();\n                return searchCultures;\n            }\n            set\n            {\n                searchCultures = value;\n            }\n        }\n        #endregion\n\n        #region Helper functions\n        /// <summary>\n        /// Returns the <see cref=\"AssemblyName\"/> of the passed assembly instance\n        /// </summary>\n        /// <param name=\"assembly\">The Assembly where to get the name from</param>\n        /// <returns>The Assembly name</returns>\n        protected string GetAssemblyName(Assembly assembly)\n        {\n            if (assembly == null)\n            {\n                throw new ArgumentNullException(nameof(assembly));\n            }\n\n            if (assembly.FullName == null)\n            {\n                throw new NullReferenceException(\"assembly.FullName is null\");\n            }\n\n            return assembly.FullName.Split(',')[0];\n        }\n\n        /// <summary>\n        /// Parses a key ([[Assembly:]Dict:]Key and return the parts of it.\n        /// </summary>\n        /// <param name=\"inKey\">The key to parse.</param>\n        /// <param name=\"outAssembly\">The found or default assembly.</param>\n        /// <param name=\"outDict\">The found or default dictionary.</param>\n        /// <param name=\"outKey\">The found or default key.</param>\n        public static void ParseKey(string inKey, out string outAssembly, out string outDict, out string outKey)\n        {\n            // Reset everything to null.\n            outAssembly = null;\n            outDict = null;\n            outKey = null;\n\n            if (!string.IsNullOrEmpty(inKey))\n            {\n                var split = inKey.Trim().Split(\":\".ToCharArray());\n\n                // assembly:dict:key\n                if (split.Length == 3)\n                {\n                    outAssembly = !string.IsNullOrEmpty(split[0]) ? split[0] : null;\n                    outDict = !string.IsNullOrEmpty(split[1]) ? split[1] : null;\n                    outKey = split[2];\n                }\n\n                // dict:key\n                if (split.Length == 2)\n                {\n                    outDict = !string.IsNullOrEmpty(split[0]) ? split[0] : null;\n                    outKey = split[1];\n                }\n\n                // key\n                if (split.Length == 1)\n                {\n                    outKey = split[0];\n                }\n            }\n        }\n        #endregion\n\n        #region Assembly & dictionary lookup\n        /// <summary>\n        /// Get the assembly from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The assembly name, if available.</returns>\n        protected abstract string GetAssembly(DependencyObject target);\n\n        /// <summary>\n        /// Get the dictionary from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The dictionary name, if available.</returns>\n        protected abstract string GetDictionary(DependencyObject target);\n        #endregion\n\n        #region ResourceManager management\n        /// <summary>\n        /// Thread-safe access to the resource manager dictionary.\n        /// </summary>\n        /// <param name=\"thekey\">Key.</param>\n        /// <param name=\"result\">Value.</param>\n        /// <returns>Success of the operation.</returns>\n        protected bool TryGetValue(string thekey, out ResourceManager result)\n        {\n            lock (ResourceManagerListLock) { return ResourceManagerList.TryGetValue(thekey, out result); }\n        }\n\n        /// <summary>\n        /// Thread-safe access to the resource manager dictionary.\n        /// </summary>\n        /// <param name=\"thekey\">Key.</param>\n        /// <param name=\"value\">Value.</param>\n        protected void Add(string thekey, ResourceManager value)\n        {\n            lock (ResourceManagerListLock) { ResourceManagerList.Add(thekey, value); }\n        }\n\n        /// <summary>\n        /// Tries to remove a key from the resource manager dictionary.\n        /// </summary>\n        /// <param name=\"thekey\">Key.</param>\n        protected void TryRemove(string thekey)\n        {\n            lock (ResourceManagerListLock) { if (ResourceManagerList.ContainsKey(thekey)) ResourceManagerList.Remove(thekey); }\n        }\n\n        /// <summary>\n        /// Clears the whole list of cached resource managers.\n        /// </summary>\n        public void ClearResourceManagerList()\n        {\n            lock (ResourceManagerListLock) { ResourceManagerList.Clear(); }\n        }\n\n        /// <summary>\n        /// Thread-safe access to the AvailableCultures list.\n        /// </summary>\n        /// <param name=\"c\">The CultureInfo.</param>\n        protected void AddCulture(CultureInfo c)\n        {\n            lock (AvailableCultureListLock)\n            {\n                if (!AvailableCultures.Contains(c))\n                    AvailableCultures.Add(c);\n            }\n        }\n\n        /// <summary>\n        /// Updates the list of available cultures using the given resource location.\n        /// </summary>\n        /// <param name=\"resourceAssembly\">The resource assembly.</param>\n        /// <param name=\"resourceDictionary\">The dictionary to look up.</param>\n        /// <returns>True, if the update was successful.</returns>\n        public bool UpdateCultureList(string resourceAssembly, string resourceDictionary)\n        {\n            return GetResourceManager(resourceAssembly, resourceDictionary) != null;\n        }\n\n        private static readonly Dictionary<int, string> ExecutablePaths = new Dictionary<int, string>();\n        private DateTime _lastUpdateCheck = DateTime.MinValue;\n\n        private static string _projectDirectory;\n        private static string[] _projectFilesCache;\n\n        /// <summary>\n        /// Get the executable path for both x86 and x64 processes.\n        /// </summary>\n        /// <param name=\"processId\">The process id.</param>\n        /// <returns>The path if found; otherwise, null.</returns>\n        private static string GetExecutablePath(int processId)\n        {\n            if (ExecutablePaths.ContainsKey(processId))\n                return ExecutablePaths[processId];\n\n            const string wmiQueryString = \"SELECT ProcessId, ExecutablePath, CommandLine FROM Win32_Process\";\n            using (var searcher = new ManagementObjectSearcher(wmiQueryString))\n            using (var results = searcher.Get())\n            {\n                var query = from p in Process.GetProcesses()\n                            join mo in results.Cast<ManagementObject>()\n                            on p.Id equals (int)(uint)mo[\"ProcessId\"]\n                            where p.Id == processId\n                            select new\n                            {\n                                Process = p,\n                                Path = (string)mo[\"ExecutablePath\"],\n                                CommandLine = (string)mo[\"CommandLine\"],\n                            };\n\n                foreach (var item in query)\n                {\n                    ExecutablePaths.Add(processId, item.Path);\n                    return item.Path;\n                }\n            }\n\n            return null;\n        }\n\n        private static bool IsFileOfInterest(string f, string dir)\n        {\n            if (string.IsNullOrEmpty(f))\n                return false;\n\n            if (!(f.EndsWith(\".resx\", StringComparison.OrdinalIgnoreCase) || f.EndsWith(\".resources.dll\", StringComparison.OrdinalIgnoreCase) ||\n                  f.EndsWith(\".resources\", StringComparison.OrdinalIgnoreCase)) &&\n                !dir.Equals(Path.GetDirectoryName(f), StringComparison.OrdinalIgnoreCase))\n                return false;\n\n            return true;\n        }\n\n        /// <summary>\n        /// Looks up in the cached <see cref=\"ResourceManager\"/> list for the searched <see cref=\"ResourceManager\"/>.\n        /// </summary>\n        /// <param name=\"resourceAssembly\">The resource assembly.</param>\n        /// <param name=\"resourceDictionary\">The dictionary to look up.</param>\n        /// <returns>\n        /// The found <see cref=\"ResourceManager\"/>\n        /// </returns>\n        /// <exception cref=\"System.InvalidOperationException\">\n        /// If the ResourceManagers cannot be looked up\n        /// </exception>\n        /// <exception cref=\"System.ArgumentException\">\n        /// If the searched <see cref=\"ResourceManager\"/> wasn't found\n        /// </exception>\n        protected ResourceManager GetResourceManager(string resourceAssembly, string resourceDictionary)\n        {\n            Assembly assembly = null;\n            string foundResource = null;\n            var resManagerNameToSearch = \".\" + resourceDictionary + ResourceFileExtension;\n\n            var resManKey = resourceAssembly + resManagerNameToSearch;\n\n            // Here comes our great hack for full VS2012+ design time support with multiple languages.\n            // We check only every second to reduce overhead in the designer.\n            var now = DateTime.Now;\n\n            if (AppDomain.CurrentDomain.FriendlyName.Contains(\"XDesProc\") && ((now - _lastUpdateCheck).TotalSeconds >= 1.0))\n            {\n                // This block is only handled during design time.\n                _lastUpdateCheck = now;\n\n                // Get the directory of the executing assembly (some strange path in the middle of nowhere on the disk and attach \"\\tmp\", e.g.:\n                // %userprofile%\\AppData\\Local\\Microsoft\\VisualStudio\\12.0\\Designer\\ShadowCache\\erys4uqz.oq1\\l24nfewi.r0y\\tmp\\\n                var assemblyDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? throw new InvalidOperationException(), \"tmp\");\n\n                // If not done yet, find the VS process that shows our design.\n                if (string.IsNullOrEmpty(_projectDirectory))\n                {\n                    foreach (var process in Process.GetProcesses())\n                    {\n                        if (!process.ProcessName.Contains(\".vshost\"))\n                            continue;\n\n                        // Get the executable path (all paths are cached now in order to reduce WMI load.\n                        _projectDirectory = Path.GetDirectoryName(GetExecutablePath(process.Id));\n\n                        if (string.IsNullOrEmpty(_projectDirectory))\n                            continue;\n\n                        // Get all files.\n                        var files = Directory.GetFiles(_projectDirectory, \"*.*\", SearchOption.AllDirectories);\n\n                        if (files.Count(f => Path.GetFileName(f).StartsWith(resourceAssembly)) > 0)\n                        {\n                            // We got a hit. Filter the files that are of interest for this provider.\n                            _projectFilesCache = files.Where(f => IsFileOfInterest(f, _projectDirectory)).ToArray();\n\n                            // Must break here - otherwise, we might catch another instance of VS.\n                            break;\n                        }\n                    }\n                }\n                else\n                {\n                    // Remove the resource manager from the dictionary.\n                    TryRemove(resManKey);\n\n                    // Copy all newer or missing files.\n                    foreach (var f in _projectFilesCache)\n                    {\n                        try\n                        {\n                            var dst = Path.Combine(assemblyDir, f.Replace(_projectDirectory + \"\\\\\", \"\"));\n\n                            if (!File.Exists(dst) || (Directory.GetLastWriteTime(dst) < Directory.GetLastWriteTime(f)))\n                            {\n                                var dstDir = Path.GetDirectoryName(dst);\n                                if (string.IsNullOrEmpty(dstDir))\n                                    continue;\n                                if (!Directory.Exists(dstDir))\n                                    Directory.CreateDirectory(dstDir);\n\n                                File.Copy(f, dst, true);\n                            }\n                        }\n                        // ReSharper disable once EmptyGeneralCatchClause\n                        catch\n                        {\n                        }\n                    }\n\n                    // Prepare and load (new) assembly.\n                    var file = Path.Combine(assemblyDir, resourceAssembly + \".exe\");\n                    if (!File.Exists(file))\n                        file = Path.Combine(assemblyDir, resourceAssembly + \".dll\");\n\n                    assembly = Assembly.LoadFrom(file);\n                }\n            }\n\n            if (!TryGetValue(resManKey, out var resManager))\n            {\n                // If the assembly cannot be loaded, throw an exception\n                if (assembly == null)\n                {\n                    try\n                    {\n                        // go through every assembly loaded in the app domain\n                        var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();\n                        foreach (var assemblyInAppDomain in loadedAssemblies)\n                        {\n                            // get the assembly name object\n                            var assemblyName = new AssemblyName(assemblyInAppDomain.FullName);\n\n                            // check if the name of the assembly is the seached one\n                            if (assemblyName.Name == resourceAssembly)\n                            {\n                                // assigne the assembly\n                                assembly = assemblyInAppDomain;\n\n                                // stop the search here\n                                break;\n                            }\n                        }\n\n                        // check if the assembly is still null\n                        if (assembly == null)\n                        {\n                            // assign the loaded assembly\n                            assembly = Assembly.Load(new AssemblyName(resourceAssembly));\n                        }\n                    }\n                    catch (Exception ex)\n                    {\n                        throw new Exception($\"The Assembly '{resourceAssembly}' cannot be loaded.\", ex);\n                    }\n                }\n\n                // get all available resourcenames\n                var availableResources = assembly.GetManifestResourceNames();\n\n                // get all available types (and ignore unloadable types, e.g. because of unsatisfied dependencies)\n                IEnumerable<Type> availableTypes;\n                try\n                {\n                    availableTypes = assembly.GetTypes();\n                }\n                catch (ReflectionTypeLoadException e)\n                {\n                    availableTypes = e.Types.Where(t => t != null);\n                }\n\n                // The proposed approach of Andras (http://wpflocalizeextension.codeplex.com/discussions/66098?ProjectName=wpflocalizeextension)\n#pragma warning disable IDE0062\n                string TryGetNamespace(Type type)\n                {\n                    // Ignore unloadable types\n                    try\n                    {\n                        return type.Namespace;\n                    }\n                    catch (Exception)\n                    {\n                        return null;\n                    }\n                }\n#pragma warning restore IDE0062\n\n                var possiblePrefixes = availableTypes.Select(TryGetNamespace).Where(n => n != null).Distinct().ToList();\n\n                foreach (var availableResource in availableResources)\n                {\n                    if (availableResource.EndsWith(resManagerNameToSearch) && possiblePrefixes.Any(p => availableResource.StartsWith(p + \".\")))\n                    {\n                        // take the first occurrence and break\n                        foundResource = availableResource;\n                        break;\n                    }\n                }\n\n                // NOTE: Inverted this IF (nesting is bad, I know) so we just create a new ResourceManager.  -gen3ric\n                if (foundResource != null)\n                {\n                    // remove \".resources\" from the end\n                    foundResource = foundResource.Substring(0, foundResource.Length - ResourceFileExtension.Length);\n\n                    // First try the simple retrieval\n                    Type resourceManagerType;\n                    try\n                    {\n                        resourceManagerType = assembly.GetType(foundResource);\n                    }\n                    catch (Exception)\n                    {\n                        resourceManagerType = null;\n                    }\n\n                    // If simple doesn't work, check all of the types without using dot notation\n                    if (resourceManagerType == null)\n                    {\n                        var dictTypeName = resourceDictionary.Replace('.', '_');\n\n                        bool MatchesDictTypeName(Type type)\n                        {\n                            // Ignore unloadable types\n                            try\n                            {\n                                return type.Name == dictTypeName;\n                            }\n                            catch (Exception)\n                            {\n                                return false;\n                            }\n                        }\n\n                        resourceManagerType = availableTypes.FirstOrDefault(MatchesDictTypeName);\n                    }\n\n                    resManager = GetResourceManagerFromType(resourceManagerType);\n                }\n                else\n                {\n                    //To be able to use Microsoft Resource like Key=PresentationCore:ExceptionStringTable:DeleteText. It is not detected at line 437\n                    if (resManagerNameToSearch.StartsWith(\".\"))\n                    {\n                        resManagerNameToSearch = resManagerNameToSearch.Remove(0, 1);\n                        resManagerNameToSearch = resManagerNameToSearch.Replace(ResourceFileExtension, string.Empty);\n                    }\n                    resManager = new ResourceManager(resManagerNameToSearch, assembly);\n                }\n\n                // if no one was found, exception\n                if (resManager == null)\n                    throw new ArgumentException(string.Format(\"No resource manager for dictionary '{0}' in assembly '{1}' found! ({1}.{0})\", resourceDictionary, resourceAssembly));\n\n                // Add the ResourceManager to the cachelist\n                Add(resManKey, resManager);\n\n                try\n                {\n                    // Look in all cultures and check available ressources.\n                    foreach (var c in SearchCultures)\n                    {\n                        var rs = resManager.GetResourceSet(c, true, false);\n                        if (rs != null)\n                            AddCulture(c);\n                    }\n                }\n                catch\n                {\n                    // ignored\n                }\n            }\n\n            // return the found ResourceManager\n            return resManager;\n        }\n\n        private ResourceManager GetResourceManagerFromType(IReflect type)\n        {\n            if (type == null)\n                return null;\n            try\n            {\n                var propInfo = type.GetProperty(ResourceManagerName, ResourceBindingFlags);\n\n                // get the GET-method from the methodinfo\n                var methodInfo = propInfo.GetGetMethod(true);\n\n                // cast it to a ResourceManager for better working with\n                return (ResourceManager)methodInfo.Invoke(null, null);\n            }\n            catch\n            {\n                return null;\n            }\n        }\n        #endregion\n\n        #region ILocalizationProvider implementation\n        /// <summary>\n        /// Uses the key and target to build a fully qualified resource key (Assembly, Dictionary, Key)\n        /// </summary>\n        /// <param name=\"key\">Key used as a base to find the full key</param>\n        /// <param name=\"target\">Target used to help determine key information</param>\n        /// <returns>Returns an object with all possible pieces of the given key (Assembly, Dictionary, Key)</returns>\n        public virtual FullyQualifiedResourceKeyBase GetFullyQualifiedResourceKey(string key, DependencyObject target)\n        {\n            if (string.IsNullOrEmpty(key))\n                return null;\n\n            ParseKey(key, out var assembly, out var dictionary, out key);\n\n            if (string.IsNullOrEmpty(assembly))\n                assembly = GetAssembly(target);\n\n            if (string.IsNullOrEmpty(dictionary))\n                dictionary = GetDictionary(target);\n\n            return new FQAssemblyDictionaryKey(key, assembly, dictionary);\n        }\n\n        /// <summary>\n        /// Gets fired when the provider changed.\n        /// </summary>\n        public event ProviderChangedEventHandler ProviderChanged;\n\n        /// <summary>\n        /// An event that is fired when an error occurred.\n        /// </summary>\n        public event ProviderErrorEventHandler ProviderError;\n\n        /// <summary>\n        /// An event that is fired when a value changed.\n        /// </summary>\n        public event ValueChangedEventHandler ValueChanged;\n\n        /// <summary>\n        /// Calls the <see cref=\"ILocalizationProvider.ProviderChanged\"/> event.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        protected virtual void OnProviderChanged(DependencyObject target)\n        {\n            try\n            {\n                var assembly = GetAssembly(target);\n                var dictionary = GetDictionary(target);\n\n                if (!string.IsNullOrEmpty(assembly) && !string.IsNullOrEmpty(dictionary))\n                    GetResourceManager(assembly, dictionary);\n            }\n            catch\n            {\n                // ignored\n            }\n\n            ProviderChanged?.Invoke(this, new ProviderChangedEventArgs(target));\n        }\n\n        /// <summary>\n        /// Calls the <see cref=\"ILocalizationProvider.ProviderError\"/> event.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"message\">The error message.</param>\n        protected virtual void OnProviderError(DependencyObject target, string key, string message)\n        {\n            ProviderError?.Invoke(this, new ProviderErrorEventArgs(target, key, message));\n        }\n\n        /// <summary>\n        /// Calls the <see cref=\"ILocalizationProvider.ValueChanged\"/> event.\n        /// </summary>\n        /// <param name=\"key\">The key where the value was changed.</param>\n        /// <param name=\"value\">The new value.</param>\n        /// <param name=\"tag\">A custom tag.</param>\n        protected virtual void OnValueChanged(string key, object value, object tag)\n        {\n            ValueChanged?.Invoke(this, new ValueChangedEventArgs(key, value, tag));\n        }\n\n        /// <summary>\n        /// Get the localized object.\n        /// </summary>\n        /// <param name=\"key\">The key to the value.</param>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"culture\">The culture to use.</param>\n        /// <returns>The value corresponding to the source/dictionary/key path for the given culture (otherwise NULL).</returns>\n        public virtual object GetLocalizedObject(string key, DependencyObject target, CultureInfo culture)\n        {\n            FQAssemblyDictionaryKey fqKey = (FQAssemblyDictionaryKey)GetFullyQualifiedResourceKey(key, target);\n\n            // Final validation of the values.\n            // Most important is key. fqKey may be null.\n            if (string.IsNullOrEmpty(fqKey?.Key))\n            {\n                OnProviderError(target, key, \"No key provided.\");\n                return null;\n            }\n            // fqKey cannot be null now\n            if (string.IsNullOrEmpty(fqKey.Assembly))\n            {\n                OnProviderError(target, key, \"No assembly provided.\");\n                return null;\n            }\n            if (string.IsNullOrEmpty(fqKey.Dictionary))\n            {\n                OnProviderError(target, key, \"No dictionary provided.\");\n                return null;\n            }\n\n            // declaring local resource manager\n            ResourceManager resManager;\n\n            // try to get the resouce manager\n            try\n            {\n                resManager = GetResourceManager(fqKey.Assembly, fqKey.Dictionary);\n            }\n            catch (Exception e)\n            {\n                OnProviderError(target, key, \"Error retrieving the resource manager.\\r\\n\" + e.Message);\n                return null;\n            }\n\n            // finally, return the searched object as type of the generic type\n            try\n            {\n                resManager.IgnoreCase = _ignoreCase;\n                var result = resManager.GetObject(fqKey.Key, culture);\n\n                if (result == null)\n                    OnProviderError(target, key, \"Missing key.\");\n\n                return result;\n            }\n            catch (Exception e)\n            {\n                OnProviderError(target, key, \"Error retrieving the resource.\\r\\n\" + e.Message);\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// An observable list of available cultures.\n        /// </summary>\n        public ObservableCollection<CultureInfo> AvailableCultures { get; protected set; }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Themes/Generic.xaml",
    "content": "﻿<ResourceDictionary\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:engine=\"clr-namespace:WPFLocalizeExtension.Deprecated.Engine\">\n    <Style TargetType=\"{x:Type engine:GapTextControl}\">\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type engine:GapTextControl}\">\n                    <Border BorderBrush=\"SaddleBrown\" BorderThickness=\"5\">\n                        <TextBlock x:Name=\"PART_TextBlock\"\n                               Background=\"Orange\"\n                               MinWidth=\"100\"\n                               MinHeight=\"100\" />\n                    </Border>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n</ResourceDictionary>\n"
  },
  {
    "path": "src/TypeConverters/BitmapSourceTypeConverter.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"BitmapSourceTypeConverter.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Bernhard Millauer</author>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.TypeConverters\n{\n    #region Usings\n    using System;\n    using System.ComponentModel;\n    using System.Drawing;\n    using System.Drawing.Imaging;\n    using System.Globalization;\n    using System.Windows;\n    using System.Windows.Media.Imaging;\n    #endregion\n\n    /// <summary>\n    /// A type converter class for Bitmap resources that are used in WPF.\n    /// </summary>\n    public class BitmapSourceTypeConverter : TypeConverter\n    {\n        /// <inheritdoc/>\n        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)\n        {\n            return sourceType == typeof(Bitmap);\n        }\n\n        /// <inheritdoc/>\n        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)\n        {\n            return destinationType == typeof(Bitmap);\n        }\n\n        /// <inheritdoc/>\n        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)\n        {\n            if (!(value is Bitmap bitmap))\n                return null;\n\n            var bmpPt = bitmap.GetHbitmap();\n\n            // create the bitmapSource\n            var bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(\n                bmpPt,\n                IntPtr.Zero,\n                Int32Rect.Empty,\n                BitmapSizeOptions.FromEmptyOptions());\n\n            // freeze the bitmap to avoid hooking events to the bitmap\n            bitmapSource.Freeze();\n\n            // free memory\n            DeleteObject(bmpPt);\n\n            // return bitmapSource\n            return bitmapSource;\n        }\n\n        /// <summary>\n        /// Frees memory of a pointer.\n        /// </summary>\n        /// <param name=\"o\">Object to remove from memory.</param>\n        /// <returns>0 if the removing was success, otherwise another number.</returns>\n        [System.Runtime.InteropServices.DllImport(\"gdi32.dll\")]\n        private static extern int DeleteObject(IntPtr o);\n\n        /// <inheritdoc/>\n        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)\n        {\n            var source = value as BitmapSource;\n\n            if (value == null)\n                return null;\n\n            var bmp = new Bitmap(\n                source.PixelWidth,\n                source.PixelHeight,\n                PixelFormat.Format32bppPArgb);\n\n            var data = bmp.LockBits(\n                new Rectangle(System.Drawing.Point.Empty, bmp.Size),\n                ImageLockMode.WriteOnly,\n                PixelFormat.Format32bppPArgb);\n\n            source.CopyPixels(\n                Int32Rect.Empty,\n                data.Scan0,\n                data.Height * data.Stride,\n                data.Stride);\n\n            bmp.UnlockBits(data);\n\n            return bmp;\n        }\n    }\n}"
  },
  {
    "path": "src/TypeConverters/DefaultConverter.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"StandardLocConverter.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.TypeConverters\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel;\n    using System.Globalization;\n    using System.Windows;\n    using System.Windows.Data;\n    #endregion\n\n    /// <summary>\n    /// Implements a standard converter that calls itself all known type converters.\n    /// </summary>\n    public class DefaultConverter : IValueConverter\n    {\n        private static readonly Dictionary<Type, TypeConverter> TypeConverters = new Dictionary<Type, TypeConverter>();\n\n        /// <summary>\n        /// Modifies the source data before passing it to the target for display in the UI.\n        /// </summary>\n        /// <param name=\"value\">The source data being passed to the target.</param>\n        /// <param name=\"targetType\">The <see cref=\"Type\"/> of data expected by the target dependency property.</param>\n        /// <param name=\"parameter\">An optional parameter to be used in the converter logic.</param>\n        /// <param name=\"culture\">The culture of the conversion.</param>\n        /// <returns>The value to be passed to the target dependency property.</returns>\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value == null)\n                return null;\n\n            object result;\n            var resourceType = value.GetType();\n\n            // Simplest cases: The target type is object or same as the input.\n            if (targetType == typeof(object) || resourceType == targetType)\n                return value;\n\n            // Register missing type converters - this class will do this only once per appdomain.\n            RegisterMissingTypeConverters.Register();\n\n            // Is the type already known?\n            if (!TypeConverters.ContainsKey(targetType))\n            {\n                var c = TypeDescriptor.GetConverter(targetType);\n\n                if (targetType == typeof(Thickness))\n                    c = new ThicknessConverter();\n\n                // Get the type converter and store it in the dictionary (even if it is NULL).\n                TypeConverters.Add(targetType, c);\n            }\n\n            // Get the converter.\n            var conv = TypeConverters[targetType];\n\n            // No converter or not convertable?\n            if (conv == null || !conv.CanConvertFrom(resourceType))\n                return null;\n\n            // Finally, try to convert the value.\n            try\n            {\n                result = conv.ConvertFrom(value);\n            }\n            catch\n            {\n                result = null;\n            }\n\n            return result;\n        }\n\n        /// <summary>\n        /// Modifies the target data before passing it to the source object.\n        /// </summary>\n        /// <param name=\"value\">The target data being passed to the source.</param>\n        /// <param name=\"targetType\">The <see cref=\"Type\"/> of data expected by the source object.</param>\n        /// <param name=\"parameter\">An optional parameter to be used in the converter logic.</param>\n        /// <param name=\"culture\">The culture of the conversion.</param>\n        /// <returns>The value to be passed to the source object.</returns>\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            return Convert(value, targetType, parameter, culture);\n        }\n    }\n}\n"
  },
  {
    "path": "src/TypeConverters/RegisterMissingTypeConverters.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"RegisterMissingTypeConverters.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.TypeConverters\n{\n    #region Usings\n    using System.ComponentModel;\n    using System.Windows.Media.Imaging;\n    #endregion\n\n    /// <summary>\n    /// Register missing type converters here.\n    /// </summary>\n    public static class RegisterMissingTypeConverters\n    {\n        /// <summary>\n        /// A flag indication if the registration was successful.\n        /// </summary>\n        private static bool _registered;\n\n        /// <summary>\n        /// Registers the missing type converters.\n        /// </summary>\n        public static void Register()\n        {\n            if (_registered)\n                return;\n\n            TypeDescriptor.AddAttributes(typeof(BitmapSource), new TypeConverterAttribute(typeof(BitmapSourceTypeConverter)));\n\n            _registered = true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/TypeConverters/ThicknessConverter.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"ThicknessConverter.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace WPFLocalizeExtension.TypeConverters\n{\n    #region Usings\n    using System.ComponentModel;\n    using System.Globalization;\n    using System.Windows;\n    #endregion\n\n    /// <summary>\n    /// A converter for the type <see cref=\"Thickness\"/>.\n    /// </summary>\n    public class ThicknessConverter : TypeConverter\n    {\n        /// <inheritdoc/>\n        public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType)\n        {\n            return sourceType == typeof(string);\n        }\n\n        /// <inheritdoc/>\n        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)\n        {\n            var result = new Thickness();\n            double d1, d2, d3, d4;\n\n            if (value is string s)\n            {\n                var parts = s.Split(\",\".ToCharArray());\n\n                switch (parts.Length)\n                {\n                    case 1:\n                        double.TryParse(parts[0], NumberStyles.Any, culture, out d1);\n                        result = new Thickness(d1);\n                        break;\n\n                    case 2:\n                        double.TryParse(parts[0], NumberStyles.Any, culture, out d1);\n                        double.TryParse(parts[1], NumberStyles.Any, culture, out d2);\n                        result = new Thickness(d1, d2, d1, d2);\n                        break;\n\n                    case 4:\n                        double.TryParse(parts[0], NumberStyles.Any, culture, out d1);\n                        double.TryParse(parts[1], NumberStyles.Any, culture, out d2);\n                        double.TryParse(parts[2], NumberStyles.Any, culture, out d3);\n                        double.TryParse(parts[3], NumberStyles.Any, culture, out d4);\n                        result = new Thickness(d1, d2, d3, d4);\n                        break;\n                }\n            }\n\n            return result;\n        }\n    }\n}"
  },
  {
    "path": "src/ValueConverters/PrependTypeConverter.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"BLoc.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Konrad Mattheis</author>\n#endregion\n\nnamespace WPFLocalizeExtension.ValueConverters\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Tasks;\n    using System.Windows.Data;\n    using System.Windows.Markup;\n    #endregion\n\n    /// <summary>\n    /// PrependTypeConverter allows to prepend the type of the value as string with the default _ separator. To change the default separator just us the converterparamater\n    /// </summary>\n    public class PrependTypeConverter : TypeValueConverterBase, IValueConverter\n    {\n        #region IValueConverter\n        /// <inheritdoc/>\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value != null)\n            {\n                var separator = \"_\";\n                if (parameter != null && parameter.GetType() == typeof(string))\n                    separator = parameter.ToString();\n                return value.GetType().Name + separator + value.ToString();\n            }\n\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        } \n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/ValueConverters/StringFormatConverter.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"BitmapSourceTypeConverter.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Konrad Mattheis</author>\n#endregion\n\nnamespace WPFLocalizeExtension.ValueConverters\n{\n    #region Usings\n    using System;\n    using System.Globalization;\n    using System.Reflection;\n    using System.Windows;\n    using System.Windows.Data;\n    using System.Linq;\n    #endregion\n\n    /// <summary>\n    /// Takes the first value as StringFormat and the other values as Parameter for the StringFormat\n    /// </summary>\n    public class StringFormatConverter : TypeValueConverterBase, IMultiValueConverter\n    {\n        private static MethodInfo miFormat = null;\n\n        #region IMultiValueConverter\n        /// <inheritdoc/>\n        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (miFormat == null)\n            {\n                try\n                {\n                    // try to load SmartFormat Assembly\n                    var asSmartFormat = Assembly.Load(\"SmartFormat\");\n                    var tt = asSmartFormat.GetType(\"SmartFormat.Smart\");\n                    miFormat = tt.GetMethod(\"Format\", BindingFlags.Static | BindingFlags.Public, null, new Type[] { typeof(string), typeof(object[]) }, null);\n                }\n                catch\n                {\n                    // fallback just take String.Format\n                    miFormat = typeof(string).GetMethod(\"Format\", BindingFlags.Static | BindingFlags.Public, null, new Type[] { typeof(string), typeof(object[]) }, null);\n                }\n            }\n\n            if (!targetType.IsAssignableFrom(typeof(string)))\n                throw new Exception(\"TargetType is not supported strings\");\n\n            if (values == null || values.Length < 1)\n                throw new Exception(\"Not enough parameters\");\n\n            if (values[0] == null)\n                return null;\n\n            if (values.Length > 1 && values[1] == DependencyProperty.UnsetValue)\n                return null;\n\n            var format = values[0].ToString();\n            if (values.Length == 1)\n                return format;\n\n            var args = values.Skip(1).ToArray();\n            return (string)miFormat.Invoke(null, new object[] { format, args });\n        }\n\n        /// <inheritdoc/>\n        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)\n        {\n            return null;\n        } \n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/ValueConverters/ToLowerConverter.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"BLoc.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Konrad Mattheis</author>\n#endregion\n\nnamespace WPFLocalizeExtension.ValueConverters\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Tasks;\n    using System.Windows.Data;\n    using System.Windows.Markup;\n    #endregion\n\n    /// <summary>\n    /// ToLowerConverter return the value as value.ToUpper()\n    /// </summary>\n    public class ToLowerConverter : TypeValueConverterBase, IValueConverter\n    {\n        #region IValueConverter\n        /// <inheritdoc/>\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value != null)\n            {\n                return value.ToString().ToLower();\n            }\n\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        } \n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/ValueConverters/ToUpperConverter.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"BLoc.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Konrad Mattheis</author>\n#endregion\n\nnamespace WPFLocalizeExtension.ValueConverters\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Tasks;\n    using System.Windows.Data;\n    using System.Windows.Markup;\n    #endregion\n\n    /// <summary>\n    /// ToUpperConverter return the value as value.ToUpper()\n    /// </summary>\n    public class ToUpperConverter : TypeValueConverterBase, IValueConverter\n    {\n        #region IValueConverter\n        /// <inheritdoc/>\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value != null)\n            {\n                return value.ToString().ToUpper();\n            }\n\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        } \n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/ValueConverters/TranslateConverter.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"BLoc.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Konrad Mattheis</author>\n#endregion\n\nnamespace WPFLocalizeExtension.ValueConverters\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Tasks;\n    using System.Windows.Data;\n    using System.Windows.Markup;\n    using WPFLocalizeExtension.Engine;\n    using WPFLocalizeExtension.Extensions;\n    #endregion\n\n    /// <summary>\n    /// Takes given value as resource key and translates it. If no text is found, the received value is returned.\n    /// </summary>\n    public class TranslateConverter : TypeValueConverterBase, IValueConverter, IMultiValueConverter\n    {\n        #region IMultiValueConverter\n        /// <inheritdoc/>\n        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (values != null && values.Length > 0)\n                return this.Convert(values[0], targetType, parameter, culture);\n\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n        #endregion\n\n        #region IValueConverter\n        /// <inheritdoc/>\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value != null)\n            {\n                try\n                {\n                    culture = LocalizeDictionary.Instance.SpecificCulture;\n                    var _key = value.ToString();\n\n                    var result = LocExtension.GetLocalizedValue(targetType, _key, culture, null);\n\n                    if (result == null)\n                    {\n                        var missingKeyEventResult = LocalizeDictionary.Instance.OnNewMissingKeyEvent(this, _key);\n\n                        if (LocalizeDictionary.Instance.OutputMissingKeys\n                            && !string.IsNullOrEmpty(_key) && (targetType == typeof(String) || targetType == typeof(object)))\n                        {\n                            if (missingKeyEventResult.MissingKeyResult != null)\n                                result = missingKeyEventResult.MissingKeyResult;\n                            else\n                                result = \"Key: \" + _key;\n                        }\n                    }\n                    return result;\n                }\n                catch\n                { }\n            }\n\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotSupportedException();\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/ValueConverters/TypeValueConverterBase.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"BLoc.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Konrad Mattheis</author>\n#endregion\n\nnamespace WPFLocalizeExtension.ValueConverters\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Tasks;\n    using System.Windows.Markup; \n    #endregion\n\n    /// <summary>\n    /// Baseclass for ValueTypeConvertes which implements easy usage as MarkupExtension\n    /// </summary>\n    public abstract class TypeValueConverterBase : MarkupExtension\n    {\n        #region MarkupExtension\n        /// <inheritdoc/>\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            return this;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/WPFLocalizeExtension.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\t<PropertyGroup>\n\t\t<TargetFrameworks>net452;net40;netcoreapp3.1</TargetFrameworks>\n\t\t<UseWPF>True</UseWPF>\n\t\t<AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n\t\t<AssemblyName>WPFLocalizeExtension</AssemblyName>\n\t\t<Version>$(GitVersion_NuGetVersion)</Version>\n\t\t<AssemblyTitle>WPFLocalizeExtension</AssemblyTitle>\n\t\t<Authors>Bernhard Millauer,Uwe Mayer, Konrad Mattheis</Authors>\n\t\t<PackageLicenseFile>LICENSE</PackageLicenseFile>\n\t\t<PackageProjectUrl>https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/</PackageProjectUrl>\n\t\t<RepositoryUrl>https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension.git</RepositoryUrl>\n\t\t<Copyright>Bernhard Millauer, Uwe Mayer, Konrad Mattheis</Copyright>\n\t\t<Description>LocalizationExtension is a really easy way to localize any type of DependencyProperties or native Properties on DependencyObjects</Description>\n\t\t<Company />\n\t\t<Product>WPF Localization Extension</Product>\n\t\t<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>\n\t\t<PackageReleaseNotes></PackageReleaseNotes>\n\t\t<NeutralLanguage>en-US</NeutralLanguage>\n\t\t<PackageTags>wpf localization extension globalization resx csv resource language</PackageTags>\n\t\t<NoWarn>NU5105</NoWarn>\n\n\t\t<PublishRepositoryUrl>true</PublishRepositoryUrl>\n\t\t<EmbedUntrackedSources>true</EmbedUntrackedSources>\n\t\t<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>\n\t\t<SignAssembly>true</SignAssembly>\n\t\t<DelaySign>false</DelaySign>\n\t\t<PublicSign>true</PublicSign>\n\t\t<AssemblyOriginatorKeyFile>public.snk</AssemblyOriginatorKeyFile>\n\t\t<!--Workaround for Error\tMSB4216\tCould not run the \"GenerateResource\" -->\n\t\t<GenerateResourceMSBuildArchitecture>CurrentArchitecture</GenerateResourceMSBuildArchitecture>\n\n\t\t<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>\n\n\t\t<GeneratePackageOnBuild>false</GeneratePackageOnBuild>\n\t\t<GenerateDocumentationFile>false</GenerateDocumentationFile>\n\n\t\t<UnSignedFlag></UnSignedFlag>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<None Include=\"..\\LICENSE\" Pack=\"true\" PackagePath=\"\" />\n\t\t<None Remove=\"packages.lock.json\" />\n\t\t<None Remove=\"public.snk\" />\n\t</ItemGroup>\n  \n\t<PropertyGroup Condition=\"'$(Configuration)' == 'Release'\">\n\t\t<GeneratePackageOnBuild>true</GeneratePackageOnBuild>\n\t\t<GenerateDocumentationFile>true</GenerateDocumentationFile>\n\t</PropertyGroup>\n\n\t<PropertyGroup Condition=\"Exists('$(SolutionDir)\\src\\fullkey.snk')\">\n\t\t<PublicSign>false</PublicSign>\n\t\t<AssemblyOriginatorKeyFile>fullkey.snk</AssemblyOriginatorKeyFile>\n\t</PropertyGroup>\n\n\t<PropertyGroup Condition=\"'$(UnSigned)' == 'true'\">\n\t\t<SignAssembly>false</SignAssembly>\n\t\t<PublicSign>false</PublicSign>\n\t\t<AssemblyOriginatorKeyFile></AssemblyOriginatorKeyFile>\n\t\t<PackageId>$(AssemblyName).UnSigned</PackageId>\n\t\t<UnSignedFlag>.UnSigned</UnSignedFlag>\n\t\t <!--we can handle only one packages.lock.json so for now for unsigned just disable the usages--> \n\t\t<RestorePackagesWithLockFile>false</RestorePackagesWithLockFile>\n\t</PropertyGroup>\n  \n\t<!--References for .Net Framwork 4 and 35-->\n\t<ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n\t\t<Reference Include=\"System.Management\" />\n\t</ItemGroup>\n\n\t<!--References for .Net Core 3.x-->\n\t<ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n\t\t<PackageReference Include=\"System.Management\" Version=\"7.0.0\" />\n\t\t<PackageReference Include=\"System.Drawing.Common\" Version=\"7.0.0\" />\n\t</ItemGroup>\n\n\t<!--PackageReference for all framworks-->\n\t<ItemGroup>\n\t\t<PackageReference Include=\"Microsoft.SourceLink.GitHub\" Version=\"1.1.1\" PrivateAssets=\"All\" />\n    <PackageReference Include=\"GitVersion.MsBuild\" Version=\"5.12.0\" PrivateAssets=\"all\" />\n\t</ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"XAMLMarkupExtensions$(UnSignedFlag)\" Version=\"2.1.3\" />\n  </ItemGroup>\n\n\t<Target Name=\"PublishToNugetWithAPIKey\" AfterTargets=\"GenerateNuspec\">\n\t\t<ReadLinesFromFile Condition=\"Exists('$(SolutionDir)\\..\\..\\nugetapikey.txt')\" File=\"$(SolutionDir)\\..\\..\\nugetapikey.txt\">\n\t\t\t<Output TaskParameter=\"Lines\" PropertyName=\"NugetAPIKey\" />\n\t\t</ReadLinesFromFile>\n\t\t<Exec Condition=\"('$(NugetAPIKey)' != '')\" WorkingDirectory=\"$(BaseDir)\" Command=\"dotnet nuget push $(PackageOutputAbsolutePath)$(PackageId).$(PackageVersion).nupkg -k $(NugetAPIKey) -s https://api.nuget.org/v3/index.json\" />\n\t</Target>\n\n\t<Target Name=\"FixOnGitVersionTaskError\" BeforeTargets=\"GetAssemblyVersion\">\n\t\t<CreateProperty Value=\"0.0.1-notgitversion\" Condition=\"'$(GitVersion_NuGetVersion)' == ''\">\n\t\t\t<Output TaskParameter=\"Value\" PropertyName=\"Version\" />\n\t\t</CreateProperty>\n\t</Target>\n</Project>\n"
  },
  {
    "path": "src/WPFLocalizeExtension.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28010.2019\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WPFLocalizeExtension\", \"WPFLocalizeExtension.csproj\", \"{E8C5B094-2CB4-4C26-87F0-351B03612179}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {A2E7E737-0020-457E-924B-1A8F5D9CF409}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/XmlnsPrefix.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"XmlnsDefinitions.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/blob/master/LICENSE\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nusing System.Windows.Markup;\n\n// Register this namespace one with prefix\n[assembly: XmlnsDefinition(\"http://wpflocalizeextension.codeplex.com\", \"WPFLocalizeExtension.Engine\")]\n[assembly: XmlnsDefinition(\"http://wpflocalizeextension.codeplex.com\", \"WPFLocalizeExtension.Extensions\")]\n[assembly: XmlnsDefinition(\"http://wpflocalizeextension.codeplex.com\", \"WPFLocalizeExtension.Providers\")]\n[assembly: XmlnsDefinition(\"http://wpflocalizeextension.codeplex.com\", \"WPFLocalizeExtension.TypeConverters\")]\n[assembly: XmlnsDefinition(\"http://wpflocalizeextension.codeplex.com\", \"WPFLocalizeExtension.ValueConverters\")]\n[assembly: XmlnsDefinition(\"http://wpflocalizeextension.codeplex.com\", \"WPFLocalizeExtension.Deprecated.Engine\")]\n[assembly: XmlnsDefinition(\"http://wpflocalizeextension.codeplex.com\", \"WPFLocalizeExtension.Deprecated.Extensions\")]\n[assembly: XmlnsDefinition(\"http://wpflocalizeextension.codeplex.com\", \"WPFLocalizeExtension.Deprecated.Providers\")]\n\n\n[assembly: XmlnsDefinition(\"https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension\", \"WPFLocalizeExtension.Engine\")]\n[assembly: XmlnsDefinition(\"https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension\", \"WPFLocalizeExtension.Extensions\")]\n[assembly: XmlnsDefinition(\"https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension\", \"WPFLocalizeExtension.Providers\")]\n[assembly: XmlnsDefinition(\"https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension\", \"WPFLocalizeExtension.TypeConverters\")]\n[assembly: XmlnsDefinition(\"https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension\", \"WPFLocalizeExtension.ValueConverters\")]\n\n// Assign a default namespace prefix for the schema\n[assembly: XmlnsPrefix(\"http://wpflocalizeextension.codeplex.com\", \"lex\")]\n"
  },
  {
    "path": "src/packages.lock.json",
    "content": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \".NETCoreApp,Version=v3.1\": {\n      \"GitVersion.MsBuild\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[5.7.0, )\",\n        \"resolved\": \"5.7.0\",\n        \"contentHash\": \"GkU83uopX2vjuNkVpfWdoZSPwxVJ2V6JGLbu4lfh9ucD9xKLuekYx11Ksy1lhbv4hWlrq1xZ0cH0PaPf4UOyqA==\"\n      },\n      \"Microsoft.SourceLink.GitHub\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[1.0.0, )\",\n        \"resolved\": \"1.0.0\",\n        \"contentHash\": \"aZyGyGg2nFSxix+xMkPmlmZSsnGQ3w+mIG23LTxJZHN+GPwTQ5FpPgDo7RMOq+Kcf5D4hFWfXkGhoGstawX13Q==\",\n        \"dependencies\": {\n          \"Microsoft.Build.Tasks.Git\": \"1.0.0\",\n          \"Microsoft.SourceLink.Common\": \"1.0.0\"\n        }\n      },\n      \"System.Drawing.Common\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[5.0.2, )\",\n        \"resolved\": \"5.0.2\",\n        \"contentHash\": \"rvr/M1WPf24ljpvvrVd74+NdjRUJu1bBkspkZcnzSZnmAUQWSvanlQ0k/hVHk+cHufZbZfu7vOh/vYc0q5Uu/A==\",\n        \"dependencies\": {\n          \"Microsoft.Win32.SystemEvents\": \"5.0.0\"\n        }\n      },\n      \"System.Management\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[5.0.0, )\",\n        \"resolved\": \"5.0.0\",\n        \"contentHash\": \"MF1CHaRcC+MLFdnDthv4/bKWBZnlnSpkGqa87pKukQefgEdwtb9zFW6zs0GjPp73qtpYYg4q6PEKbzJbxCpKfw==\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"5.0.0\",\n          \"Microsoft.Win32.Registry\": \"5.0.0\",\n          \"System.CodeDom\": \"5.0.0\"\n        }\n      },\n      \"XAMLMarkupExtensions\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[2.1.0, )\",\n        \"resolved\": \"2.1.0\",\n        \"contentHash\": \"3FKlGMp6PxB2zMjyz23xhpOGacxmIOirh70xo+AbjL5c0gYpVONJZq4dPP5ynd6TOCg30BXMSsyNEmK76yyYrg==\"\n      },\n      \"Microsoft.Build.Tasks.Git\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"1.0.0\",\n        \"contentHash\": \"z2fpmmt+1Jfl+ZnBki9nSP08S1/tbEOxFdsK1rSR+LBehIJz1Xv9/6qOOoGNqlwnAGGVGis1Oj6S8Kt9COEYlQ==\"\n      },\n      \"Microsoft.NETCore.Platforms\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"5.0.0\",\n        \"contentHash\": \"VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==\"\n      },\n      \"Microsoft.SourceLink.Common\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"1.0.0\",\n        \"contentHash\": \"G8DuQY8/DK5NN+3jm5wcMcd9QYD90UV7MiLmdljSJixi3U/vNaeBKmmXUqI4DJCOeWizIUEh4ALhSt58mR+5eg==\"\n      },\n      \"Microsoft.Win32.Registry\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"5.0.0\",\n        \"contentHash\": \"dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==\",\n        \"dependencies\": {\n          \"System.Security.AccessControl\": \"5.0.0\",\n          \"System.Security.Principal.Windows\": \"5.0.0\"\n        }\n      },\n      \"Microsoft.Win32.SystemEvents\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"5.0.0\",\n        \"contentHash\": \"Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"5.0.0\"\n        }\n      },\n      \"System.CodeDom\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"5.0.0\",\n        \"contentHash\": \"JPJArwA1kdj8qDAkY2XGjSWoYnqiM7q/3yRNkt6n28Mnn95MuEGkZXUbPBf7qc3IjwrGY5ttQon7yqHZyQJmOQ==\"\n      },\n      \"System.Security.AccessControl\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"5.0.0\",\n        \"contentHash\": \"dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"5.0.0\",\n          \"System.Security.Principal.Windows\": \"5.0.0\"\n        }\n      },\n      \"System.Security.Principal.Windows\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"5.0.0\",\n        \"contentHash\": \"t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==\"\n      }\n    },\n    \".NETFramework,Version=v4.0\": {\n      \"GitVersion.MsBuild\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[5.7.0, )\",\n        \"resolved\": \"5.7.0\",\n        \"contentHash\": \"GkU83uopX2vjuNkVpfWdoZSPwxVJ2V6JGLbu4lfh9ucD9xKLuekYx11Ksy1lhbv4hWlrq1xZ0cH0PaPf4UOyqA==\"\n      },\n      \"Microsoft.SourceLink.GitHub\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[1.0.0, )\",\n        \"resolved\": \"1.0.0\",\n        \"contentHash\": \"aZyGyGg2nFSxix+xMkPmlmZSsnGQ3w+mIG23LTxJZHN+GPwTQ5FpPgDo7RMOq+Kcf5D4hFWfXkGhoGstawX13Q==\",\n        \"dependencies\": {\n          \"Microsoft.Build.Tasks.Git\": \"1.0.0\",\n          \"Microsoft.SourceLink.Common\": \"1.0.0\"\n        }\n      },\n      \"XAMLMarkupExtensions\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[2.1.0, )\",\n        \"resolved\": \"2.1.0\",\n        \"contentHash\": \"3FKlGMp6PxB2zMjyz23xhpOGacxmIOirh70xo+AbjL5c0gYpVONJZq4dPP5ynd6TOCg30BXMSsyNEmK76yyYrg==\"\n      },\n      \"Microsoft.Build.Tasks.Git\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"1.0.0\",\n        \"contentHash\": \"z2fpmmt+1Jfl+ZnBki9nSP08S1/tbEOxFdsK1rSR+LBehIJz1Xv9/6qOOoGNqlwnAGGVGis1Oj6S8Kt9COEYlQ==\"\n      },\n      \"Microsoft.SourceLink.Common\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"1.0.0\",\n        \"contentHash\": \"G8DuQY8/DK5NN+3jm5wcMcd9QYD90UV7MiLmdljSJixi3U/vNaeBKmmXUqI4DJCOeWizIUEh4ALhSt58mR+5eg==\"\n      }\n    },\n    \".NETFramework,Version=v4.5.2\": {\n      \"GitVersion.MsBuild\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[5.7.0, )\",\n        \"resolved\": \"5.7.0\",\n        \"contentHash\": \"GkU83uopX2vjuNkVpfWdoZSPwxVJ2V6JGLbu4lfh9ucD9xKLuekYx11Ksy1lhbv4hWlrq1xZ0cH0PaPf4UOyqA==\"\n      },\n      \"Microsoft.SourceLink.GitHub\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[1.0.0, )\",\n        \"resolved\": \"1.0.0\",\n        \"contentHash\": \"aZyGyGg2nFSxix+xMkPmlmZSsnGQ3w+mIG23LTxJZHN+GPwTQ5FpPgDo7RMOq+Kcf5D4hFWfXkGhoGstawX13Q==\",\n        \"dependencies\": {\n          \"Microsoft.Build.Tasks.Git\": \"1.0.0\",\n          \"Microsoft.SourceLink.Common\": \"1.0.0\"\n        }\n      },\n      \"XAMLMarkupExtensions\": {\n        \"type\": \"Direct\",\n        \"requested\": \"[2.1.0, )\",\n        \"resolved\": \"2.1.0\",\n        \"contentHash\": \"3FKlGMp6PxB2zMjyz23xhpOGacxmIOirh70xo+AbjL5c0gYpVONJZq4dPP5ynd6TOCg30BXMSsyNEmK76yyYrg==\"\n      },\n      \"Microsoft.Build.Tasks.Git\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"1.0.0\",\n        \"contentHash\": \"z2fpmmt+1Jfl+ZnBki9nSP08S1/tbEOxFdsK1rSR+LBehIJz1Xv9/6qOOoGNqlwnAGGVGis1Oj6S8Kt9COEYlQ==\"\n      },\n      \"Microsoft.SourceLink.Common\": {\n        \"type\": \"Transitive\",\n        \"resolved\": \"1.0.0\",\n        \"contentHash\": \"G8DuQY8/DK5NN+3jm5wcMcd9QYD90UV7MiLmdljSJixi3U/vNaeBKmmXUqI4DJCOeWizIUEh4ALhSt58mR+5eg==\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "tests/AssemblyTest/App.xaml",
    "content": "﻿<Application x:Class=\"AssemblyTest.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n\n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "tests/AssemblyTest/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Windows;\n\nnamespace AssemblyTest\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/AssemblyTest.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n    <!--Workaround for Error\tMSB4216\tCould not run the \"GenerateResource\" -->\n    <GenerateResourceMSBuildArchitecture>CurrentArchitecture</GenerateResourceMSBuildArchitecture>\n    <RootNamespace>AssemblyTest</RootNamespace>\n\t\t<OutputType>WinExe</OutputType>\n\t\t<StartupObject />\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<!-- Resources -->\n\t\t<None Update=\"Example.csv\">\n\t\t  <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n\t\t</None>\n\t\t<None Update=\"Example.de.csv\">\n\t\t  <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n\t\t</None>\n\t</ItemGroup>\n  \n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t\t<ProjectReference Include=\"..\\AssemblyTestResourceLib\\AssemblyTestResourceLib.csproj\" />\n\t\t<ProjectReference Include=\"..\\ProviderExample\\ProviderExample.csproj\" />\n\t</ItemGroup>\n</Project>"
  },
  {
    "path": "tests/AssemblyTest/CaseConverter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Data;\n\nnamespace AssemblyTest\n{\n    public class CaseConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (!(parameter is string) || !(value is string))\n                return Binding.DoNothing;\n\n            var input = (string)value;\n\n            if ((string)parameter == \"Upper\")\n                return input.ToUpper();\n            else if ((string)parameter == \"Lower\")\n                return input.ToLower();\n            else\n                return input;\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/CountryRes.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.269\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace AssemblyTest {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class CountryRes {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal CountryRes() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"AssemblyTest.CountryRes\", typeof(CountryRes).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Area.\n        /// </summary>\n        internal static string Area {\n            get {\n                return ResourceManager.GetString(\"Area\", resourceCulture);\n            }\n        }\n        \n        internal static System.Drawing.Bitmap Austria {\n            get {\n                object obj = ResourceManager.GetObject(\"Austria\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Country.\n        /// </summary>\n        internal static string Country {\n            get {\n                return ResourceManager.GetString(\"Country\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Country.\n        /// </summary>\n        internal static string CountryKey {\n            get {\n                return ResourceManager.GetString(\"CountryKey\", resourceCulture);\n            }\n        }\n        \n        internal static System.Drawing.Bitmap France {\n            get {\n                object obj = ResourceManager.GetObject(\"France\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Bitmap Germany {\n            get {\n                object obj = ResourceManager.GetObject(\"Germany\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to {0} sqkm.\n        /// </summary>\n        internal static string TestFormat {\n            get {\n                return ResourceManager.GetString(\"TestFormat\", resourceCulture);\n            }\n        }\n        \n        internal static System.Drawing.Bitmap United_Kingdom {\n            get {\n                object obj = ResourceManager.GetObject(\"United_Kingdom\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/CountryRes.de.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Area\" xml:space=\"preserve\">\n    <value>Fläche</value>\n  </data>\n  <data name=\"Country\" xml:space=\"preserve\">\n    <value>Land</value>\n  </data>\n  <data name=\"CountryKey\" xml:space=\"preserve\">\n    <value>CountryDE</value>\n  </data>\n  <data name=\"TestFormat\" xml:space=\"preserve\">\n    <value>{0} km²</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTest/CountryRes.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Area\" xml:space=\"preserve\">\n    <value>Area</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"Austria\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>resources\\austria.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Country\" xml:space=\"preserve\">\n    <value>Country</value>\n  </data>\n  <data name=\"CountryKey\" xml:space=\"preserve\">\n    <value>Country</value>\n  </data>\n  <data name=\"France\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>resources\\france.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Germany\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>resources\\germany.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"TestFormat\" xml:space=\"preserve\">\n    <value>{0} sqkm</value>\n  </data>\n  <data name=\"United_Kingdom\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>resources\\united_kingdom.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTest/Example.csv",
    "content": "﻿Key;Value\nButtonAssembly_Background;Aqua\nButtonAssembly_Content;Change Assembly!\nButtonAssembly_FlowDirection;LeftToRight\nButtonAssembly_Margin;10,5,20,15\nButtonAssembly_Width;150\nButtonDE;de\nButtonEN;en\nTestText;This is a test.\nWidth;75\nArea;Area\nCountry;Country\nCountryKey;Country\nTestFormat;The area of {0} amounts {1} sqkm.\nTab1;Foo\nTab2;Bar\nTab3;Baz\nTestEnum_Input;InputCSV\nTestEnum_Output;OutputCSV\nTestEnum_Processing;ProcessingCSV"
  },
  {
    "path": "tests/AssemblyTest/Example.de.csv",
    "content": "﻿Key;Value\nButtonAssembly_Background;Yellow\nButtonAssembly_Content;Assembly ändern!\nButtonAssembly_FlowDirection;RightToLeft\nButtonAssembly_Margin;5\nButtonAssembly_Width;100\nButtonDE;de\nButtonEN;en\nTestText;Dies ist ein Test.\nArea;Fläche\nCountry;Land\nCountryKey;CountryDE\nTestFormat;Die Fläche von {0} beträgt {1} km².\nTab1;Bla\nTab2;Blup\nTab3;Tralala\nTestEnum_Input;EingabeCSV\nTestEnum_Output;AusgabeCSV\nTestEnum_Processing;VerarbeitungCSV"
  },
  {
    "path": "tests/AssemblyTest/Item.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace AssemblyTest\n{\n    public class Item : ViewModelBase\n    {\n        public string DisplayName\n        {\n            get { return \"HOW TO GET TRANSLATED VALUE ?!\"; }\n        }\n\n        public string TranslationKey { get; set; }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"AssemblyTest.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:lex=\"http://wpflocalizeextension.codeplex.com\"\n        xmlns:Example=\"clr-namespace:ProviderExample;assembly=ProviderExample\"\n        xmlns:Ext=\"clr-namespace:XAMLMarkupExtensions.Strings;assembly=XAMLMarkupExtensions\"\n        xmlns:Local=\"clr-namespace:AssemblyTest\"\n        xmlns:c=\"clr-namespace:System.Collections.Generic;assembly=mscorlib\"\n        xmlns:scm=\"clr-namespace:System.ComponentModel;assembly=WindowsBase\"\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\n        lex:LocalizeDictionary.DesignCulture=\"en\"\n        lex:LocalizeDictionary.OutputMissingKeys=\"True\"\n        lex:ResxLocalizationProvider.DefaultAssembly=\"AssemblyTestResourceLib\"\n        lex:ResxLocalizationProvider.DefaultDictionary=\"Strings\"\n        Title=\"MainWindow\"\n        mc:Ignorable=\"d\"\n        d:DataContext=\"{d:DesignInstance Type={x:Type Local:MyViewModel}, IsDesignTimeCreatable=True}\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" Height=\"479\" Width=\"329\"\n\n   \n        lex:LocalizeDictionary.DefaultProvider=\"{x:Static lex:InheritingResxLocalizationProvider.Instance}\"\n        lex:InheritingResxLocalizationProvider.DefaultAssembly=\"AssemblyTestResourceLib\"\n        lex:InheritingResxLocalizationProvider.DefaultDictionary=\"Strings\">\n    <!--Use this syntax to set the inheriting provider-->\n    \n    <!-- **********************************************************************\n    Uncomment the block below to test the CSV provider for the entire window\n    or copy it to an arbitrary location to affect just the particular sub tree.\n    Note: Values can only be resolved at design-time if the project is set as\n    StartUp project in Visual Studio.\n    This provider is not tested under Blend.\n    ************************************************************************-->\n    <!--<lex:LocalizeDictionary.Provider>\n        <Example:CSVLocalizationProvider FileName=\"Example\" HasHeader=\"True\" />\n    </lex:LocalizeDictionary.Provider>-->\n    <Window.Resources>\n        <Example:CSVLocalizationProvider x:Key=\"CSVProvider\" FileName=\"Example\" HasHeader=\"True\" />\n\n        <DataTemplate x:Key=\"TestTemplate\">\n            <Border>\n                <Grid Margin=\"5\">\n                    <Grid.Resources>\n                        <ResourceDictionary>\n                            <lex:LocExtension x:Key=\"LocalizedImage\" x:Name=\"LocalizedImage\" />\n                        </ResourceDictionary>\n                    </Grid.Resources>\n                    <Grid.ColumnDefinitions>\n                        <ColumnDefinition Width=\"100\" />\n                        <ColumnDefinition Width=\"Auto\" />\n                        <ColumnDefinition />\n                    </Grid.ColumnDefinitions>\n                    <Grid.RowDefinitions>\n                        <RowDefinition />\n                        <RowDefinition />\n                    </Grid.RowDefinitions>\n                    <lex:LocBinding Source=\"{Binding FlagSource}\" Target=\"{x:Reference LocalizedImage}\" />\n                    <Image Grid.RowSpan=\"3\" Grid.Column=\"0\" Height=\"50\" Source=\"{x:Reference LocalizedImage}\" />\n                    <Label Grid.Row=\"0\" Grid.Column=\"1\" Content=\"{lex:Loc Country}\" />\n                    <Label Grid.Row=\"0\" Grid.Column=\"2\" Content=\"{Binding Country}\" />\n                    <Label Grid.Row=\"1\" Grid.Column=\"1\" Content=\"{lex:Loc Area}\" />\n                    <Local:StringFormatProxy x:Name=\"SFP\" Value=\"{Binding Area}\" StringFormat=\"{lex:Loc TestFormat}\" />\n                    <TextBlock Padding=\"5\" Grid.Row=\"1\" Grid.Column=\"2\" Text=\"{Binding Result, ElementName=SFP}\" />\n                </Grid>\n            </Border>\n        </DataTemplate>\n    </Window.Resources>\n    <Grid>\n        <Grid.Resources>\n            <Local:CaseConverter x:Key=\"CaseConverter\" />\n        </Grid.Resources>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"25\" />\n            <RowDefinition Height=\"25\" />\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"100\" />\n            <RowDefinition Height=\"*\" />\n            <RowDefinition Height=\"25\" />\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"Auto\" />\n        </Grid.RowDefinitions>\n        <ComboBox ItemsSource=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=MergedAvailableCultures}\"\n                  SelectedItem=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=Culture}\"\n                  DisplayMemberPath=\"NativeName\"\n                  Margin=\"2\"/>\n        <StackPanel Name=\"TestPanel\" Grid.Row=\"1\" Orientation=\"Horizontal\" HorizontalAlignment=\"Center\" lex:ResxLocalizationProvider.DefaultDictionary=\"Strings2\">\n            <Button Name=\"ButtonDE\" Height=\"23\" Width=\"75\" CommandParameter=\"de\" Command=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=SetCultureCommand}\" lex:ResxLocalizationProvider.DefaultAssembly=\"AssemblyTestResourceLib\">\n                <lex:FELoc />\n            </Button>\n            <Button Content=\"{lex:Loc ButtonEN, Converter={StaticResource CaseConverter}, ConverterParameter=Lower}\" Height=\"23\" Width=\"75\" CommandParameter=\"\" Command=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=SetCultureCommand}\" />\n            <Button Content=\"{lex:Loc ButtonEN}\" Height=\"23\" Width=\"75\" CommandParameter=\"\" Command=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=SetCultureCommand}\" />\n        </StackPanel>\n        <Button Grid.Row=\"2\" HorizontalAlignment=\"Center\" Name=\"ButtonAssembly\" Click=\"ButtonAssembly_Click\" Content=\"{lex:LocText FormatSegment1=A}\" Width=\"{lex:Loc}\" Margin=\"{lex:Loc}\" Background=\"{lex:Loc}\" FlowDirection=\"{lex:Loc}\" />\n        <Image Grid.Row=\"3\" Source=\"{lex:Loc TestImage}\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" />\n        <ListBox Grid.Row=\"4\" ItemTemplate=\"{DynamicResource TestTemplate}\" lex:ResxLocalizationProvider.DefaultAssembly=\"AssemblyTest\" lex:ResxLocalizationProvider.DefaultDictionary=\"CountryRes\">\n            <Local:Countries Country=\"Austria\" CountryDE=\"Österreich\" Area=\"83855\" />\n            <Local:Countries Country=\"France\" CountryDE=\"Frankreich\" Area=\"543965\" />\n            <Local:Countries Country=\"Germany\" CountryDE=\"Deutschland\" Area=\"357039\" />\n            <Local:Countries Country=\"United Kingdom\" CountryDE=\"Großbrittanien\" Area=\"244103\" />\n        </ListBox>\n        <!--<TextBlock Grid.Row=\"5\" Text=\"{Binding ElementName=Proxy, Path=Result}\">\n            <lex:LocProxy Name=\"Proxy\" PrependType=\"True\"\n                          Source=\"{Binding EnumValue}\" />\n        </TextBlock>-->\n        <TextBlock Grid.Row=\"5\" Text=\"{Binding ElementName=Proxy, Path=Result}\">\n            <lex:EnumRun PrependType=\"True\" EnumValue=\"{Binding EnumValue}\" />\n        </TextBlock>\n        <!--<TextBox Grid.Row=\"5\" lex:ResxLocalizationProvider.DefaultAssembly=\"AssemblyTest\" lex:ResxLocalizationProvider.DefaultDictionary=\"CountryRes\">\n            <TextBox.Text>\n                <Ext:CatExtension Format=\"Nested list test: {0} - {1}\">\n                    <lex:LocExtension Key=\"Country\" />\n                    <lex:LocExtension Key=\"Area\" />\n                </Ext:CatExtension>\n            </TextBox.Text>\n        </TextBox>-->\n        <lex:EnumComboBox Grid.Row=\"6\" Margin=\"2\" PrependType=\"True\" lex:LocalizeDictionary.Provider=\"{StaticResource ResourceKey=CSVProvider}\" Type=\"{x:Type Local:TestEnum}\">\n            <!--<lex:EnumComboBox.ItemTemplate>\n                <DataTemplate>\n                    <TextBlock><lex:EnumRun EnumValue=\"{Binding}\" PrependType=\"{Binding PrependType, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=lex:EnumComboBox}}\" /></TextBlock>\n                </DataTemplate>\n            </lex:EnumComboBox.ItemTemplate>-->\n            <!--<lex:EnumComboBox.Style>\n                <Style TargetType=\"{x:Type lex:EnumComboBox}\">\n                    <Setter Property=\"ItemTemplate\">\n                        <Setter.Value>\n                            <DataTemplate>\n                                <Grid>\n                                    <lex:LocProxy Source=\"{Binding}\" x:Name=\"Proxy\" PrependType=\"True\" />\n                                    <TextBlock Text=\"{Binding Result, ElementName=Proxy}\" Margin=\"2\" FontWeight=\"Normal\" />\n                                </Grid>\n                            </DataTemplate>\n                        </Setter.Value>\n                    </Setter>\n                </Style>\n            </lex:EnumComboBox.Style>-->\n        </lex:EnumComboBox>\n        <!--<TextBox Grid.Row=\"6\" lex:ResxLocalizationProvider.DefaultAssembly=\"AssemblyTest\" lex:ResxLocalizationProvider.DefaultDictionary=\"CountryRes\">\n            <TextBox.Text>\n                <MultiBinding StringFormat=\"Binding test (no design time!): {0} - {1}\">\n                    <MultiBinding.Bindings>\n                        <lex:BLoc Key=\"AssemblyTest:CountryRes:Country\" />\n                        <lex:BLoc Key=\"AssemblyTest:CountryRes:Area\" />\n                    </MultiBinding.Bindings>\n                </MultiBinding>\n            </TextBox.Text>\n        </TextBox>-->\n        <TabControl Grid.Row=\"7\" ItemsSource=\"{Binding Items}\">\n            <TabControl.ItemTemplate>\n                <DataTemplate DataType=\"{x:Type TabItem}\">\n                    <StackPanel Orientation=\"Horizontal\">\n                        <StackPanel.Resources>\n                            <lex:LocExtension x:Key=\"LocalizedHeader\" x:Name=\"LocalizedHeader\" />\n                        </StackPanel.Resources>\n                        <lex:LocBinding Source=\"{Binding TranslationKey}\" Target=\"{x:Reference LocalizedHeader}\" />\n                        <TextBlock Text=\"{x:Reference LocalizedHeader}\" />\n                    </StackPanel>\n                </DataTemplate>\n            </TabControl.ItemTemplate>\n        </TabControl>\n        <FlowDocumentScrollViewer Grid.Row=\"8\">\n            <FlowDocument>\n                <Paragraph>\n                    <!--<Run Text=\"{lex:Loc ButtonDE}\" />-->\n                    <!--<Run Name=\"TestObject\" lex:ResxLocalizationProvider.DefaultAssembly=\"AssemblyTest\" lex:ResxLocalizationProvider.DefaultDictionary=\"Resource.With.Dot\" Text=\"{lex:Loc Test}\" />-->\n                    <Button Content=\"Who is bound here?\" Click=\"Button_Click\" />\n                </Paragraph>\n            </FlowDocument>\n        </FlowDocumentScrollViewer>\n        <Button Grid.Row=\"9\" Content=\"Multiple UI Threads\" Margin=\"5\" Click=\"ButtonMultiThreading_Click\" />\n    </Grid>\n</Window>\n"
  },
  {
    "path": "tests/AssemblyTest/MainWindow.xaml.cs",
    "content": "﻿namespace AssemblyTest\n{\n    using System;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.Threading;\n    using System.Windows;\n    using System.Windows.Documents;\n    using WPFLocalizeExtension.Extensions;\n    using WPFLocalizeExtension.Providers;\n    using XAMLMarkupExtensions.Base;\n\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            ResxLocalizationProvider.Instance.ProviderError += (s, e) =>\n            {\n                Debug.WriteLine(\"Missing Key: \" + e.Key);\n            };\n\n            this.DataContext = new MyViewModel();\n            InitializeComponent();\n\n            string localisedValue = string.Empty;\n\n            //ILocalizationProvider cvsProvider = new CSVLocalizationProvider() { FileName = \"Example\", HasHeader = true };\n            //LocalizeDictionary.Instance.DefaultProvider = cvsProvider;\n\n            //LocExtension locExtension = new LocExtension();\n            //locExtension.Key = \"TestText\";\n\n            //locExtension.ResolveLocalizedValue<string>(out localisedValue, new CultureInfo(\"de\"));\n\n            //localisedValue = (string)LocalizeDictionary.Instance.GetLocalizedObject(\"TestText\", null, new CultureInfo(\"de\"), cvsProvider);\n\n            localisedValue = LocExtension.GetLocalizedValue<string>(\"AssemblyTestResourceLib:Strings:TestText\");\n\n            Console.WriteLine(localisedValue);\n        }\n\n        private void ButtonAssembly_Click(object sender, RoutedEventArgs e)\n        {\n            this.SetValue(ResxLocalizationProvider.DefaultAssemblyProperty, \"AssemblyTest\");\n        }\n\n        private void Button_Click(object sender, RoutedEventArgs e)\n        {\n            //var ext = LocExtension.GetBoundExtension(TestObject, \"Text\", -1);\n            //MessageBox.Show(ext.ToString());\n        }\n\n        private static int threadCount = 0;\n\n        private void ButtonMultiThreading_Click(object sender, RoutedEventArgs e)\n        {\n            Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));\n            newWindowThread.SetApartmentState(ApartmentState.STA);\n            newWindowThread.Name = \"Thread #\" + (++threadCount);\n            //newWindowThread.IsBackground = true;\n            newWindowThread.Start();\n            //newWindowThread.Join();\n        }\n\n        private void ThreadStartingPoint()\n        {\n            MainWindow tempWindow = new MainWindow();\n            tempWindow.Closed += tempWindow_Closed;\n            tempWindow.Show();\n            System.Windows.Threading.Dispatcher.Run();\n        }\n\n        private void tempWindow_Closed(object sender, EventArgs e)\n        {\n            (sender as Window).Dispatcher.InvokeShutdown();\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/MyViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Text;\nusing WPFLocalizeExtension.Providers;\n\nnamespace AssemblyTest\n{\n    public class MyViewModel : ViewModelBase\n    {\n        private ObservableCollection<Item> _items;\n\n        public ObservableCollection<Item> Items\n        {\n            get\n            {\n                if (_items == null)\n                {\n                    _items = new ObservableCollection<Item>();\n                    _items.Add(new Item() { TranslationKey = \"AssemblyTest:Strings:Tab1\" });\n                    _items.Add(new Item() { TranslationKey = \"AssemblyTest:Strings:Tab2\" });\n                    _items.Add(new Item() { TranslationKey = \"AssemblyTest:Strings:Tab3\" });\n                }\n                return _items;\n            }\n        }\n\n        private TestEnum enumValue = TestEnum.Processing;\n        /// <summary>\n        /// Gets or sets the enumValue.\n        /// </summary>\n        public TestEnum EnumValue\n        {\n            get { return enumValue; }\n            set\n            {\n                if (enumValue != value)\n                {\n                    enumValue = value;\n                    RaisePropertyChanged(\"EnumValue\");\n                }\n            }\n        }\n\n        public MyViewModel()\n        {\n            ResxLocalizationProvider.Instance.UpdateCultureList(\"AssemblyTest\", \"Strings\");\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n//In order to begin building localizable applications, set\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n    //(used if a resource is not found in the page,\n    // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n    //(used if a resource is not found in the page,\n    // app, or any theme specific resource dictionaries)\n)]"
  },
  {
    "path": "tests/AssemblyTest/Resource.With.Dot.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.18051\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace AssemblyTest {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class Resource_With_Dot {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resource_With_Dot() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"AssemblyTest.Resource.With.Dot\", typeof(Resource_With_Dot).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Test.\n        /// </summary>\n        public static string Test {\n            get {\n                return ResourceManager.GetString(\"Test\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/Resource.With.Dot.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Test\" xml:space=\"preserve\">\n    <value>Dies ist ein Test.</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTest/Resource.With.Dot.en.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Test\" xml:space=\"preserve\">\n    <value>This is a test.</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTest/Resource.With.Dot.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Test\" xml:space=\"preserve\">\n    <value>Test</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTest/StringFormatProxy.cs",
    "content": "﻿namespace AssemblyTest\n{\n    using System;\n    using System.Windows;\n\n    public class StringFormatProxy : FrameworkElement\n    {\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> StringFormat.\n        /// </summary>\n        public static readonly DependencyProperty StringFormatProperty =\n            DependencyProperty.Register(\n                \"StringFormat\",\n                typeof(string),\n                typeof(StringFormatProxy),\n                new PropertyMetadata(\"{0}\", DataChanged));\n\n        /// <summary>\n        /// The format of the result string.\n        /// </summary>\n        public string StringFormat\n        {\n            get { return (string)GetValue(StringFormatProperty); }\n            set { SetValue(StringFormatProperty, value); }\n        }\n\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> Value.\n        /// </summary>\n        public static readonly DependencyProperty ValueProperty =\n            DependencyProperty.Register(\n                \"Value\",\n                typeof(object),\n                typeof(StringFormatProxy),\n                new PropertyMetadata(\"{0}\", DataChanged));\n\n        /// <summary>\n        /// The value of the result string.\n        /// </summary>\n        public object Value\n        {\n            get { return GetValue(ValueProperty); }\n            set { SetValue(ValueProperty, value); }\n        }\n\n        private static void DataChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)\n        {\n            var sfp = sender as StringFormatProxy;\n            if (sfp != null && sfp.StringFormat != null)\n                sfp.Result = String.Format(sfp.StringFormat, sfp.Value);\n        }\n\n        /// <summary>\n        /// <see cref=\"DependencyProperty\"/> Result.\n        /// </summary>\n        public static readonly DependencyProperty ResultProperty =\n            DependencyProperty.Register(\n                \"Result\",\n                typeof(string),\n                typeof(StringFormatProxy),\n                new PropertyMetadata(null));\n\n        /// <summary>\n        /// The result string.\n        /// </summary>\n        public string Result\n        {\n            get { return (string)GetValue(ResultProperty); }\n            set { SetValue(ResultProperty, value); }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/Strings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.18051\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace AssemblyTest {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class Strings {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Strings() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"AssemblyTest.Strings\", typeof(Strings).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Aqua.\n        /// </summary>\n        public static string ButtonAssembly_Background {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Background\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Change Assembly!.\n        /// </summary>\n        public static string ButtonAssembly_Content {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Content\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to LeftToRight.\n        /// </summary>\n        public static string ButtonAssembly_FlowDirection {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_FlowDirection\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to 10,5,20,15.\n        /// </summary>\n        public static string ButtonAssembly_Margin {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Margin\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to 150.\n        /// </summary>\n        public static string ButtonAssembly_Width {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Width\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to de.\n        /// </summary>\n        public static string ButtonDE {\n            get {\n                return ResourceManager.GetString(\"ButtonDE\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to en.\n        /// </summary>\n        public static string ButtonEN {\n            get {\n                return ResourceManager.GetString(\"ButtonEN\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Foo.\n        /// </summary>\n        public static string Tab1 {\n            get {\n                return ResourceManager.GetString(\"Tab1\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Bar.\n        /// </summary>\n        public static string Tab2 {\n            get {\n                return ResourceManager.GetString(\"Tab2\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Baz.\n        /// </summary>\n        public static string Tab3 {\n            get {\n                return ResourceManager.GetString(\"Tab3\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Input.\n        /// </summary>\n        public static string TestEnum_Input {\n            get {\n                return ResourceManager.GetString(\"TestEnum_Input\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Output.\n        /// </summary>\n        public static string TestEnum_Output {\n            get {\n                return ResourceManager.GetString(\"TestEnum_Output\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Processing.\n        /// </summary>\n        public static string TestEnum_Processing {\n            get {\n                return ResourceManager.GetString(\"TestEnum_Processing\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap TestImage {\n            get {\n                object obj = ResourceManager.GetObject(\"TestImage\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This is a test..\n        /// </summary>\n        public static string TestText {\n            get {\n                return ResourceManager.GetString(\"TestText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to 75.\n        /// </summary>\n        public static string Width {\n            get {\n                return ResourceManager.GetString(\"Width\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/Strings.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ButtonAssembly_Background\" xml:space=\"preserve\">\n    <value>Yellow</value>\n  </data>\n  <data name=\"ButtonAssembly_Content\" xml:space=\"preserve\">\n    <value>Assembly ändern!</value>\n  </data>\n  <data name=\"ButtonAssembly_FlowDirection\" xml:space=\"preserve\">\n    <value>RightToLeft</value>\n  </data>\n  <data name=\"ButtonAssembly_Margin\" xml:space=\"preserve\">\n    <value>5</value>\n  </data>\n  <data name=\"ButtonAssembly_Width\" xml:space=\"preserve\">\n    <value>100</value>\n  </data>\n  <data name=\"ButtonDE\" xml:space=\"preserve\">\n    <value>de</value>\n  </data>\n  <data name=\"ButtonEN\" xml:space=\"preserve\">\n    <value>en</value>\n  </data>\n  <data name=\"Tab1\" xml:space=\"preserve\">\n    <value>Bla</value>\n  </data>\n  <data name=\"Tab2\" xml:space=\"preserve\">\n    <value>Blup</value>\n  </data>\n  <data name=\"Tab3\" xml:space=\"preserve\">\n    <value>Tralala</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"TestImage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>Resources\\Test1.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>Dies ist ein Test.</value>\n  </data>\n  <data name=\"TestEnum_Input\">\n    <value>Eingabe</value>\n  </data>\n  <data name=\"TestEnum_Output\">\n    <value>Ausgabe</value>\n  </data>\n  <data name=\"TestEnum_Processing\">\n    <value>Verarbeitung</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTest/Strings.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ButtonAssembly_Background\" xml:space=\"preserve\">\n    <value>Aqua</value>\n  </data>\n  <data name=\"ButtonAssembly_Content\" xml:space=\"preserve\">\n    <value>Change Assembly!</value>\n  </data>\n  <data name=\"ButtonAssembly_FlowDirection\" xml:space=\"preserve\">\n    <value>LeftToRight</value>\n  </data>\n  <data name=\"ButtonAssembly_Margin\" xml:space=\"preserve\">\n    <value>10,5,20,15</value>\n  </data>\n  <data name=\"ButtonAssembly_Width\" xml:space=\"preserve\">\n    <value>150</value>\n  </data>\n  <data name=\"ButtonDE\" xml:space=\"preserve\">\n    <value>de</value>\n  </data>\n  <data name=\"ButtonEN\" xml:space=\"preserve\">\n    <value>en</value>\n  </data>\n  <data name=\"Tab1\" xml:space=\"preserve\">\n    <value>Foo</value>\n  </data>\n  <data name=\"Tab2\" xml:space=\"preserve\">\n    <value>Bar</value>\n  </data>\n  <data name=\"Tab3\" xml:space=\"preserve\">\n    <value>Baz</value>\n  </data>\n  <data name=\"TestEnum_Input\" xml:space=\"preserve\">\n    <value>Input</value>\n  </data>\n  <data name=\"TestEnum_Output\" xml:space=\"preserve\">\n    <value>Output</value>\n  </data>\n  <data name=\"TestEnum_Processing\" xml:space=\"preserve\">\n    <value>Processing</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"TestImage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>Resources\\Test.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>This is a test.</value>\n  </data>\n  <data name=\"Width\" xml:space=\"preserve\">\n    <value>75</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTest/Strings2.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.18051\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace AssemblyTest {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class Strings2 {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Strings2() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"AssemblyTest.Strings2\", typeof(Strings2).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Aqua.\n        /// </summary>\n        public static string ButtonAssembly_Background {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Background\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Change Assembly!.\n        /// </summary>\n        public static string ButtonAssembly_Content {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Content\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to LeftToRight.\n        /// </summary>\n        public static string ButtonAssembly_FlowDirection {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_FlowDirection\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to 10,5,20,15.\n        /// </summary>\n        public static string ButtonAssembly_Margin {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Margin\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to 150.\n        /// </summary>\n        public static string ButtonAssembly_Width {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Width\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to DE.\n        /// </summary>\n        public static string ButtonDE {\n            get {\n                return ResourceManager.GetString(\"ButtonDE\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to EN.\n        /// </summary>\n        public static string ButtonEN {\n            get {\n                return ResourceManager.GetString(\"ButtonEN\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap TestImage {\n            get {\n                object obj = ResourceManager.GetObject(\"TestImage\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to And now with different resource files..\n        /// </summary>\n        public static string TestText {\n            get {\n                return ResourceManager.GetString(\"TestText\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/Strings2.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ButtonAssembly_Background\" xml:space=\"preserve\">\n    <value>Yellow</value>\n  </data>\n  <data name=\"ButtonAssembly_Content\" xml:space=\"preserve\">\n    <value>Assembly ändern!</value>\n  </data>\n  <data name=\"ButtonAssembly_FlowDirection\" xml:space=\"preserve\">\n    <value>RightToLeft</value>\n  </data>\n  <data name=\"ButtonAssembly_Margin\" xml:space=\"preserve\">\n    <value>5</value>\n  </data>\n  <data name=\"ButtonAssembly_Width\" xml:space=\"preserve\">\n    <value>100</value>\n  </data>\n  <data name=\"ButtonDE\" xml:space=\"preserve\">\n    <value>DE</value>\n  </data>\n  <data name=\"ButtonEN\" xml:space=\"preserve\">\n    <value>EN</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"TestImage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>Resources\\Test12.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>Und jetzt noch mit verschiedenen Resourcdateien.</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTest/Strings2.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ButtonAssembly_Background\" xml:space=\"preserve\">\n    <value>Aqua</value>\n  </data>\n  <data name=\"ButtonAssembly_Content\" xml:space=\"preserve\">\n    <value>Change Assembly!</value>\n  </data>\n  <data name=\"ButtonAssembly_FlowDirection\" xml:space=\"preserve\">\n    <value>LeftToRight</value>\n  </data>\n  <data name=\"ButtonAssembly_Margin\" xml:space=\"preserve\">\n    <value>10,5,20,15</value>\n  </data>\n  <data name=\"ButtonAssembly_Width\" xml:space=\"preserve\">\n    <value>150</value>\n  </data>\n  <data name=\"ButtonDE\" xml:space=\"preserve\">\n    <value>DE</value>\n  </data>\n  <data name=\"ButtonEN\" xml:space=\"preserve\">\n    <value>EN</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"TestImage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>Resources\\Test11.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>And now with different resource files.</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTest/TestDataClass.cs",
    "content": "﻿namespace AssemblyTest\n{\n    #region Uses\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel;\n    using System.Linq;\n    using System.Text;\n    #endregion\n\n    public class Countries : INotifyPropertyChanged\n    {\n        #region PropertyChanged Logic\n        /// <summary>\n        /// Informiert über sich ändernde Eigenschaften.\n        /// </summary>\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        /// <summary>\n        /// Notify that a property has changed\n        /// </summary>\n        /// <param name=\"property\">\n        /// The property that changed\n        /// </param>\n        internal void OnNotifyPropertyChanged(string property)\n        {\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));\n        }\n        #endregion\n\n        #region Properties\n        private string country = \"\";\n        public string Country\n        {\n            get { return country; }\n            set\n            {\n                country = value;\n                OnNotifyPropertyChanged(\"Country\");\n                OnNotifyPropertyChanged(\"FlagSource\");\n            }\n        }\n\n        private string countryDE = \"\";\n        public string CountryDE\n        {\n            get { return countryDE; }\n            set\n            {\n                countryDE = value;\n                OnNotifyPropertyChanged(\"CountryDE\");\n            }\n        }\n\n        private double area = 0;\n        public double Area\n        {\n            get { return area; }\n            set\n            {\n                area = value;\n                OnNotifyPropertyChanged(\"Area\");\n            }\n        }\n\n        public string FlagSource\n        {\n            get { return this.country.Replace(' ', '_'); }\n            set { }\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/TestEnum.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Text;\n\nnamespace AssemblyTest\n{\n    public enum TestEnum\n    {\n        Input,\n        Processing,\n        [Browsable(false)]\n        SomeMoreProcessing,\n        Output,\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTest/ViewModelBase.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Text;\n\nnamespace AssemblyTest\n{\n    public class ViewModelBase : INotifyPropertyChanged\n    {\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        protected void RaisePropertyChanged(string propertyName)\n        {\n            if (PropertyChanged != null)\n                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTestResourceLib/AssemblyTest.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n\t<PropertyGroup>\n\t\t<TargetFramework>net452</TargetFramework>\n\t\t<RootNamespace>AssemblyTest</RootNamespace>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<!-- XAML elements -->\n\t\t<Page Include=\"**\\*.xaml\" SubType=\"Designer\">\n\t\t\t<Generator>MSBuild:UpdateDesignTimeXaml</Generator>\n\t\t</Page>\n\t\t<Compile Update=\"**\\*.xaml.cs\" SubType=\"Code\" DependentUpon=\"%(Filename)\" />\n\n\t\t<!-- <None Remove=\"Resources\\QlikAppLoading.png\" />\n    <EmbeddedResource Include=\"default.jsconfig\" /> -->\n\n\t\t<!-- Resources -->\n\t\t<EmbeddedResource Update=\"Properties\\Resources.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"Resources.Designer.cs\" />\n\t\t<Compile Update=\"Properties\\Resources.Designer.cs\" AutoGen=\"True\" DependentUpon=\"Resources.resx\" DesignTime=\"True\" />\n\t\t<None Update=\"Example.csv\">\n\t\t  <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n\t\t</None>\n\t\t<None Update=\"Example.de.csv\">\n\t\t  <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n\t\t</None>\n\n\t\t<!-- Settings -->\n\t\t<None Update=\"Properties\\Settings.settings\" Generator=\"SettingsSingleFileGenerator\" LastGenOutput=\"Settings.Designer.cs\" />\n\t\t<Compile Update=\"Properties\\Settings.Designer.cs\" AutoGen=\"True\" DependentUpon=\"Settings.settings\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<Reference Include=\"System\" />\n\t\t<Reference Include=\"System.Data\" />\n\t\t<Reference Include=\"System.Drawing\" />\n\t\t<Reference Include=\"System.Xml\" />\n\t\t<Reference Include=\"Microsoft.CSharp\" />\n\t\t<Reference Include=\"System.Core\" />\n\t\t<Reference Include=\"System.Xml.Linq\" />\n\t\t<Reference Include=\"System.Data.DataSetExtensions\" />\n\t\t<Reference Include=\"System.Xaml\" />\n\t\t<Reference Include=\"WindowsBase\" />\n\t\t<Reference Include=\"PresentationCore\" />\n\t\t<Reference Include=\"PresentationFramework\" />\n\t\t<PackageReference Include=\"XAMLMarkupExtensions\" Version=\"1.6.0\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t</ItemGroup>\n</Project>\n\n<!-- <?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Compile Include=\"CaseConverter.cs\" />\n    <Compile Include=\"CountryRes.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>CountryRes.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"MyViewModel.cs\" />\n    <Compile Include=\"Resource.With.Dot.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resource.With.Dot.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"StringFormatProxy.cs\" />\n    <Compile Include=\"Strings2.Designer.cs\">\n      <DependentUpon>Strings2.resx</DependentUpon>\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n    </Compile>\n    <Compile Include=\"Strings.Designer.cs\">\n      <DependentUpon>Strings.resx</DependentUpon>\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n    </Compile>\n    <Compile Include=\"TestDataClass.cs\" />\n    <Compile Include=\"TestEnum.cs\" />\n    <Compile Include=\"ViewModelBase.cs\" />\n    <Page Include=\"MainWindow.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"MainWindow.xaml.cs\">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <EmbeddedResource Include=\"Resource.With.Dot.en.resx\">\n      <DependentUpon>Resource.With.Dot.resx</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Resource.With.Dot.de.resx\">\n      <DependentUpon>Resource.With.Dot.resx</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CountryRes.de.resx\">\n      <DependentUpon>CountryRes.resx</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CountryRes.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>CountryRes.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Resource.With.Dot.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resource.With.Dot.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Strings2.de.resx\">\n      <DependentUpon>Strings2.resx</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Strings2.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>Strings2.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Strings.de.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>Strings.resx</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Strings.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>Strings.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <None Include=\"Example.csv\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Example.de.csv\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"packages.config\" />\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <AppDesigner Include=\"Properties\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\">\n      <Project>{E8C5B094-2CB4-4C26-87F0-351B03612179}</Project>\n      <Name>WPFLocalizeExtension</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\AssemblyTestResourceLib\\AssemblyTestResourceLib.csproj\">\n      <Project>{F8ED06E5-39CA-458B-8B84-E043C335BDE2}</Project>\n      <Name>AssemblyTestResourceLib</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProviderExample\\ProviderExample.csproj\">\n      <Project>{AEECE3FE-7731-47E4-9E0D-D84F18837168}</Project>\n      <Name>ProviderExample</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\Test.bmp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\Test1.bmp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\Test11.bmp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\Test12.bmp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\France.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\Germany.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\United_Kingdom.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\Austria.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <WCFMetadata Include=\"Service References\\\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n\n</Project> -->"
  },
  {
    "path": "tests/AssemblyTestResourceLib/AssemblyTestResourceLib.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\t<PropertyGroup>\n\t\t<TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n    <!--Workaround for Error\tMSB4216\tCould not run the \"GenerateResource\" -->\n    <GenerateResourceMSBuildArchitecture>CurrentArchitecture</GenerateResourceMSBuildArchitecture>\n\t\t<RootNamespace>AssemblyTestResourceLib</RootNamespace>\n\t\t<Version>1.0.0</Version>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<Compile Update=\"Resource.Designer.cs\">\n\t\t\t<DesignTime>True</DesignTime>\n\t\t\t<AutoGen>True</AutoGen>\n\t\t\t<DependentUpon>Resource.resx</DependentUpon>\n\t\t</Compile>\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<EmbeddedResource Update=\"Strings2.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"Strings2.Designer.cs\" />\n\t\t<Compile Update=\"Strings2.Designer.cs\" AutoGen=\"True\" DependentUpon=\"Strings2.resx\" DesignTime=\"True\" />\n\n\t\t<EmbeddedResource Update=\"Strings.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"Strings.Designer.cs\" />\n\t\t<Compile Update=\"Strings.Designer.cs\" AutoGen=\"True\" DependentUpon=\"Strings.resx\" DesignTime=\"True\" />\n\t</ItemGroup>\n  \n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "tests/AssemblyTestResourceLib/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"f93184d1-dced-4f91-9220-93cbea59733b\")]"
  },
  {
    "path": "tests/AssemblyTestResourceLib/Strings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     Dieser Code wurde von einem Tool generiert.\n//     Laufzeitversion:4.0.30319.42000\n//\n//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn\n//     der Code erneut generiert wird.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace AssemblyTestResourceLib {\n    using System;\n    \n    \n    /// <summary>\n    ///   Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.\n    /// </summary>\n    // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert\n    // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.\n    // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen\n    // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"15.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Strings {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Strings() {\n        }\n        \n        /// <summary>\n        ///   Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"AssemblyTestResourceLib.Strings\", typeof(Strings).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle\n        ///   Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die Aqua ähnelt.\n        /// </summary>\n        internal static string ButtonAssembly_Background {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Background\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die Change Assembly {0}! ähnelt.\n        /// </summary>\n        internal static string ButtonAssembly_Content {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Content\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die LeftToRight ähnelt.\n        /// </summary>\n        internal static string ButtonAssembly_FlowDirection {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_FlowDirection\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die 10,5,20,15 ähnelt.\n        /// </summary>\n        internal static string ButtonAssembly_Margin {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Margin\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die 150 ähnelt.\n        /// </summary>\n        internal static string ButtonAssembly_Width {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Width\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die GermanTest ähnelt.\n        /// </summary>\n        internal static string ButtonDE {\n            get {\n                return ResourceManager.GetString(\"ButtonDE\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die English ähnelt.\n        /// </summary>\n        internal static string ButtonEN {\n            get {\n                return ResourceManager.GetString(\"ButtonEN\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die Input ähnelt.\n        /// </summary>\n        internal static string TestEnum_Input {\n            get {\n                return ResourceManager.GetString(\"TestEnum_Input\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die Output ähnelt.\n        /// </summary>\n        internal static string TestEnum_Output {\n            get {\n                return ResourceManager.GetString(\"TestEnum_Output\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die Processing ähnelt.\n        /// </summary>\n        internal static string TestEnum_Processing {\n            get {\n                return ResourceManager.GetString(\"TestEnum_Processing\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap TestImage {\n            get {\n                object obj = ResourceManager.GetObject(\"TestImage\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Sucht eine lokalisierte Zeichenfolge, die Another test - just from another assembly. ähnelt.\n        /// </summary>\n        internal static string TestText {\n            get {\n                return ResourceManager.GetString(\"TestText\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTestResourceLib/Strings.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ButtonAssembly_Background\" xml:space=\"preserve\">\n    <value>Yellow</value>\n  </data>\n  <data name=\"ButtonAssembly_Content\" xml:space=\"preserve\">\n    <value>Assembly ändern {0}!</value>\n  </data>\n  <data name=\"ButtonAssembly_FlowDirection\" xml:space=\"preserve\">\n    <value>RightToLeft</value>\n  </data>\n  <data name=\"ButtonAssembly_Margin\" xml:space=\"preserve\">\n    <value>5</value>\n  </data>\n  <data name=\"ButtonAssembly_Width\" xml:space=\"preserve\">\n    <value>100</value>\n  </data>\n  <data name=\"ButtonDE\" xml:space=\"preserve\">\n    <value>Deutsch</value>\n  </data>\n  <data name=\"ButtonEN\" xml:space=\"preserve\">\n    <value>Englisch</value>\n  </data>\n  <data name=\"TestEnum_Input\" xml:space=\"preserve\">\n    <value>Eingabe</value>\n  </data>\n  <data name=\"TestEnum_Output\" xml:space=\"preserve\">\n    <value>Ausgabe</value>\n  </data>\n  <data name=\"TestEnum_Processing\" xml:space=\"preserve\">\n    <value>Verarbeitung</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"TestImage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>Resources\\Test1.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>Noch ein Test - nur aus einer anderen Assembly.</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTestResourceLib/Strings.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ButtonAssembly_Background\" xml:space=\"preserve\">\n    <value>Aqua</value>\n  </data>\n  <data name=\"ButtonAssembly_Content\" xml:space=\"preserve\">\n    <value>Change Assembly {0}!</value>\n  </data>\n  <data name=\"ButtonAssembly_FlowDirection\" xml:space=\"preserve\">\n    <value>LeftToRight</value>\n  </data>\n  <data name=\"ButtonAssembly_Margin\" xml:space=\"preserve\">\n    <value>10,5,20,15</value>\n  </data>\n  <data name=\"ButtonAssembly_Width\" xml:space=\"preserve\">\n    <value>150</value>\n  </data>\n  <data name=\"ButtonDE\" xml:space=\"preserve\">\n    <value>GermanTest</value>\n  </data>\n  <data name=\"ButtonEN\" xml:space=\"preserve\">\n    <value>English</value>\n  </data>\n  <data name=\"TestEnum_Input\" xml:space=\"preserve\">\n    <value>Input</value>\n  </data>\n  <data name=\"TestEnum_Output\" xml:space=\"preserve\">\n    <value>Output</value>\n  </data>\n  <data name=\"TestEnum_Processing\" xml:space=\"preserve\">\n    <value>Processing</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"TestImage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>Resources\\Test.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>Another test - just from another assembly.</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTestResourceLib/Strings2.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.18051\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace AssemblyTestResourceLib2 {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class Strings2 {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Strings2() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"AssemblyTestResourceLib2.Strings2\", typeof(Strings2).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Aqua.\n        /// </summary>\n        public static string ButtonAssembly_Background {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Background\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Change Assembly!.\n        /// </summary>\n        public static string ButtonAssembly_Content {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Content\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to LeftToRight.\n        /// </summary>\n        public static string ButtonAssembly_FlowDirection {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_FlowDirection\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to 10,5,20,15.\n        /// </summary>\n        public static string ButtonAssembly_Margin {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Margin\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to 150.\n        /// </summary>\n        public static string ButtonAssembly_Width {\n            get {\n                return ResourceManager.GetString(\"ButtonAssembly_Width\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to GERMAN.\n        /// </summary>\n        public static string ButtonDE {\n            get {\n                return ResourceManager.GetString(\"ButtonDE\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to ENGLISH.\n        /// </summary>\n        public static string ButtonEN {\n            get {\n                return ResourceManager.GetString(\"ButtonEN\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to ButtonDE.\n        /// </summary>\n        public static string KeyButtonDE {\n            get {\n                return ResourceManager.GetString(\"KeyButtonDE\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap TestImage {\n            get {\n                object obj = ResourceManager.GetObject(\"TestImage\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Different resource file and assembly.\n        /// </summary>\n        public static string TestText {\n            get {\n                return ResourceManager.GetString(\"TestText\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/AssemblyTestResourceLib/Strings2.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ButtonAssembly_Background\" xml:space=\"preserve\">\n    <value>Yellow</value>\n  </data>\n  <data name=\"ButtonAssembly_Content\" xml:space=\"preserve\">\n    <value>Assembly ändern!</value>\n  </data>\n  <data name=\"ButtonAssembly_FlowDirection\" xml:space=\"preserve\">\n    <value>RightToLeft</value>\n  </data>\n  <data name=\"ButtonAssembly_Margin\" xml:space=\"preserve\">\n    <value>5</value>\n  </data>\n  <data name=\"ButtonAssembly_Width\" xml:space=\"preserve\">\n    <value>100</value>\n  </data>\n  <data name=\"ButtonDE\" xml:space=\"preserve\">\n    <value>DEUTSCH</value>\n  </data>\n  <data name=\"ButtonEN\" xml:space=\"preserve\">\n    <value>ENGLISCH</value>\n  </data>\n  <data name=\"KeyButtonDE\" xml:space=\"preserve\">\n    <value>ButtonEN</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"TestImage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>Resources\\Test11.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>Verschiedene Resourcdateien und Assembly</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/AssemblyTestResourceLib/Strings2.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ButtonAssembly_Background\" xml:space=\"preserve\">\n    <value>Aqua</value>\n  </data>\n  <data name=\"ButtonAssembly_Content\" xml:space=\"preserve\">\n    <value>Change Assembly!</value>\n  </data>\n  <data name=\"ButtonAssembly_FlowDirection\" xml:space=\"preserve\">\n    <value>LeftToRight</value>\n  </data>\n  <data name=\"ButtonAssembly_Margin\" xml:space=\"preserve\">\n    <value>10,5,20,15</value>\n  </data>\n  <data name=\"ButtonAssembly_Width\" xml:space=\"preserve\">\n    <value>150</value>\n  </data>\n  <data name=\"ButtonDE\" xml:space=\"preserve\">\n    <value>GERMAN</value>\n  </data>\n  <data name=\"ButtonEN\" xml:space=\"preserve\">\n    <value>ENGLISH</value>\n  </data>\n  <data name=\"KeyButtonDE\" xml:space=\"preserve\">\n    <value>ButtonDE</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"TestImage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>Resources\\Test12.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>Different resource file and assembly</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/FluentLexTest/Application.xaml",
    "content": "﻿<Application x:Class=\"Fluent.Sample.Foundation.Application\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             StartupUri=\"Window.xaml\">\n\t<Application.Resources>\n\t\t<ResourceDictionary>\n\t\t\t<ResourceDictionary.MergedDictionaries>\n\t\t\t\t<!--Attach Default Fluent Control's Theme-->\n\t\t\t\t<ResourceDictionary Source=\"pack://application:,,,/Fluent;Component/Themes/Generic.xaml\" />\n\n            </ResourceDictionary.MergedDictionaries>\n\t\t</ResourceDictionary>\n\t</Application.Resources>\n</Application>\n"
  },
  {
    "path": "tests/FluentLexTest/Application.xaml.cs",
    "content": "﻿#region Copyright and License Information\n\n// Fluent Ribbon Control Suite\n// http://fluent.codeplex.com/\n// Copyright © Degtyarev Daniel, Rikker Serg., Weegen Patrick 2009-2013.  All rights reserved.\n// \n// Distributed under the terms of the Microsoft Public License (Ms-PL). \n// The license is available online http://fluent.codeplex.com/license\n\n#endregion\n\nnamespace Fluent.Sample.Foundation\n{\n    /// <summary>\n    /// Entry point of the application\n    /// </summary>\n    public partial class Application : System.Windows.Application\n    {\n    }\n}\n"
  },
  {
    "path": "tests/FluentLexTest/Fluent.Sample.Foundation.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n    <!--Workaround for Error\tMSB4216\tCould not run the \"GenerateResource\" -->\n    <GenerateResourceMSBuildArchitecture>CurrentArchitecture</GenerateResourceMSBuildArchitecture>\n    <RootNamespace>Fluent.Sample.Foundation</RootNamespace>\n\t\t<OutputType>WinExe</OutputType>\n\t\t<StartupObject />\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<!-- Resources -->\n    <EmbeddedResource Update=\"Properties\\Resources.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"Properties\\Resources.Designer.cs\" />\n\t\t<Compile Update=\"Properties\\Resources.Designer.cs\" AutoGen=\"True\" DependentUpon=\"Resources.resx\" DesignTime=\"True\" />\n\t</ItemGroup>\n  \n  <!--References for .Net Framwork 4 -->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n  <!--PackageReference for all framworks-->\n\t<ItemGroup>\n    <PackageReference Include=\"ControlzEx\" Version=\"4.2.2\" />\n    <PackageReference Include=\"Fluent.Ribbon\" Version=\"7.1.0\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t</ItemGroup>\n</Project>"
  },
  {
    "path": "tests/FluentLexTest/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n//In order to begin building localizable applications, set \n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n[assembly: NeutralResourcesLanguage(\"en-US\")]\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n    //(used if a resource is not found in the page, \n    // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n    //(used if a resource is not found in the page, \n    // app, or any theme specific resource dictionaries)\n)]"
  },
  {
    "path": "tests/FluentLexTest/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.18444\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Fluent.Sample.Foundation.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"Fluent.Sample.Foundation.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Main menu.\n        /// </summary>\n        public static string backstage_Header {\n            get {\n                return ResourceManager.GetString(\"backstage_Header\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Switch language.\n        /// </summary>\n        public static string buttonLanguage_Header {\n            get {\n                return ResourceManager.GetString(\"buttonLanguage_Header\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Information in English.\n        /// </summary>\n        public static string informationBackStageItem_Header {\n            get {\n                return ResourceManager.GetString(\"informationBackStageItem_Header\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Product info in English.\n        /// </summary>\n        public static string textProductInfo_Text {\n            get {\n                return ResourceManager.GetString(\"textProductInfo_Text\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/FluentLexTest/Properties/Resources.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"backstage_Header\" xml:space=\"preserve\">\n    <value>Hauptmenü</value>\n  </data>\n  <data name=\"buttonLanguage_Header\" xml:space=\"preserve\">\n    <value>Sprache ändern</value>\n  </data>\n  <data name=\"informationBackStageItem_Header\" xml:space=\"preserve\">\n    <value>Information in Deutsch</value>\n  </data>\n  <data name=\"textProductInfo_Text\" xml:space=\"preserve\">\n    <value>Produktinformationen in Deutsch</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/FluentLexTest/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"backstage_Header\" xml:space=\"preserve\">\n    <value>Main menu</value>\n  </data>\n  <data name=\"buttonLanguage_Header\" xml:space=\"preserve\">\n    <value>Switch language</value>\n  </data>\n  <data name=\"informationBackStageItem_Header\" xml:space=\"preserve\">\n    <value>Information in English</value>\n  </data>\n  <data name=\"textProductInfo_Text\" xml:space=\"preserve\">\n    <value>Product info in English</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/FluentLexTest/Window.xaml",
    "content": "﻿<Fluent:RibbonWindow x:Class=\"Fluent.Sample.Foundation.Window\"\n\t                 xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n                     xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                     xmlns:Fluent=\"clr-namespace:Fluent;assembly=Fluent\"\n                     xmlns:lex=\"http://wpflocalizeextension.codeplex.com\"\n            lex:LocalizeDictionary.DesignCulture=\"en\"\n            lex:ResxLocalizationProvider.DefaultAssembly=\"Fluent.Sample.Foundation\"\n            lex:ResxLocalizationProvider.DefaultDictionary=\"Resources\"\n                     Title=\"FluentLexTest\"\n\t                 Width=\"500\"\n\t                 Height=\"250\"\n\t                 Background=\"#FFEBEDF0\">\n    <Grid>\n        <Fluent:Ribbon>\n            <!--Tabs-->\n            <Fluent:RibbonTabItem Header=\"Tab\">\n                <Fluent:RibbonGroupBox Header=\"Group\">\n                    <Fluent:Button x:Name=\"buttonLanguage\" Header=\"{lex:Loc}\" Click=\"buttonLanguage_Click\"/>\n                </Fluent:RibbonGroupBox>\n            </Fluent:RibbonTabItem>\n\n            <!--Backstage-->\n            <Fluent:Ribbon.Menu>\n                <Fluent:Backstage x:Name=\"backstage\" Header=\"{lex:Loc}\">\n                    <Fluent:BackstageTabControl>\n                        <Fluent:BackstageTabItem x:Name=\"informationBackStageItem\" Header=\"{lex:Loc}\" HorizontalAlignment=\"Left\">\n                            <ScrollViewer HorizontalScrollBarVisibility=\"Auto\" VerticalScrollBarVisibility=\"Auto\">\n                                <StackPanel  Width=\"500\" Margin=\"30\" HorizontalAlignment=\"Left\">\n                                    <TextBlock x:Name=\"textProductInfo\" FontSize=\"18\" Text=\"{lex:Loc}\"/>\n                                    <Button Content=\"{lex:Loc buttonLanguage_Header}\" Click=\"buttonLanguage_Click\" />\n                                </StackPanel>\n                            </ScrollViewer>\n                        </Fluent:BackstageTabItem>\n                    </Fluent:BackstageTabControl>\n                </Fluent:Backstage>\n            </Fluent:Ribbon.Menu>\n        </Fluent:Ribbon>\n    </Grid>\n</Fluent:RibbonWindow>"
  },
  {
    "path": "tests/FluentLexTest/Window.xaml.cs",
    "content": "﻿#region Copyright and License Information\n\n// Fluent Ribbon Control Suite\n// http://fluent.codeplex.com/\n// Copyright © Degtyarev Daniel, Rikker Serg., Weegen Patrick 2009-2013.  All rights reserved.\n// \n// Distributed under the terms of the Microsoft Public License (Ms-PL). \n// The license is available online http://fluent.codeplex.com/license\n\n#endregion\n\nusing System.Globalization;\nusing WPFLocalizeExtension.Engine;\nnamespace Fluent.Sample.Foundation\n{\n    // ATTENTION: You need use Fluent.RibbonWindow. \n    // RibbonWindow designed to provide proper office-like glass style.\n    // RibbonWindow automatically will use special non-DWM style in case of\n    // Windows XP or basic Windows 7/Vista theme. \n    // You still can use usual System.Windows.Window\n\n    /// <summary>\n    /// Represents the main window of the application\n    /// </summary>\n    public partial class Window : RibbonWindow\n    {\n        /// <summary>\n        /// Default constructor\n        /// </summary>\n        public Window()\n        {\n            InitializeComponent();\n        }\n\n        private void buttonLanguage_Click(object sender, System.Windows.RoutedEventArgs e)\n        {\n            CultureInfo newCulture;\n            if (LocalizeDictionary.Instance.Culture.Name.Contains(\"de\"))\n            {\n                newCulture = CultureInfo.GetCultureInfo(\"en-US\");\n            }\n            else\n            {\n                newCulture = CultureInfo.GetCultureInfo(\"de\");\n            }\n\n            LocalizeDictionary.Instance.SetCurrentThreadCulture = true;            \n            LocalizeDictionary.Instance.Culture = newCulture;\n        }\n    }\n}\n"
  },
  {
    "path": "tests/FluentLexTest/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n\t<startup>\n\t\t<supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n\t</startup>\n</configuration>"
  },
  {
    "path": "tests/GapTextWpfTest/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "tests/GapTextWpfTest/App.xaml",
    "content": "﻿<Application x:Class=\"GapTextWpfTest.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:GapTextWpfTest\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n\n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "tests/GapTextWpfTest/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace GapTextWpfTest\n{\n    /// <summary>\n    /// Interaktionslogik für \"App.xaml\"\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "tests/GapTextWpfTest/Converters/ObjectTypeEqualsConverter.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace GapTextWpfTest.Converters\n{\n    public class ObjectTypeEqualsConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            // returns true if and only if value is of type parameter\n            var comparedType = parameter as Type;\n            return comparedType != null && comparedType.IsInstanceOfType(value);\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotSupportedException();\n        }\n    }\n}\n"
  },
  {
    "path": "tests/GapTextWpfTest/GapTextWpfTest.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\t<PropertyGroup>\n\t\t<TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n    <!--Workaround for Error\tMSB4216\tCould not run the \"GenerateResource\" -->\n    <GenerateResourceMSBuildArchitecture>CurrentArchitecture</GenerateResourceMSBuildArchitecture>\n\n\t\t<RootNamespace>GapTextWpfTest</RootNamespace>\n\t\t<OutputType>WinExe</OutputType>\n\t\t<StartupObject />\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<!-- Resources -->\n    <EmbeddedResource Update=\"Properties\\Resources.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"Resources.Designer.cs\" />\n\t\t<Compile Update=\"Properties\\Resources.Designer.cs\" AutoGen=\"True\" DependentUpon=\"Resources.resx\" DesignTime=\"True\" />\n\t</ItemGroup>\n\n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t</ItemGroup>\n</Project>"
  },
  {
    "path": "tests/GapTextWpfTest/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"GapTextWpfTest.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:GapTextWpfTest\"\n        xmlns:system=\"clr-namespace:System;assembly=mscorlib\"\n        xmlns:converters=\"clr-namespace:GapTextWpfTest.Converters\"\n        xmlns:lex=\"http://wpflocalizeextension.codeplex.com\"\n        lex:ResxLocalizationProvider.DefaultAssembly=\"GapTextWpfTest\"\n        lex:ResxLocalizationProvider.DefaultDictionary=\"Resources\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"200\"\n        DataContext=\"{Binding RelativeSource={RelativeSource Self}}\">\n    <Window.Resources>\n        <converters:ObjectTypeEqualsConverter x:Key=\"TypeEqualsConverter\" />\n    </Window.Resources>\n   \n    <StackPanel Orientation=\"Vertical\">\n        <Button Content=\"Right-click me!\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\">\n            <Button.ContextMenu>\n                <ContextMenu>\n                    <MenuItem Header=\"{lex:Loc Friday}\" />\n                    <MenuItem Header=\"Menu item 2\" />\n                    <Separator />\n                    <MenuItem Header=\"Menu item 3\" />\n                </ContextMenu>\n            </Button.ContextMenu>\n        </Button>\n        <!-- first variant: not wrapping between words: -->\n        <Label Background=\"Red\" Content=\"static WrapPanel\" />\n        <WrapPanel Grid.Row=\"0\">\n            <TextBlock Text=\"Dies ist ein \" />\n            <TextBox />\n            <TextBlock Text=\". \" />\n            <DatePicker Text=\"\" />\n            <TextBlock Text=\" ist ein Datum.\" />\n        </WrapPanel>\n        <!-- second variant, using <Run>: wrapping between words -->\n        <Label Background=\"Red\" Content=\"static TextBlock with Runs\" />\n        <TextBlock HorizontalAlignment=\"Stretch\"\n                   Grid.Row=\"1\"\n                   TextWrapping=\"Wrap\"\n                   TextDecorations=\"Underline\"\n                   LineStackingStrategy=\"BlockLineHeight\">\n            <Run Text=\"The shop in \" />\n            <TextBox Text=\"{Binding City}\" />\n            <Run Text=\" is open on \" />\n            <lex:EnumComboBox Type=\"{x:Type local:WeekDay}\" />\n            <Run Text=\" from \" />\n            <TextBox Text=\"{Binding OpeningTime}\" />\n            <Run Text=\" to \" />\n            <TextBox Text=\"{Binding ClosingTime}\" />\n            <Run Text=\".\" />\n        </TextBlock>\n\n        <Label Background=\"DarkOrange\" Content=\"Z\" />\n        <lex:GapTextControl FormatString=\"The shop in {0} is open on {1} from {2} to {3}. We could have more of these in {0}!\">\n            <lex:GapTextControl.Template>\n                <ControlTemplate>\n                    <TextBlock x:Name=\"PART_TextBlock\" />\n                </ControlTemplate>\n            </lex:GapTextControl.Template>\n            <lex:GapTextControl.Gaps>\n                <TextBox Name=\"Test\" Text=\"{Binding City}\" TextChanged=\"TestTextChanged\" />\n                <lex:EnumComboBox Type=\"{x:Type local:WeekDay}\" />\n                <DatePicker SelectedDate=\"{Binding OpeningTime}\" />\n                <DatePicker SelectedDate=\"{Binding ClosingTime}\" />\n            </lex:GapTextControl.Gaps>\n        </lex:GapTextControl>\n\n        <Label Background=\"DarkOrange\" Content=\"Y\" />\n        <lex:GapTextControl FormatString=\"Dies ist ein Test ohne Platzhalter\">\n            <lex:GapTextControl.Template>\n                <ControlTemplate>\n                    <TextBlock x:Name=\"PART_TextBlock\" />\n                </ControlTemplate>\n            </lex:GapTextControl.Template>\n        </lex:GapTextControl>\n\n        <Label Background=\"DarkOrange\" Content=\"X\" />\n        <lex:GapTextControl FormatString=\"Ein Test mit {0}\"\n                                 HorizontalAlignment=\"Stretch\"\n                                 MinHeight=\"100\">\n            <lex:GapTextControl.Template>\n                <ControlTemplate>\n                    <Border BorderBrush=\"Red\">\n                        <TextBlock x:Name=\"PART_TextBlock\" />\n                    </Border>\n                </ControlTemplate>\n            </lex:GapTextControl.Template>\n            <lex:GapTextControl.Gaps>\n                <Run Text=\"[Test]\" />\n            </lex:GapTextControl.Gaps>\n        </lex:GapTextControl>\n    </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/GapTextWpfTest/MainWindow.xaml.cs",
    "content": "﻿namespace GapTextWpfTest\n{\n    using System;\n    using System.Collections.ObjectModel;\n    using System.ComponentModel;\n    using System.Diagnostics;\n    using System.Windows;\n\n    public enum WeekDay\n    {\n        Monday,\n        Tuesday,\n        Wednesday,\n        Thursday,\n        Friday,\n        Saturday,\n        Sunday,\n    }\n\n    /// <summary>\n    /// Interaktionslogik für MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window, INotifyPropertyChanged\n    {\n        #region INotifyPropertyChanged Implementation\n        /// <summary>\n        /// Occurs when a property value changes.\n        /// </summary>\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        /// <summary>\n        /// Raises a new <see cref=\"E:INotifyPropertyChanged.PropertyChanged\"/> event.\n        /// </summary>\n        /// <param name=\"propertyName\">The name of the property that changed.</param>\n        protected void RaisePropertyChanged(string propertyName)\n        {\n            if (PropertyChanged != null)\n                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));\n        }\n        #endregion\n\n        private ObservableCollection<string> weekDays = null;\n        /// <summary>\n        /// Gets a list of week days.\n        /// </summary>\n        public ObservableCollection<string> WeekDays\n        {\n            get\n            {\n                if (weekDays == null)\n                    weekDays = new ObservableCollection<string>() { \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\", \"So\" };\n                return weekDays;\n            }\n        }\n\n        private DateTime openingTime = new DateTime(1, 1, 1, 9, 30, 0); \n        /// <summary>\n        /// Gets or sets the opening time.\n        /// </summary>\n        public DateTime OpeningTime\n        {\n            get { return openingTime; }\n            set\n            {\n                if (openingTime != value)\n                {\n                    openingTime = value;\n                    RaisePropertyChanged(nameof(OpeningTime));\n                }\n            }\n        }\n\n        private DateTime closingTime = new DateTime(1, 1, 1, 16, 0, 0);\n        /// <summary>\n        /// Gets or sets the closing time.\n        /// </summary>\n        public DateTime ClosingTime\n        {\n            get { return closingTime; }\n            set\n            {\n                if (closingTime != value)\n                {\n                    closingTime = value;\n                    RaisePropertyChanged(\"ClosingTime\");\n                }\n            }\n        }\n\n        private string city = \"Paderborn\";\n        /// <summary>\n        /// Gets or sets the city.\n        /// </summary>\n        public string City\n        {\n            get { return city; }\n            set\n            {\n                if (city != value)\n                {\n                    city = value;\n                    RaisePropertyChanged(\"City\");\n                }\n            }\n        }\n        \n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n\n        private void TestTextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)\n        {\n            Debug.WriteLine(\"Test\");\n        }\n    }\n}\n"
  },
  {
    "path": "tests/GapTextWpfTest/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// Durch Festlegen von ComVisible auf \"false\" werden die Typen in dieser Assembly unsichtbar\n// für COM-Komponenten.  Wenn Sie auf einen Typ in dieser Assembly von\n// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf \"True\" festlegen.\n[assembly: ComVisible(false)]\n\n//Um mit dem Erstellen lokalisierbarer Anwendungen zu beginnen, legen Sie\n//<UICulture>ImCodeVerwendeteKultur</UICulture> in der .csproj-Datei\n//in einer <PropertyGroup> fest.  Wenn Sie in den Quelldateien beispielsweise Deutsch\n//(Deutschland) verwenden, legen Sie <UICulture> auf \\\"de-DE\\\" fest.  Heben Sie dann die Auskommentierung\n//des nachstehenden NeutralResourceLanguage-Attributs auf.  Aktualisieren Sie \"en-US\" in der nachstehenden Zeile,\n//sodass es mit der UICulture-Einstellung in der Projektdatei übereinstimmt.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher\n                                     //(wird verwendet, wenn eine Ressource auf der Seite\n                                     // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.)\n    ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs\n                                              //(wird verwendet, wenn eine Ressource auf der Seite, in der Anwendung oder einem\n                                              // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.)\n)]"
  },
  {
    "path": "tests/GapTextWpfTest/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace GapTextWpfTest.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"GapTextWpfTest.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Friday_Test.\n        /// </summary>\n        internal static string Friday {\n            get {\n                return ResourceManager.GetString(\"Friday\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Monday.\n        /// </summary>\n        internal static string Monday {\n            get {\n                return ResourceManager.GetString(\"Monday\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Saturday.\n        /// </summary>\n        internal static string Saturday {\n            get {\n                return ResourceManager.GetString(\"Saturday\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sunday.\n        /// </summary>\n        internal static string Sunday {\n            get {\n                return ResourceManager.GetString(\"Sunday\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Thursday.\n        /// </summary>\n        internal static string Thursday {\n            get {\n                return ResourceManager.GetString(\"Thursday\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Tuesday.\n        /// </summary>\n        internal static string Tuesday {\n            get {\n                return ResourceManager.GetString(\"Tuesday\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Wednesday.\n        /// </summary>\n        internal static string Wednesday {\n            get {\n                return ResourceManager.GetString(\"Wednesday\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/GapTextWpfTest/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Friday\" xml:space=\"preserve\">\n    <value>Friday_Test</value>\n  </data>\n  <data name=\"Monday\" xml:space=\"preserve\">\n    <value>Monday</value>\n  </data>\n  <data name=\"Saturday\" xml:space=\"preserve\">\n    <value>Saturday</value>\n  </data>\n  <data name=\"Sunday\" xml:space=\"preserve\">\n    <value>Sunday</value>\n  </data>\n  <data name=\"Thursday\" xml:space=\"preserve\">\n    <value>Thursday</value>\n  </data>\n  <data name=\"Tuesday\" xml:space=\"preserve\">\n    <value>Tuesday</value>\n  </data>\n  <data name=\"Wednesday\" xml:space=\"preserve\">\n    <value>Wednesday</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/GapTextWpfTest/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"xunit\" version=\"2.2.0\" targetFramework=\"net452\" />\n  <package id=\"xunit.abstractions\" version=\"2.0.1\" targetFramework=\"net452\" />\n  <package id=\"xunit.assert\" version=\"2.2.0\" targetFramework=\"net452\" />\n  <package id=\"xunit.core\" version=\"2.2.0\" targetFramework=\"net452\" />\n  <package id=\"xunit.extensibility.core\" version=\"2.2.0\" targetFramework=\"net452\" />\n  <package id=\"xunit.extensibility.execution\" version=\"2.2.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "tests/HelloWorldWPF/App.xaml",
    "content": "﻿<Application x:Class=\"HalloWeltWPF.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "tests/HelloWorldWPF/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Windows;\n\nnamespace HalloWeltWPF\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "tests/HelloWorldWPF/HelloWorldWPF.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\t<PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n\t\t<RootNamespace>HalloWeltWPF</RootNamespace>\n\t\t<OutputType>WinExe</OutputType>\n\t\t<StartupObject />\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n\n\t<ItemGroup>\n\t  <PackageReference Condition=\"!$(TargetFramework.StartsWith('net40'))\" Include=\"SmartFormat.NET\" Version=\"2.5.0\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<EmbeddedResource Update=\"Ressourcen.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"Ressourcen.Designer.cs\" />\n\t</ItemGroup>\n  \n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t  <Compile Update=\"Ressourcen.Designer.cs\">\n\t    <DesignTime>True</DesignTime>\n\t    <AutoGen>True</AutoGen>\n\t    <DependentUpon>Ressourcen.resx</DependentUpon>\n\t  </Compile>\n\t</ItemGroup>\n</Project>"
  },
  {
    "path": "tests/HelloWorldWPF/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"HalloWeltWPF.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:lex=\"http://wpflocalizeextension.codeplex.com\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:local=\"clr-namespace:HalloWeltWPF\"\n        d:DataContext=\"{d:DesignInstance Type=local:TestVM, IsDesignTimeCreatable=True}\" \n        mc:Ignorable=\"d\"\n        lex:LocalizeDictionary.DesignCulture=\"en\"\n        lex:LocalizeDictionary.IncludeInvariantCulture=\"False\"\n        lex:ResxLocalizationProvider.DefaultAssembly=\"HelloWorldWPF\"\n        lex:ResxLocalizationProvider.DefaultDictionary=\"Ressourcen\"\n        SizeToContent=\"WidthAndHeight\"\n        ResizeMode=\"NoResize\"\n        Title=\"{lex:LocText Title}\"\n        Background=\"{lex:Loc Background}\"\n        FlowDirection=\"{lex:Loc FlowDirection}\" WindowStartupLocation=\"CenterScreen\">\n    <Window.Resources>\n        <ResourceDictionary>\n            <Style x:Key=\"hardCodedStyle1\" TargetType=\"TextBlock\">\n                <Setter Property=\"Text\" Value=\"{lex:BLoc Key=de}\" />\n            </Style>\n            <Style x:Key=\"hardCodedStyle\" TargetType=\"TextBlock\">\n                <Setter Property=\"Text\" >\n                    <Setter.Value>\n                        <MultiBinding Converter=\"{lex:TranslateConverter}\" >\n                            <Binding Path=\"language\" />\n                            <Binding Source=\"{x:Static lex:LocalizeDictionary.Instance}\" Path=\"Culture\"/>\n                        </MultiBinding>\n                    </Setter.Value>\n                </Setter>\n                <Setter Property=\"Foreground\">\n                    <Setter.Value>\n                        <MultiBinding Converter=\"{lex:TranslateConverter}\" FallbackValue=\"#00FF00\" >\n                            <Binding Path=\"color\"/>\n                            <Binding Source=\"{x:Static lex:LocalizeDictionary.Instance}\" Path=\"Culture\"/>\n                        </MultiBinding>\n                    </Setter.Value>\n                </Setter>\n            </Style>\n        </ResourceDictionary>\n    </Window.Resources>\n    <StackPanel VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"50,20\">\n        <StackPanel.LayoutTransform>\n            <ScaleTransform ScaleX=\"2.0\" ScaleY=\"2.0\" />\n        </StackPanel.LayoutTransform>\n        <lex:LocProxy x:Name=\"LocProxySessionLabel\"  Source=\"{Binding Path=language, FallbackValue=de}\" />\n        <Label Background=\"Green\" x:Name=\"SessionLabel\" Content=\"{Binding ElementName=LocProxySessionLabel, Path=Result}\" />\n        <TextBlock Style=\"{StaticResource hardCodedStyle}\" Background=\"Red\" />\n        <TextBlock Style=\"{StaticResource hardCodedStyle1}\"/>\n        <TextBlock Text=\"{Binding ElementName=testFELoc, Path=Content}\"></TextBlock>\n\n        <TextBlock Name=\"MyLabel3\" FontSize=\"20\" HorizontalAlignment=\"Center\">\n            <TextBlock.Text>\n                <MultiBinding Converter=\"{lex:StringFormatConverter}\" >\n                    <lex:BLoc Key=\"HelloWorldWPF:Ressourcen:MyLabel2\"></lex:BLoc>\n                    <Binding Path=\"Hours\" FallbackValue=\"\"/>\n                </MultiBinding>\n            </TextBlock.Text>\n        </TextBlock>\n        <TextBlock Name=\"MyLabel\" FontSize=\"20\" Text=\"{lex:Loc}\" HorizontalAlignment=\"Center\" />\n        <TextBlock Name=\"BindTest1\" Text=\"{lex:Loc {Binding Path=language, FallbackValue=en}}\" Background=\"Aqua\"></TextBlock>\n        <Button Height=\"30\" Tag=\"en\">\n            <Button.Template>\n                <ControlTemplate TargetType=\"Button\">\n                    <Canvas>\n                        <Ellipse Width=\"100\" Height=\"{TemplateBinding Height}\" Fill=\"DarkCyan\"></Ellipse>\n                        <TextBox Text=\"{lex:Loc {Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}}\"></TextBox>\n                        <TextBox Canvas.Left=\"100\" Text=\"{lex:Loc {TemplateBinding Tag}}\"></TextBox>\n                    </Canvas>\n                </ControlTemplate>\n            </Button.Template>\n        </Button>\n        <TextBlock Text=\"{lex:Loc {Binding tenum, StringFormat=TestEnum_{0}}}\"></TextBlock>\n        <TextBlock Text=\"{lex:Loc {Binding tenum, Converter={lex:PrependTypeConverter}, ConverterParameter=__}}\"></TextBlock>\n        <Button Name=\"BindeTestButton\" Content=\"Press to toggle binded property\" Margin=\"5\" Click=\"BindeTestButton_Click\" ></Button>\n        <TextBlock Name=\"MyLabel2\" FontSize=\"20\" Text=\"{lex:Loc PresentationCore:ExceptionStringTable:DeleteText}\" HorizontalAlignment=\"Center\" />\n        <StackPanel Margin=\"20,0,0,0\">\n            <TextBlock FontSize=\"20\" Text=\"{lex:Loc UndefinedKey, FallbackBehavior=Default}\" />\n            <TextBlock FontSize=\"20\" Text=\"{lex:Loc UndefinedKey, FallbackBehavior=Key}\" />\n            <TextBlock FontSize=\"20\" Text=\"{lex:Loc UndefinedKey, FallbackBehavior=EmptyString}\" />\n        </StackPanel>\n        <StackPanel Orientation=\"Horizontal\">\n            <Button Content=\"{lex:Loc de}\" Margin=\"5\" CommandParameter=\"de\" Command=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=SetCultureCommand}\" />\n            <Button Content=\"{lex:Loc en}\" Margin=\"5\" CommandParameter=\"en\" Command=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=SetCultureCommand}\" />\n            <Button Content=\"{lex:Loc he}\" Margin=\"5\" CommandParameter=\"he\" Command=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=SetCultureCommand}\" />\n            <Button Content=\"{lex:Loc ar}\" Margin=\"5\" CommandParameter=\"ar\" Command=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=SetCultureCommand}\" />\n        </StackPanel>\n        <ComboBox ItemsSource=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=MergedAvailableCultures}\"\n                  SelectedItem=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=Culture}\"\n                  DisplayMemberPath=\"NativeName\"\n                  Margin=\"2\"/>\n    </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/HelloWorldWPF/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Globalization;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\nusing System.Text;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing WPFLocalizeExtension.Engine;\nusing WPFLocalizeExtension.Providers;\n\nnamespace HalloWeltWPF\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        TestVM vm = new TestVM();\n\n        public MainWindow()\n        {\n            vm.language = \"de\";\n            vm.color = \"Background\";\n            vm.Hours = 0;\n            this.DataContext = vm;\n\n            LocalizeDictionary.Instance.Culture = new System.Globalization.CultureInfo(\"de\");\n            (LocalizeDictionary.Instance.DefaultProvider as ResxLocalizationProvider).SearchCultures =\n                new List<System.Globalization.CultureInfo>()\n                {\n                    System.Globalization.CultureInfo.GetCultureInfo(\"de-de\"),\n                    System.Globalization.CultureInfo.GetCultureInfo(\"en\"),\n                    System.Globalization.CultureInfo.GetCultureInfo(\"he\"),\n                    System.Globalization.CultureInfo.GetCultureInfo(\"ar\"),\n                };\n            LocalizeDictionary.Instance.OutputMissingKeys = true;\n            LocalizeDictionary.Instance.MissingKeyEvent += Instance_MissingKeyEvent;\n        }\n\n        private void Instance_MissingKeyEvent(object sender, MissingKeyEventArgs e)\n        {\n            // Test of FallbackBehavior.\n            if (e.Key == \"UndefinedKey\")\n                return;\n            \n            e.MissingKeyResult = \"Hello World\";\n        }\n\n        private void BindeTestButton_Click(object sender, RoutedEventArgs e)\n        {\n            vm.Hours = vm.Hours + 1;\n\n            vm.language = vm.language switch\n            {\n                \"en\" => \"de\",\n                \"de\" => \"error\",\n                _ => \"en\",\n            };\n            if (vm.tenum == TestVM.TestEnum.Test1)\n                vm.tenum = TestVM.TestEnum.Test2;\n            else\n                vm.tenum = TestVM.TestEnum.Test1;\n        }\n    }\n}\n"
  },
  {
    "path": "tests/HelloWorldWPF/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n//In order to begin building localizable applications, set\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n                                     //(used if a resource is not found in the page,\n                                     // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n                                              //(used if a resource is not found in the page,\n                                              // app, or any theme specific resource dictionaries)\n)]\n"
  },
  {
    "path": "tests/HelloWorldWPF/Ressourcen.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace HalloWeltWPF {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Ressourcen {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Ressourcen() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"HalloWeltWPF.Ressourcen\", typeof(Ressourcen).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to ar.\n        /// </summary>\n        internal static string ar {\n            get {\n                return ResourceManager.GetString(\"ar\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Background.\n        /// </summary>\n        internal static string Background {\n            get {\n                return ResourceManager.GetString(\"Background\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to de.\n        /// </summary>\n        internal static string de {\n            get {\n                return ResourceManager.GetString(\"de\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to en.\n        /// </summary>\n        internal static string en {\n            get {\n                return ResourceManager.GetString(\"en\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to FlowDirection.\n        /// </summary>\n        internal static string FlowDirection {\n            get {\n                return ResourceManager.GetString(\"FlowDirection\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to he.\n        /// </summary>\n        internal static string he {\n            get {\n                return ResourceManager.GetString(\"he\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to MyLabel_Text.\n        /// </summary>\n        internal static string MyLabel_Text {\n            get {\n                return ResourceManager.GetString(\"MyLabel_Text\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Title.\n        /// </summary>\n        internal static string Title {\n            get {\n                return ResourceManager.GetString(\"Title\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/HelloWorldWPF/Ressourcen.ar.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ar\" xml:space=\"preserve\">\n    <value>العربية</value>\n  </data>\n  <data name=\"de\" xml:space=\"preserve\">\n    <value>ألماني</value>\n  </data>\n  <data name=\"en\" xml:space=\"preserve\">\n    <value>الإنجليزية</value>\n  </data>\n  <data name=\"FlowDirection\" xml:space=\"preserve\">\n    <value>RightToLeft</value>\n  </data>\n  <data name=\"he\" xml:space=\"preserve\">\n    <value>العبرية</value>\n  </data>\n  <data name=\"MyLabel_Text\" xml:space=\"preserve\">\n    <value>مرحبا العالم!</value>\n  </data>\n  <data name=\"Title\" xml:space=\"preserve\">\n    <value>مثال</value>\n  </data>\n  <data name=\"Background\" xml:space=\"preserve\">\n    <value>Yellow</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/HelloWorldWPF/Ressourcen.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ar\" xml:space=\"preserve\">\n    <value>Arabisch</value>\n  </data>\n  <data name=\"de\" xml:space=\"preserve\">\n    <value>Deutsch</value>\n  </data>\n  <data name=\"en\" xml:space=\"preserve\">\n    <value>Englisch</value>\n  </data>\n  <data name=\"FlowDirection\" xml:space=\"preserve\">\n    <value>LeftToRight</value>\n  </data>\n  <data name=\"he\" xml:space=\"preserve\">\n    <value>Hebräisch</value>\n  </data>\n  <data name=\"MyLabel_Text\" xml:space=\"preserve\">\n    <value>Hallo Welt!</value>\n  </data>\n  <data name=\"Title\" xml:space=\"preserve\">\n    <value>Beispiel</value>\n  </data>\n  <data name=\"Background\" xml:space=\"preserve\">\n    <value>White</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/HelloWorldWPF/Ressourcen.en.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ar\" xml:space=\"preserve\">\n    <value>Arabic</value>\n  </data>\n  <data name=\"de\" xml:space=\"preserve\">\n    <value>German</value>\n  </data>\n  <data name=\"en\" xml:space=\"preserve\">\n    <value>English</value>\n  </data>\n  <data name=\"FlowDirection\" xml:space=\"preserve\">\n    <value>LeftToRight</value>\n  </data>\n  <data name=\"he\" xml:space=\"preserve\">\n    <value>Hebrew</value>\n  </data>\n  <data name=\"MyLabel_Text\" xml:space=\"preserve\">\n    <value>Hello World!</value>\n  </data>\n  <data name=\"Title\" xml:space=\"preserve\">\n    <value>Example</value>\n  </data>\n  <data name=\"Background\" xml:space=\"preserve\">\n    <value>White</value>\n  </data>\n  <data name=\"TestEnum__Test1\" xml:space=\"preserve\">\n    <value>Hello Test 1</value>\n  </data>\n  <data name=\"TestEnum__Test2\" xml:space=\"preserve\">\n    <value>Hello Test 2</value>\n  </data>\n  <data name=\"TestEnum_Test1\" xml:space=\"preserve\">\n    <value>Hallo Test1</value>\n  </data>\n  <data name=\"TestEnum_Test2\" xml:space=\"preserve\">\n    <value>Hallo Test 2</value>\n  </data>\n  <data name=\"MyLabel2\" xml:space=\"preserve\">\n    <value>Hello World! {0} {0:one|default}</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/HelloWorldWPF/Ressourcen.he.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ar\" xml:space=\"preserve\">\n    <value>ערבית</value>\n  </data>\n  <data name=\"de\" xml:space=\"preserve\">\n    <value>גרמנית</value>\n  </data>\n  <data name=\"en\" xml:space=\"preserve\">\n    <value>אנגלית</value>\n  </data>\n  <data name=\"FlowDirection\" xml:space=\"preserve\">\n    <value>RightToLeft</value>\n  </data>\n  <data name=\"he\" xml:space=\"preserve\">\n    <value>עברית</value>\n  </data>\n  <data name=\"MyLabel_Text\" xml:space=\"preserve\">\n    <value>שלום עולם!</value>\n  </data>\n  <data name=\"Title\" xml:space=\"preserve\">\n    <value>דוגמה</value>\n  </data>\n  <data name=\"Background\" xml:space=\"preserve\">\n    <value>Blue</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/HelloWorldWPF/Ressourcen.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ar\" xml:space=\"preserve\">\n    <value>ar</value>\n  </data>\n  <data name=\"de\" xml:space=\"preserve\">\n    <value>de</value>\n  </data>\n  <data name=\"en\" xml:space=\"preserve\">\n    <value>en</value>\n  </data>\n  <data name=\"FlowDirection\" xml:space=\"preserve\">\n    <value>FlowDirection</value>\n  </data>\n  <data name=\"he\" xml:space=\"preserve\">\n    <value>he</value>\n  </data>\n  <data name=\"MyLabel_Text\" xml:space=\"preserve\">\n    <value>MyLabel_Text</value>\n  </data>\n  <data name=\"Title\" xml:space=\"preserve\">\n    <value>Title</value>\n  </data>\n  <data name=\"Background\" xml:space=\"preserve\">\n    <value>Background</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/HelloWorldWPF/TestVM.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Navigation;\n\nnamespace HalloWeltWPF\n{\n    public class TestVM : INotifyPropertyChanged\n    {\n        #region INotifyPropertyChanged Implementation\n        /// <summary>\n        /// Informiert über sich ändernde Eigenschaften.\n        /// </summary>\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        /// <summary>\n        /// Notify that a property has changed\n        /// </summary>\n        /// <param name=\"property\">\n        /// The property that changed\n        /// </param>\n        internal void RaisePropertyChanged(string property)\n        {\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));\n        }\n        #endregion\n\n        public enum TestEnum\n        {\n            Test1,\n            Test2\n        }\n\n        private TestEnum _tenum;\n        public TestEnum tenum {\n            get => _tenum;\n            set {\n                _tenum = value;\n                RaisePropertyChanged(nameof(tenum));\n            }\n        }\n\n        private int _hours;\n        public int Hours\n        {\n            get => _hours;\n            set\n            {\n                _hours = value;\n                RaisePropertyChanged(nameof(Hours));\n            }\n        }\n\n        private string _language;\n        public string language\n        {\n            get => _language;\n            set\n            {\n                _language = value;\n                RaisePropertyChanged(nameof(language));\n            }\n        }\n\n        private string _color;\n        public string color {\n            get => _color;\n            set {\n                _color = value;\n                RaisePropertyChanged(nameof(color));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/HelloWorldWPF.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30011.22\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"HelloWorldWPF\", \"HelloWorldWPF\\HelloWorldWPF.csproj\", \"{64B54D1A-1445-4514-9DEC-7DA11D028F54}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WPFLocalizeExtension\", \"..\\src\\WPFLocalizeExtension.csproj\", \"{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|Mixed Platforms = Debug|Mixed Platforms\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|Mixed Platforms = Release|Mixed Platforms\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{64B54D1A-1445-4514-9DEC-7DA11D028F54}.Release|x86.Build.0 = Release|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{3B2FA6D1-6EC0-4C0F-BDF0-D90158904ED3}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {F0544A03-17E3-4EFB-BB50-4EDEB145B721}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "tests/LeakSample/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.8\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "tests/LeakSample/App.xaml",
    "content": "﻿<Application x:Class=\"LeakSample.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:LeakSample\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "tests/LeakSample/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace LeakSample\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "tests/LeakSample/LeakSample.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\t<PropertyGroup>\n    <TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n\t\t<RootNamespace>LeakSample</RootNamespace>\n\t\t<OutputType>WinExe</OutputType>\n\t\t<StartupObject />\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n\n\t<ItemGroup>\n\t\t<!-- Resources -->\n\t\t<EmbeddedResource Update=\"Ressourcen.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"Ressourcen.Designer.cs\" />\n\t\t<Compile Update=\"Ressourcen.Designer.cs\" AutoGen=\"True\" DependentUpon=\"Ressourcen.resx\" DesignTime=\"True\" />\n\t</ItemGroup>\n  \n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t</ItemGroup>\n</Project>"
  },
  {
    "path": "tests/LeakSample/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"LeakSample.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:LeakSample\"\n        xmlns:lex=\"http://wpflocalizeextension.codeplex.com\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"450\" Width=\"800\"\n        lex:ResxLocalizationProvider.DefaultAssembly=\"LeakSample\"\n        lex:ResxLocalizationProvider.DefaultDictionary=\"Localization\">\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"*\" />\n        </Grid.RowDefinitions>\n\n        <Button Grid.Row=\"0\" Height=\"30\" Content=\"Reload\" Click=\"OnReload\" />\n\n        <ItemsControl Grid.Row=\"1\" x:Name=\"ItemsControl\">\n            <ItemsControl.ItemsPanel>\n                <ItemsPanelTemplate>\n                    <WrapPanel IsItemsHost=\"True\" />\n                </ItemsPanelTemplate>\n            </ItemsControl.ItemsPanel>\n\n            <ItemsControl.ItemTemplate>\n                <DataTemplate>\n                    <TextBlock FontSize=\"20\">\n                        <Run Text=\"{lex:LocText Hello}\" />\n                        <Run FontWeight=\"Bold\" Text=\"{lex:LocText Wonderful}\" />\n                        <Run Text=\"{lex:LocText World}\" />\n                    </TextBlock>\n                </DataTemplate>\n            </ItemsControl.ItemTemplate>\n        </ItemsControl>\n\n\n    </Grid>\n</Window>\n"
  },
  {
    "path": "tests/LeakSample/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Windows;\n\nnamespace LeakSample\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n\n        private void OnReload(object sender, RoutedEventArgs e)\n        {\n            ItemsControl.ItemsSource = new object[new Random().Next(10, 30)];\n        }\n    }\n}\n"
  },
  {
    "path": "tests/LeakSample/MainWindowViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\nusing System.Text;\nusing System.Threading.Tasks;\nusing LeakSample.Annotations;\n\nnamespace LeakSample\n{\n    public class MainWindowViewModel : INotifyPropertyChanged\n    {\n        public IReadOnlyList<object> Objects { get; private set; }\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        [NotifyPropertyChangedInvocator]\n        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)\n        {\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n        }\n    }\n}\n"
  },
  {
    "path": "tests/LeakSample/Properties/Annotations.cs",
    "content": "﻿/* MIT License\n\nCopyright (c) 2016 JetBrains http://www.jetbrains.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE. */\n\nusing System;\n// ReSharper disable InheritdocConsiderUsage\n\n#pragma warning disable 1591\n// ReSharper disable UnusedMember.Global\n// ReSharper disable MemberCanBePrivate.Global\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n// ReSharper disable IntroduceOptionalParameters.Global\n// ReSharper disable MemberCanBeProtected.Global\n// ReSharper disable InconsistentNaming\n\nnamespace LeakSample.Annotations\n{\n  /// <summary>\n  /// Indicates that the value of the marked element could be <c>null</c> sometimes,\n  /// so checking for <c>null</c> is required before its usage.\n  /// </summary>\n  /// <example><code>\n  /// [CanBeNull] object Test() => null;\n  /// \n  /// void UseTest() {\n  ///   var p = Test();\n  ///   var s = p.ToString(); // Warning: Possible 'System.NullReferenceException'\n  /// }\n  /// </code></example>\n  [AttributeUsage(\n    AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |\n    AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event |\n    AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)]\n  public sealed class CanBeNullAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates that the value of the marked element can never be <c>null</c>.\n  /// </summary>\n  /// <example><code>\n  /// [NotNull] object Foo() {\n  ///   return null; // Warning: Possible 'null' assignment\n  /// }\n  /// </code></example>\n  [AttributeUsage(\n    AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |\n    AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event |\n    AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)]\n  public sealed class NotNullAttribute : Attribute { }\n\n  /// <summary>\n  /// Can be applied to symbols of types derived from IEnumerable as well as to symbols of Task\n  /// and Lazy classes to indicate that the value of a collection item, of the Task.Result property\n  /// or of the Lazy.Value property can never be null.\n  /// </summary>\n  /// <example><code>\n  /// public void Foo([ItemNotNull]List&lt;string&gt; books)\n  /// {\n  ///   foreach (var book in books) {\n  ///     if (book != null) // Warning: Expression is always true\n  ///      Console.WriteLine(book.ToUpper());\n  ///   }\n  /// }\n  /// </code></example>\n  [AttributeUsage(\n    AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |\n    AttributeTargets.Delegate | AttributeTargets.Field)]\n  public sealed class ItemNotNullAttribute : Attribute { }\n\n  /// <summary>\n  /// Can be applied to symbols of types derived from IEnumerable as well as to symbols of Task\n  /// and Lazy classes to indicate that the value of a collection item, of the Task.Result property\n  /// or of the Lazy.Value property can be null.\n  /// </summary>\n  /// <example><code>\n  /// public void Foo([ItemCanBeNull]List&lt;string&gt; books)\n  /// {\n  ///   foreach (var book in books)\n  ///   {\n  ///     // Warning: Possible 'System.NullReferenceException'\n  ///     Console.WriteLine(book.ToUpper());\n  ///   }\n  /// }\n  /// </code></example>\n  [AttributeUsage(\n    AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |\n    AttributeTargets.Delegate | AttributeTargets.Field)]\n  public sealed class ItemCanBeNullAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates that the marked method builds string by the format pattern and (optional) arguments.\n  /// The parameter, which contains the format string, should be given in constructor. The format string\n  /// should be in <see cref=\"string.Format(IFormatProvider,string,object[])\"/>-like form.\n  /// </summary>\n  /// <example><code>\n  /// [StringFormatMethod(\"message\")]\n  /// void ShowError(string message, params object[] args) { /* do something */ }\n  /// \n  /// void Foo() {\n  ///   ShowError(\"Failed: {0}\"); // Warning: Non-existing argument in format string\n  /// }\n  /// </code></example>\n  [AttributeUsage(\n    AttributeTargets.Constructor | AttributeTargets.Method |\n    AttributeTargets.Property | AttributeTargets.Delegate)]\n  public sealed class StringFormatMethodAttribute : Attribute\n  {\n    /// <param name=\"formatParameterName\">\n    /// Specifies which parameter of an annotated method should be treated as the format string\n    /// </param>\n    public StringFormatMethodAttribute([NotNull] string formatParameterName)\n    {\n      FormatParameterName = formatParameterName;\n    }\n\n    [NotNull] public string FormatParameterName { get; }\n  }\n\n  /// <summary>\n  /// Use this annotation to specify a type that contains static or const fields\n  /// with values for the annotated property/field/parameter.\n  /// The specified type will be used to improve completion suggestions.\n  /// </summary>\n  /// <example><code>\n  /// namespace TestNamespace\n  /// {\n  ///   public class Constants\n  ///   {\n  ///     public static int INT_CONST = 1;\n  ///     public const string STRING_CONST = \"1\";\n  ///   }\n  ///\n  ///   public class Class1\n  ///   {\n  ///     [ValueProvider(\"TestNamespace.Constants\")] public int myField;\n  ///     public void Foo([ValueProvider(\"TestNamespace.Constants\")] string str) { }\n  ///\n  ///     public void Test()\n  ///     {\n  ///       Foo(/*try completion here*/);//\n  ///       myField = /*try completion here*/\n  ///     }\n  ///   }\n  /// }\n  /// </code></example>\n  [AttributeUsage(\n    AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field,\n    AllowMultiple = true)]\n  public sealed class ValueProviderAttribute : Attribute\n  {\n    public ValueProviderAttribute([NotNull] string name)\n    {\n      Name = name;\n    }\n\n    [NotNull] public string Name { get; }\n  }\n\n  /// <summary>\n  /// Indicates that the function argument should be a string literal and match one\n  /// of the parameters of the caller function. For example, ReSharper annotates\n  /// the parameter of <see cref=\"System.ArgumentNullException\"/>.\n  /// </summary>\n  /// <example><code>\n  /// void Foo(string param) {\n  ///   if (param == null)\n  ///     throw new ArgumentNullException(\"par\"); // Warning: Cannot resolve symbol\n  /// }\n  /// </code></example>\n  [AttributeUsage(AttributeTargets.Parameter)]\n  public sealed class InvokerParameterNameAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates that the method is contained in a type that implements\n  /// <c>System.ComponentModel.INotifyPropertyChanged</c> interface and this method\n  /// is used to notify that some property value changed.\n  /// </summary>\n  /// <remarks>\n  /// The method should be non-static and conform to one of the supported signatures:\n  /// <list>\n  /// <item><c>NotifyChanged(string)</c></item>\n  /// <item><c>NotifyChanged(params string[])</c></item>\n  /// <item><c>NotifyChanged{T}(Expression{Func{T}})</c></item>\n  /// <item><c>NotifyChanged{T,U}(Expression{Func{T,U}})</c></item>\n  /// <item><c>SetProperty{T}(ref T, T, string)</c></item>\n  /// </list>\n  /// </remarks>\n  /// <example><code>\n  /// public class Foo : INotifyPropertyChanged {\n  ///   public event PropertyChangedEventHandler PropertyChanged;\n  /// \n  ///   [NotifyPropertyChangedInvocator]\n  ///   protected virtual void NotifyChanged(string propertyName) { ... }\n  ///\n  ///   string _name;\n  /// \n  ///   public string Name {\n  ///     get { return _name; }\n  ///     set { _name = value; NotifyChanged(\"LastName\"); /* Warning */ }\n  ///   }\n  /// }\n  /// </code>\n  /// Examples of generated notifications:\n  /// <list>\n  /// <item><c>NotifyChanged(\"Property\")</c></item>\n  /// <item><c>NotifyChanged(() =&gt; Property)</c></item>\n  /// <item><c>NotifyChanged((VM x) =&gt; x.Property)</c></item>\n  /// <item><c>SetProperty(ref myField, value, \"Property\")</c></item>\n  /// </list>\n  /// </example>\n  [AttributeUsage(AttributeTargets.Method)]\n  public sealed class NotifyPropertyChangedInvocatorAttribute : Attribute\n  {\n    public NotifyPropertyChangedInvocatorAttribute() { }\n    public NotifyPropertyChangedInvocatorAttribute([NotNull] string parameterName)\n    {\n      ParameterName = parameterName;\n    }\n\n    [CanBeNull] public string ParameterName { get; }\n  }\n\n  /// <summary>\n  /// Describes dependency between method input and output.\n  /// </summary>\n  /// <syntax>\n  /// <p>Function Definition Table syntax:</p>\n  /// <list>\n  /// <item>FDT      ::= FDTRow [;FDTRow]*</item>\n  /// <item>FDTRow   ::= Input =&gt; Output | Output &lt;= Input</item>\n  /// <item>Input    ::= ParameterName: Value [, Input]*</item>\n  /// <item>Output   ::= [ParameterName: Value]* {halt|stop|void|nothing|Value}</item>\n  /// <item>Value    ::= true | false | null | notnull | canbenull</item>\n  /// </list>\n  /// If the method has a single input parameter, its name could be omitted.<br/>\n  /// Using <c>halt</c> (or <c>void</c>/<c>nothing</c>, which is the same) for the method output\n  /// means that the method doesn't return normally (throws or terminates the process).<br/>\n  /// Value <c>canbenull</c> is only applicable for output parameters.<br/>\n  /// You can use multiple <c>[ContractAnnotation]</c> for each FDT row, or use single attribute\n  /// with rows separated by semicolon. There is no notion of order rows, all rows are checked\n  /// for applicability and applied per each program state tracked by the analysis engine.<br/>\n  /// </syntax>\n  /// <examples><list>\n  /// <item><code>\n  /// [ContractAnnotation(\"=&gt; halt\")]\n  /// public void TerminationMethod()\n  /// </code></item>\n  /// <item><code>\n  /// [ContractAnnotation(\"null &lt;= param:null\")] // reverse condition syntax\n  /// public string GetName(string surname)\n  /// </code></item>\n  /// <item><code>\n  /// [ContractAnnotation(\"s:null =&gt; true\")]\n  /// public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty()\n  /// </code></item>\n  /// <item><code>\n  /// // A method that returns null if the parameter is null,\n  /// // and not null if the parameter is not null\n  /// [ContractAnnotation(\"null =&gt; null; notnull =&gt; notnull\")]\n  /// public object Transform(object data)\n  /// </code></item>\n  /// <item><code>\n  /// [ContractAnnotation(\"=&gt; true, result: notnull; =&gt; false, result: null\")]\n  /// public bool TryParse(string s, out Person result)\n  /// </code></item>\n  /// </list></examples>\n  [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]\n  public sealed class ContractAnnotationAttribute : Attribute\n  {\n    public ContractAnnotationAttribute([NotNull] string contract)\n      : this(contract, false) { }\n\n    public ContractAnnotationAttribute([NotNull] string contract, bool forceFullStates)\n    {\n      Contract = contract;\n      ForceFullStates = forceFullStates;\n    }\n\n    [NotNull] public string Contract { get; }\n\n    public bool ForceFullStates { get; }\n  }\n\n  /// <summary>\n  /// Indicates whether the marked element should be localized.\n  /// </summary>\n  /// <example><code>\n  /// [LocalizationRequiredAttribute(true)]\n  /// class Foo {\n  ///   string str = \"my string\"; // Warning: Localizable string\n  /// }\n  /// </code></example>\n  [AttributeUsage(AttributeTargets.All)]\n  public sealed class LocalizationRequiredAttribute : Attribute\n  {\n    public LocalizationRequiredAttribute() : this(true) { }\n\n    public LocalizationRequiredAttribute(bool required)\n    {\n      Required = required;\n    }\n\n    public bool Required { get; }\n  }\n\n  /// <summary>\n  /// Indicates that the value of the marked type (or its derivatives)\n  /// cannot be compared using '==' or '!=' operators and <c>Equals()</c>\n  /// should be used instead. However, using '==' or '!=' for comparison\n  /// with <c>null</c> is always permitted.\n  /// </summary>\n  /// <example><code>\n  /// [CannotApplyEqualityOperator]\n  /// class NoEquality { }\n  /// \n  /// class UsesNoEquality {\n  ///   void Test() {\n  ///     var ca1 = new NoEquality();\n  ///     var ca2 = new NoEquality();\n  ///     if (ca1 != null) { // OK\n  ///       bool condition = ca1 == ca2; // Warning\n  ///     }\n  ///   }\n  /// }\n  /// </code></example>\n  [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class | AttributeTargets.Struct)]\n  public sealed class CannotApplyEqualityOperatorAttribute : Attribute { }\n\n  /// <summary>\n  /// When applied to a target attribute, specifies a requirement for any type marked\n  /// with the target attribute to implement or inherit specific type or types.\n  /// </summary>\n  /// <example><code>\n  /// [BaseTypeRequired(typeof(IComponent)] // Specify requirement\n  /// class ComponentAttribute : Attribute { }\n  /// \n  /// [Component] // ComponentAttribute requires implementing IComponent interface\n  /// class MyComponent : IComponent { }\n  /// </code></example>\n  [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]\n  [BaseTypeRequired(typeof(Attribute))]\n  public sealed class BaseTypeRequiredAttribute : Attribute\n  {\n    public BaseTypeRequiredAttribute([NotNull] Type baseType)\n    {\n      BaseType = baseType;\n    }\n\n    [NotNull] public Type BaseType { get; }\n  }\n\n  /// <summary>\n  /// Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library),\n  /// so this symbol will not be reported as unused (as well as by other usage inspections).\n  /// </summary>\n  [AttributeUsage(AttributeTargets.All, Inherited = false)]\n  public sealed class UsedImplicitlyAttribute : Attribute\n  {\n    public UsedImplicitlyAttribute()\n      : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { }\n\n    public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags)\n      : this(useKindFlags, ImplicitUseTargetFlags.Default) { }\n\n    public UsedImplicitlyAttribute(ImplicitUseTargetFlags targetFlags)\n      : this(ImplicitUseKindFlags.Default, targetFlags) { }\n\n    public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags)\n    {\n      UseKindFlags = useKindFlags;\n      TargetFlags = targetFlags;\n    }\n\n    public ImplicitUseKindFlags UseKindFlags { get; }\n\n    public ImplicitUseTargetFlags TargetFlags { get; }\n  }\n\n  /// <summary>\n  /// Can be applied to attributes, type parameters, and parameters of a type assignable from <see cref=\"System.Type\"/> .\n  /// When applied to an attribute, the decorated attribute behaves the same as <see cref=\"UsedImplicitlyAttribute\"/>.\n  /// When applied to a type parameter or to a parameter of type <see cref=\"System.Type\"/>,  indicates that the corresponding type\n  /// is used implicitly.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Class | AttributeTargets.GenericParameter | AttributeTargets.Parameter)]\n  public sealed class MeansImplicitUseAttribute : Attribute\n  {\n    public MeansImplicitUseAttribute()\n      : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { }\n\n    public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags)\n      : this(useKindFlags, ImplicitUseTargetFlags.Default) { }\n\n    public MeansImplicitUseAttribute(ImplicitUseTargetFlags targetFlags)\n      : this(ImplicitUseKindFlags.Default, targetFlags) { }\n\n    public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags)\n    {\n      UseKindFlags = useKindFlags;\n      TargetFlags = targetFlags;\n    }\n\n    [UsedImplicitly] public ImplicitUseKindFlags UseKindFlags { get; }\n\n    [UsedImplicitly] public ImplicitUseTargetFlags TargetFlags { get; }\n  }\n\n  /// <summary>\n  /// Specify the details of implicitly used symbol when it is marked\n  /// with <see cref=\"MeansImplicitUseAttribute\"/> or <see cref=\"UsedImplicitlyAttribute\"/>.\n  /// </summary>\n  [Flags]\n  public enum ImplicitUseKindFlags\n  {\n    Default = Access | Assign | InstantiatedWithFixedConstructorSignature,\n    /// <summary>Only entity marked with attribute considered used.</summary>\n    Access = 1,\n    /// <summary>Indicates implicit assignment to a member.</summary>\n    Assign = 2,\n    /// <summary>\n    /// Indicates implicit instantiation of a type with fixed constructor signature.\n    /// That means any unused constructor parameters won't be reported as such.\n    /// </summary>\n    InstantiatedWithFixedConstructorSignature = 4,\n    /// <summary>Indicates implicit instantiation of a type.</summary>\n    InstantiatedNoFixedConstructorSignature = 8,\n  }\n\n  /// <summary>\n  /// Specify what is considered to be used implicitly when marked\n  /// with <see cref=\"MeansImplicitUseAttribute\"/> or <see cref=\"UsedImplicitlyAttribute\"/>.\n  /// </summary>\n  [Flags]\n  public enum ImplicitUseTargetFlags\n  {\n    Default = Itself,\n    Itself = 1,\n    /// <summary>Members of entity marked with attribute are considered used.</summary>\n    Members = 2,\n    /// <summary>Entity marked with attribute and all its members considered used.</summary>\n    WithMembers = Itself | Members\n  }\n\n  /// <summary>\n  /// This attribute is intended to mark publicly available API\n  /// which should not be removed and so is treated as used.\n  /// </summary>\n  [MeansImplicitUse(ImplicitUseTargetFlags.WithMembers)]\n  [AttributeUsage(AttributeTargets.All, Inherited = false)]\n  public sealed class PublicAPIAttribute : Attribute\n  {\n    public PublicAPIAttribute() { }\n\n    public PublicAPIAttribute([NotNull] string comment)\n    {\n      Comment = comment;\n    }\n\n    [CanBeNull] public string Comment { get; }\n  }\n\n  /// <summary>\n  /// Tells code analysis engine if the parameter is completely handled when the invoked method is on stack.\n  /// If the parameter is a delegate, indicates that delegate is executed while the method is executed.\n  /// If the parameter is an enumerable, indicates that it is enumerated while the method is executed.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter)]\n  public sealed class InstantHandleAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates that a method does not make any observable state changes.\n  /// The same as <c>System.Diagnostics.Contracts.PureAttribute</c>.\n  /// </summary>\n  /// <example><code>\n  /// [Pure] int Multiply(int x, int y) => x * y;\n  /// \n  /// void M() {\n  ///   Multiply(123, 42); // Waring: Return value of pure method is not used\n  /// }\n  /// </code></example>\n  [AttributeUsage(AttributeTargets.Method)]\n  public sealed class PureAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates that the return value of the method invocation must be used.\n  /// </summary>\n  /// <remarks>\n  /// Methods decorated with this attribute (in contrast to pure methods) might change state,\n  /// but make no sense without using their return value. <br/>\n  /// Similarly to <see cref=\"PureAttribute\"/>, this attribute\n  /// will help detecting usages of the method when the return value in not used.\n  /// Additionally, you can optionally specify a custom message, which will be used when showing warnings, e.g.\n  /// <code>[MustUseReturnValue(\"Use the return value to...\")]</code>.\n  /// </remarks>\n  [AttributeUsage(AttributeTargets.Method)]\n  public sealed class MustUseReturnValueAttribute : Attribute\n  {\n    public MustUseReturnValueAttribute() { }\n\n    public MustUseReturnValueAttribute([NotNull] string justification)\n    {\n      Justification = justification;\n    }\n\n    [CanBeNull] public string Justification { get; }\n  }\n\n  /// <summary>\n  /// Indicates the type member or parameter of some type, that should be used instead of all other ways\n  /// to get the value of that type. This annotation is useful when you have some \"context\" value evaluated\n  /// and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one.\n  /// </summary>\n  /// <example><code>\n  /// class Foo {\n  ///   [ProvidesContext] IBarService _barService = ...;\n  /// \n  ///   void ProcessNode(INode node) {\n  ///     DoSomething(node, node.GetGlobalServices().Bar);\n  ///     //              ^ Warning: use value of '_barService' field\n  ///   }\n  /// }\n  /// </code></example>\n  [AttributeUsage(\n    AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter | AttributeTargets.Method |\n    AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.GenericParameter)]\n  public sealed class ProvidesContextAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates that a parameter is a path to a file or a folder within a web project.\n  /// Path can be relative or absolute, starting from web root (~).\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter)]\n  public sealed class PathReferenceAttribute : Attribute\n  {\n    public PathReferenceAttribute() { }\n\n    public PathReferenceAttribute([NotNull, PathReference] string basePath)\n    {\n      BasePath = basePath;\n    }\n\n    [CanBeNull] public string BasePath { get; }\n  }\n\n  /// <summary>\n  /// An extension method marked with this attribute is processed by code completion\n  /// as a 'Source Template'. When the extension method is completed over some expression, its source code\n  /// is automatically expanded like a template at call site.\n  /// </summary>\n  /// <remarks>\n  /// Template method body can contain valid source code and/or special comments starting with '$'.\n  /// Text inside these comments is added as source code when the template is applied. Template parameters\n  /// can be used either as additional method parameters or as identifiers wrapped in two '$' signs.\n  /// Use the <see cref=\"MacroAttribute\"/> attribute to specify macros for parameters.\n  /// </remarks>\n  /// <example>\n  /// In this example, the 'forEach' method is a source template available over all values\n  /// of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block:\n  /// <code>\n  /// [SourceTemplate]\n  /// public static void forEach&lt;T&gt;(this IEnumerable&lt;T&gt; xs) {\n  ///   foreach (var x in xs) {\n  ///      //$ $END$\n  ///   }\n  /// }\n  /// </code>\n  /// </example>\n  [AttributeUsage(AttributeTargets.Method)]\n  public sealed class SourceTemplateAttribute : Attribute { }\n\n  /// <summary>\n  /// Allows specifying a macro for a parameter of a <see cref=\"SourceTemplateAttribute\">source template</see>.\n  /// </summary>\n  /// <remarks>\n  /// You can apply the attribute on the whole method or on any of its additional parameters. The macro expression\n  /// is defined in the <see cref=\"MacroAttribute.Expression\"/> property. When applied on a method, the target\n  /// template parameter is defined in the <see cref=\"MacroAttribute.Target\"/> property. To apply the macro silently\n  /// for the parameter, set the <see cref=\"MacroAttribute.Editable\"/> property value = -1.\n  /// </remarks>\n  /// <example>\n  /// Applying the attribute on a source template method:\n  /// <code>\n  /// [SourceTemplate, Macro(Target = \"item\", Expression = \"suggestVariableName()\")]\n  /// public static void forEach&lt;T&gt;(this IEnumerable&lt;T&gt; collection) {\n  ///   foreach (var item in collection) {\n  ///     //$ $END$\n  ///   }\n  /// }\n  /// </code>\n  /// Applying the attribute on a template method parameter:\n  /// <code>\n  /// [SourceTemplate]\n  /// public static void something(this Entity x, [Macro(Expression = \"guid()\", Editable = -1)] string newguid) {\n  ///   /*$ var $x$Id = \"$newguid$\" + x.ToString();\n  ///   x.DoSomething($x$Id); */\n  /// }\n  /// </code>\n  /// </example>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method, AllowMultiple = true)]\n  public sealed class MacroAttribute : Attribute\n  {\n    /// <summary>\n    /// Allows specifying a macro that will be executed for a <see cref=\"SourceTemplateAttribute\">source template</see>\n    /// parameter when the template is expanded.\n    /// </summary>\n    [CanBeNull] public string Expression { get; set; }\n\n    /// <summary>\n    /// Allows specifying which occurrence of the target parameter becomes editable when the template is deployed.\n    /// </summary>\n    /// <remarks>\n    /// If the target parameter is used several times in the template, only one occurrence becomes editable;\n    /// other occurrences are changed synchronously. To specify the zero-based index of the editable occurrence,\n    /// use values >= 0. To make the parameter non-editable when the template is expanded, use -1.\n    /// </remarks>\n    public int Editable { get; set; }\n\n    /// <summary>\n    /// Identifies the target parameter of a <see cref=\"SourceTemplateAttribute\">source template</see> if the\n    /// <see cref=\"MacroAttribute\"/> is applied on a template method.\n    /// </summary>\n    [CanBeNull] public string Target { get; set; }\n  }\n\n  [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]\n  public sealed class AspMvcAreaMasterLocationFormatAttribute : Attribute\n  {\n    public AspMvcAreaMasterLocationFormatAttribute([NotNull] string format)\n    {\n      Format = format;\n    }\n\n    [NotNull] public string Format { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]\n  public sealed class AspMvcAreaPartialViewLocationFormatAttribute : Attribute\n  {\n    public AspMvcAreaPartialViewLocationFormatAttribute([NotNull] string format)\n    {\n      Format = format;\n    }\n\n    [NotNull] public string Format { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]\n  public sealed class AspMvcAreaViewLocationFormatAttribute : Attribute\n  {\n    public AspMvcAreaViewLocationFormatAttribute([NotNull] string format)\n    {\n      Format = format;\n    }\n\n    [NotNull] public string Format { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]\n  public sealed class AspMvcMasterLocationFormatAttribute : Attribute\n  {\n    public AspMvcMasterLocationFormatAttribute([NotNull] string format)\n    {\n      Format = format;\n    }\n\n    [NotNull] public string Format { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]\n  public sealed class AspMvcPartialViewLocationFormatAttribute : Attribute\n  {\n    public AspMvcPartialViewLocationFormatAttribute([NotNull] string format)\n    {\n      Format = format;\n    }\n\n    [NotNull] public string Format { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]\n  public sealed class AspMvcViewLocationFormatAttribute : Attribute\n  {\n    public AspMvcViewLocationFormatAttribute([NotNull] string format)\n    {\n      Format = format;\n    }\n\n    [NotNull] public string Format { get; }\n  }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter\n  /// is an MVC action. If applied to a method, the MVC action name is calculated\n  /// implicitly from the context. Use this attribute for custom wrappers similar to\n  /// <c>System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcActionAttribute : Attribute\n  {\n    public AspMvcActionAttribute() { }\n\n    public AspMvcActionAttribute([NotNull] string anonymousProperty)\n    {\n      AnonymousProperty = anonymousProperty;\n    }\n\n    [CanBeNull] public string AnonymousProperty { get; }\n  }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. Indicates that the marked parameter is an MVC area.\n  /// Use this attribute for custom wrappers similar to\n  /// <c>System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcAreaAttribute : Attribute\n  {\n    public AspMvcAreaAttribute() { }\n\n    public AspMvcAreaAttribute([NotNull] string anonymousProperty)\n    {\n      AnonymousProperty = anonymousProperty;\n    }\n\n    [CanBeNull] public string AnonymousProperty { get; }\n  }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is\n  /// an MVC controller. If applied to a method, the MVC controller name is calculated\n  /// implicitly from the context. Use this attribute for custom wrappers similar to\n  /// <c>System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String, String)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcControllerAttribute : Attribute\n  {\n    public AspMvcControllerAttribute() { }\n\n    public AspMvcControllerAttribute([NotNull] string anonymousProperty)\n    {\n      AnonymousProperty = anonymousProperty;\n    }\n\n    [CanBeNull] public string AnonymousProperty { get; }\n  }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. Indicates that the marked parameter is an MVC Master. Use this attribute\n  /// for custom wrappers similar to <c>System.Web.Mvc.Controller.View(String, String)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcMasterAttribute : Attribute { }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. Indicates that the marked parameter is an MVC model type. Use this attribute\n  /// for custom wrappers similar to <c>System.Web.Mvc.Controller.View(String, Object)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter)]\n  public sealed class AspMvcModelTypeAttribute : Attribute { }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is an MVC\n  /// partial view. If applied to a method, the MVC partial view name is calculated implicitly\n  /// from the context. Use this attribute for custom wrappers similar to\n  /// <c>System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper, String)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcPartialViewAttribute : Attribute { }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]\n  public sealed class AspMvcSuppressViewErrorAttribute : Attribute { }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. Indicates that a parameter is an MVC display template.\n  /// Use this attribute for custom wrappers similar to\n  /// <c>System.Web.Mvc.Html.DisplayExtensions.DisplayForModel(HtmlHelper, String)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcDisplayTemplateAttribute : Attribute { }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. Indicates that the marked parameter is an MVC editor template.\n  /// Use this attribute for custom wrappers similar to\n  /// <c>System.Web.Mvc.Html.EditorExtensions.EditorForModel(HtmlHelper, String)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcEditorTemplateAttribute : Attribute { }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. Indicates that the marked parameter is an MVC template.\n  /// Use this attribute for custom wrappers similar to\n  /// <c>System.ComponentModel.DataAnnotations.UIHintAttribute(System.String)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcTemplateAttribute : Attribute { }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter\n  /// is an MVC view component. If applied to a method, the MVC view name is calculated implicitly\n  /// from the context. Use this attribute for custom wrappers similar to\n  /// <c>System.Web.Mvc.Controller.View(Object)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcViewAttribute : Attribute { }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter\n  /// is an MVC view component name.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcViewComponentAttribute : Attribute { }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter\n  /// is an MVC view component view. If applied to a method, the MVC view component view name is default.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class AspMvcViewComponentViewAttribute : Attribute { }\n\n  /// <summary>\n  /// ASP.NET MVC attribute. When applied to a parameter of an attribute,\n  /// indicates that this parameter is an MVC action name.\n  /// </summary>\n  /// <example><code>\n  /// [ActionName(\"Foo\")]\n  /// public ActionResult Login(string returnUrl) {\n  ///   ViewBag.ReturnUrl = Url.Action(\"Foo\"); // OK\n  ///   return RedirectToAction(\"Bar\"); // Error: Cannot resolve action\n  /// }\n  /// </code></example>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)]\n  public sealed class AspMvcActionSelectorAttribute : Attribute { }\n\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field)]\n  public sealed class HtmlElementAttributesAttribute : Attribute\n  {\n    public HtmlElementAttributesAttribute() { }\n\n    public HtmlElementAttributesAttribute([NotNull] string name)\n    {\n      Name = name;\n    }\n\n    [CanBeNull] public string Name { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)]\n  public sealed class HtmlAttributeValueAttribute : Attribute\n  {\n    public HtmlAttributeValueAttribute([NotNull] string name)\n    {\n      Name = name;\n    }\n\n    [NotNull] public string Name { get; }\n  }\n\n  /// <summary>\n  /// Razor attribute. Indicates that the marked parameter or method is a Razor section.\n  /// Use this attribute for custom wrappers similar to\n  /// <c>System.Web.WebPages.WebPageBase.RenderSection(String)</c>.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)]\n  public sealed class RazorSectionAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates how method, constructor invocation, or property access\n  /// over collection type affects the contents of the collection.\n  /// Use <see cref=\"CollectionAccessType\"/> to specify the access type.\n  /// </summary>\n  /// <remarks>\n  /// Using this attribute only makes sense if all collection methods are marked with this attribute.\n  /// </remarks>\n  /// <example><code>\n  /// public class MyStringCollection : List&lt;string&gt;\n  /// {\n  ///   [CollectionAccess(CollectionAccessType.Read)]\n  ///   public string GetFirstString()\n  ///   {\n  ///     return this.ElementAt(0);\n  ///   }\n  /// }\n  /// class Test\n  /// {\n  ///   public void Foo()\n  ///   {\n  ///     // Warning: Contents of the collection is never updated\n  ///     var col = new MyStringCollection();\n  ///     string x = col.GetFirstString();\n  ///   }\n  /// }\n  /// </code></example>\n  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Property)]\n  public sealed class CollectionAccessAttribute : Attribute\n  {\n    public CollectionAccessAttribute(CollectionAccessType collectionAccessType)\n    {\n      CollectionAccessType = collectionAccessType;\n    }\n\n    public CollectionAccessType CollectionAccessType { get; }\n  }\n\n  /// <summary>\n  /// Provides a value for the <see cref=\"CollectionAccessAttribute\"/> to define\n  /// how the collection method invocation affects the contents of the collection.\n  /// </summary>\n  [Flags]\n  public enum CollectionAccessType\n  {\n    /// <summary>Method does not use or modify content of the collection.</summary>\n    None = 0,\n    /// <summary>Method only reads content of the collection but does not modify it.</summary>\n    Read = 1,\n    /// <summary>Method can change content of the collection but does not add new elements.</summary>\n    ModifyExistingContent = 2,\n    /// <summary>Method can add new elements to the collection.</summary>\n    UpdatedContent = ModifyExistingContent | 4\n  }\n\n  /// <summary>\n  /// Indicates that the marked method is assertion method, i.e. it halts the control flow if\n  /// one of the conditions is satisfied. To set the condition, mark one of the parameters with\n  /// <see cref=\"AssertionConditionAttribute\"/> attribute.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Method)]\n  public sealed class AssertionMethodAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates the condition parameter of the assertion method. The method itself should be\n  /// marked by <see cref=\"AssertionMethodAttribute\"/> attribute. The mandatory argument of\n  /// the attribute is the assertion type.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter)]\n  public sealed class AssertionConditionAttribute : Attribute\n  {\n    public AssertionConditionAttribute(AssertionConditionType conditionType)\n    {\n      ConditionType = conditionType;\n    }\n\n    public AssertionConditionType ConditionType { get; }\n  }\n\n  /// <summary>\n  /// Specifies assertion type. If the assertion method argument satisfies the condition,\n  /// then the execution continues. Otherwise, execution is assumed to be halted.\n  /// </summary>\n  public enum AssertionConditionType\n  {\n    /// <summary>Marked parameter should be evaluated to true.</summary>\n    IS_TRUE = 0,\n    /// <summary>Marked parameter should be evaluated to false.</summary>\n    IS_FALSE = 1,\n    /// <summary>Marked parameter should be evaluated to null value.</summary>\n    IS_NULL = 2,\n    /// <summary>Marked parameter should be evaluated to not null value.</summary>\n    IS_NOT_NULL = 3,\n  }\n\n  /// <summary>\n  /// Indicates that the marked method unconditionally terminates control flow execution.\n  /// For example, it could unconditionally throw exception.\n  /// </summary>\n  [Obsolete(\"Use [ContractAnnotation('=> halt')] instead\")]\n  [AttributeUsage(AttributeTargets.Method)]\n  public sealed class TerminatesProgramAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates that method is pure LINQ method, with postponed enumeration (like Enumerable.Select,\n  /// .Where). This annotation allows inference of [InstantHandle] annotation for parameters\n  /// of delegate type by analyzing LINQ method chains.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Method)]\n  public sealed class LinqTunnelAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates that IEnumerable passed as a parameter is not enumerated.\n  /// Use this annotation to suppress the 'Possible multiple enumeration of IEnumerable' inspection.\n  /// </summary>\n  /// <example><code>\n  /// static void ThrowIfNull&lt;T&gt;([NoEnumeration] T v, string n) where T : class\n  /// {\n  ///   // custom check for null but no enumeration\n  /// }\n  /// \n  /// void Foo(IEnumerable&lt;string&gt; values)\n  /// {\n  ///   ThrowIfNull(values, nameof(values));\n  ///   var x = values.ToList(); // No warnings about multiple enumeration\n  /// }\n  /// </code></example>\n  [AttributeUsage(AttributeTargets.Parameter)]\n  public sealed class NoEnumerationAttribute : Attribute { }\n\n  /// <summary>\n  /// Indicates that the marked parameter is a regular expression pattern.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Parameter)]\n  public sealed class RegexPatternAttribute : Attribute { }\n\n  /// <summary>\n  /// Prevents the Member Reordering feature from tossing members of the marked class.\n  /// </summary>\n  /// <remarks>\n  /// The attribute must be mentioned in your member reordering patterns.\n  /// </remarks>\n  [AttributeUsage(\n    AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.Enum)]\n  public sealed class NoReorderAttribute : Attribute { }\n\n  /// <summary>\n  /// XAML attribute. Indicates the type that has <c>ItemsSource</c> property and should be treated\n  /// as <c>ItemsControl</c>-derived type, to enable inner items <c>DataContext</c> type resolve.\n  /// </summary>\n  [AttributeUsage(AttributeTargets.Class)]\n  public sealed class XamlItemsControlAttribute : Attribute { }\n\n  /// <summary>\n  /// XAML attribute. Indicates the property of some <c>BindingBase</c>-derived type, that\n  /// is used to bind some item of <c>ItemsControl</c>-derived type. This annotation will\n  /// enable the <c>DataContext</c> type resolve for XAML bindings for such properties.\n  /// </summary>\n  /// <remarks>\n  /// Property should have the tree ancestor of the <c>ItemsControl</c> type or\n  /// marked with the <see cref=\"XamlItemsControlAttribute\"/> attribute.\n  /// </remarks>\n  [AttributeUsage(AttributeTargets.Property)]\n  public sealed class XamlItemBindingOfItemsControlAttribute : Attribute { }\n\n  [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]\n  public sealed class AspChildControlTypeAttribute : Attribute\n  {\n    public AspChildControlTypeAttribute([NotNull] string tagName, [NotNull] Type controlType)\n    {\n      TagName = tagName;\n      ControlType = controlType;\n    }\n\n    [NotNull] public string TagName { get; }\n\n    [NotNull] public Type ControlType { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)]\n  public sealed class AspDataFieldAttribute : Attribute { }\n\n  [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)]\n  public sealed class AspDataFieldsAttribute : Attribute { }\n\n  [AttributeUsage(AttributeTargets.Property)]\n  public sealed class AspMethodPropertyAttribute : Attribute { }\n\n  [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]\n  public sealed class AspRequiredAttributeAttribute : Attribute\n  {\n    public AspRequiredAttributeAttribute([NotNull] string attribute)\n    {\n      Attribute = attribute;\n    }\n\n    [NotNull] public string Attribute { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Property)]\n  public sealed class AspTypePropertyAttribute : Attribute\n  {\n    public bool CreateConstructorReferences { get; }\n\n    public AspTypePropertyAttribute(bool createConstructorReferences)\n    {\n      CreateConstructorReferences = createConstructorReferences;\n    }\n  }\n\n  [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]\n  public sealed class RazorImportNamespaceAttribute : Attribute\n  {\n    public RazorImportNamespaceAttribute([NotNull] string name)\n    {\n      Name = name;\n    }\n\n    [NotNull] public string Name { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]\n  public sealed class RazorInjectionAttribute : Attribute\n  {\n    public RazorInjectionAttribute([NotNull] string type, [NotNull] string fieldName)\n    {\n      Type = type;\n      FieldName = fieldName;\n    }\n\n    [NotNull] public string Type { get; }\n\n    [NotNull] public string FieldName { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]\n  public sealed class RazorDirectiveAttribute : Attribute\n  {\n    public RazorDirectiveAttribute([NotNull] string directive)\n    {\n      Directive = directive;\n    }\n\n    [NotNull] public string Directive { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]\n  public sealed class RazorPageBaseTypeAttribute : Attribute\n  {\n      public RazorPageBaseTypeAttribute([NotNull] string baseType)\n      {\n        BaseType = baseType;\n      }\n      public RazorPageBaseTypeAttribute([NotNull] string baseType, string pageName)\n      {\n          BaseType = baseType;\n          PageName = pageName;\n      }\n\n      [NotNull] public string BaseType { get; }\n      [CanBeNull] public string PageName { get; }\n  }\n\n  [AttributeUsage(AttributeTargets.Method)]\n  public sealed class RazorHelperCommonAttribute : Attribute { }\n\n  [AttributeUsage(AttributeTargets.Property)]\n  public sealed class RazorLayoutAttribute : Attribute { }\n\n  [AttributeUsage(AttributeTargets.Method)]\n  public sealed class RazorWriteLiteralMethodAttribute : Attribute { }\n\n  [AttributeUsage(AttributeTargets.Method)]\n  public sealed class RazorWriteMethodAttribute : Attribute { }\n\n  [AttributeUsage(AttributeTargets.Parameter)]\n  public sealed class RazorWriteMethodParameterAttribute : Attribute { }\n}"
  },
  {
    "path": "tests/LeakSample/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n//In order to begin building localizable applications, set\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n                                     //(used if a resource is not found in the page,\n                                     // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n                                              //(used if a resource is not found in the page,\n                                              // app, or any theme specific resource dictionaries)\n)]\n"
  },
  {
    "path": "tests/LeakSample/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace LeakSample.Properties\n{\n\n\n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources\n    {\n\n        private static global::System.Resources.ResourceManager resourceMan;\n\n        private static global::System.Globalization.CultureInfo resourceCulture;\n\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources()\n        {\n        }\n\n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager\n        {\n            get\n            {\n                if ((resourceMan == null))\n                {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"LeakSample.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n\n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture\n        {\n            get\n            {\n                return resourceCulture;\n            }\n            set\n            {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/LeakSample/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "tests/LeakSample/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace LeakSample.Properties\n{\n\n\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"11.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\n    {\n\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n\n        public static Settings Default\n        {\n            get\n            {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/LeakSample/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "tests/LeakSample/Resources/Localization.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace LeakSample.Resources {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Localization {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Localization() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"LeakSample.Resources.Localization\", typeof(Localization).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Hello.\n        /// </summary>\n        internal static string Hello {\n            get {\n                return ResourceManager.GetString(\"Hello\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to wonderful.\n        /// </summary>\n        internal static string Wonderful {\n            get {\n                return ResourceManager.GetString(\"Wonderful\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to world.\n        /// </summary>\n        internal static string World {\n            get {\n                return ResourceManager.GetString(\"World\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/LeakSample/Resources/Localization.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Hello\" xml:space=\"preserve\">\n    <value>Hello</value>\n  </data>\n  <data name=\"Wonderful\" xml:space=\"preserve\">\n    <value>wonderful</value>\n  </data>\n  <data name=\"World\" xml:space=\"preserve\">\n    <value>world</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/LeakSample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.29920.165\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"LeakSample\", \"LeakSample\\LeakSample.csproj\", \"{D2C371CA-7769-40A6-89B8-06B10B917E25}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WPFLocalizeExtension\", \"..\\src\\WPFLocalizeExtension.csproj\", \"{321E7D1C-DCA9-4B48-B1BF-4BE0AA22FDE0}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{D2C371CA-7769-40A6-89B8-06B10B917E25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D2C371CA-7769-40A6-89B8-06B10B917E25}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D2C371CA-7769-40A6-89B8-06B10B917E25}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D2C371CA-7769-40A6-89B8-06B10B917E25}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{321E7D1C-DCA9-4B48-B1BF-4BE0AA22FDE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{321E7D1C-DCA9-4B48-B1BF-4BE0AA22FDE0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{321E7D1C-DCA9-4B48-B1BF-4BE0AA22FDE0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{321E7D1C-DCA9-4B48-B1BF-4BE0AA22FDE0}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {C504E6AC-896D-49F4-8E79-9150BB0E3D9A}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "tests/LocalizationTest/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <configSections>\n        <sectionGroup name=\"userSettings\" type=\"System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" >\n            <section name=\"LocalizationTest.Properties.Settings\" type=\"System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" allowExeDefinition=\"MachineToLocalUser\" requirePermission=\"false\" />\n        </sectionGroup>\n    </configSections>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n    </startup>\n    <userSettings>\n        <LocalizationTest.Properties.Settings>\n            <setting name=\"UICulture\" serializeAs=\"String\">\n                <value>en-GB</value>\n            </setting>\n            <setting name=\"Culture\" serializeAs=\"String\">\n                <value>en-GB</value>\n            </setting>\n        </LocalizationTest.Properties.Settings>\n    </userSettings>\n</configuration>"
  },
  {
    "path": "tests/LocalizationTest/App.xaml",
    "content": "﻿<Application x:Class=\"LocalizationTest.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             StartupUri=\"Loader.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "tests/LocalizationTest/App.xaml.cs",
    "content": "﻿using System.Globalization;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Markup;\nusing LocalizationTest.Properties;\nusing WPFLocalizeExtension.Engine;\n\nnamespace LocalizationTest\n{\n\t/// <summary>\n\t/// Interaction logic for App.xaml\n\t/// </summary>\n\tpublic partial class App : Application\n\t{\n\t\tpublic App()\n\t\t{\n\t\t\tInitialiseCultures();\n\t\t}\n\n\t\tprivate static void InitialiseCultures()\n\t\t{\n\t\t\tif (!string.IsNullOrEmpty(Settings.Default.Culture))\n\t\t\t{\n\t\t\t\tLocalizeDictionary.Instance.Culture\n\t\t\t\t\t= Thread.CurrentThread.CurrentCulture\n\t\t\t\t\t= new CultureInfo(Settings.Default.Culture);\n\t\t\t}\n\n\t\t\tif (!string.IsNullOrEmpty(Settings.Default.UICulture))\n\t\t\t{\n\t\t\t\tLocalizeDictionary.Instance.Culture\n\t\t\t\t\t= Thread.CurrentThread.CurrentUICulture\n\t\t\t\t\t= new CultureInfo(Settings.Default.UICulture);\n\t\t\t}\n\n\t\t\tFrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name)));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tests/LocalizationTest/Loader.xaml",
    "content": "﻿<Window x:Class=\"LocalizationTest.Loader\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        Title=\"Loader\" Height=\"300\" Width=\"300\">\n    <Grid>\n        <Button Content=\"Load\" HorizontalAlignment=\"Left\" Margin=\"10,10,0,0\" VerticalAlignment=\"Top\" Width=\"75\" Click=\"Button_Click_1\"/>\n\n    </Grid>\n</Window>\n"
  },
  {
    "path": "tests/LocalizationTest/Loader.xaml.cs",
    "content": "﻿using System.Windows;\n\nnamespace LocalizationTest\n{\n\t/// <summary>\n\t/// Interaction logic for Loader.xaml\n\t/// </summary>\n\tpublic partial class Loader : Window\n\t{\n\t\tpublic Loader()\n\t\t{\n\t\t\tInitializeComponent();\n\t\t}\n\n\t\tprivate void Button_Click_1(object sender, RoutedEventArgs e)\n\t\t{\n\t\t\tvar form = new Popup();\n\t\t\tform.ShowDialog();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tests/LocalizationTest/LocalizationTest.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\t<PropertyGroup>\n    <TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n\t\t<RootNamespace>LocalizationTest</RootNamespace>\n\t\t<OutputType>WinExe</OutputType>\n\t\t<StartupObject />\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n\n\t<ItemGroup>\n\t\t<!--<ApplicationDefinition Include=\"App.xaml\" SubType=\"Designer\" Generator=\"MSBuild:Compile\" />-->\n\n\t\t<!-- XAML elements -->\n\t\t<!--<Page Include=\"**\\*.xaml\" Exclude=\"App.xaml\" SubType=\"Designer\">\n\t\t\t<Generator>MSBuild:UpdateDesignTimeXaml</Generator>\n\t\t</Page>\n\t\t<Compile Update=\"**\\*.xaml.cs\" SubType=\"Code\" DependentUpon=\"%(Filename)\" />-->\n\n\t\t<!-- Resources -->\n    <EmbeddedResource Update=\"TestResource.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"TestResource.Designer.cs\" />\n    <Compile Update=\"Properties\\Settings.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n\t\t<Compile Update=\"TestResource.Designer.cs\" AutoGen=\"True\" DependentUpon=\"TestResource.resx\" DesignTime=\"True\" />\n\t</ItemGroup>\n  \n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t  <None Update=\"Properties\\Settings.settings\">\n\t    <Generator>SettingsSingleFileGenerator</Generator>\n\t    <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n\t  </None>\n\t</ItemGroup>\n</Project>"
  },
  {
    "path": "tests/LocalizationTest/Popup.xaml",
    "content": "﻿<Window x:Class=\"LocalizationTest.Popup\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:lex=\"clr-namespace:WPFLocalizeExtension.Extensions;assembly=WPFLocalizeExtension\"\n        xmlns:Engine=\"clr-namespace:WPFLocalizeExtension.Engine;assembly=WPFLocalizeExtension\"\n        Engine:LocalizeDictionary.DesignCulture=\"en-GB\"\n        Title=\"Popup\" Height=\"350\" Width=\"525\">\n    <Grid>\n        <Label Content=\"{lex:LocText LocalizationTest:TestResource:test_label}\" HorizontalAlignment=\"Left\" Margin=\"19,10,0,0\" VerticalAlignment=\"Top\"/>\n    </Grid>\n</Window>\n"
  },
  {
    "path": "tests/LocalizationTest/Popup.xaml.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Windows;\n\nnamespace LocalizationTest\n{\n\t/// <summary>\n\t/// Interaction logic for MainWindow.xaml\n\t/// </summary>\n\tpublic partial class Popup : Window\n\t{\n\t\tprivate static int nextInstanceNumber = 0;\n\n\t\tprivate int myInstanceNumber;\n\n\t\tpublic Popup()\n\t\t{\n\t\t\tInitializeComponent();\n\n\t\t\tmyInstanceNumber = nextInstanceNumber;\n\t\t\tnextInstanceNumber++;\n\n\t\t\tDebug.WriteLine(string.Format(\"Creating instance {0}\", myInstanceNumber));\n\t\t}\n\n\t\t~Popup()\n\t\t{\n\t\t\tDebug.WriteLine(string.Format(\"Finalizing instance {0}\", myInstanceNumber));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tests/LocalizationTest/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n//In order to begin building localizable applications, set\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n[assembly: ThemeInfo(\n\tResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n\t//(used if a resource is not found in the page,\n\t// or application resource dictionaries)\n\tResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n\t//(used if a resource is not found in the page,\n\t// app, or any theme specific resource dictionaries)\n)]\n"
  },
  {
    "path": "tests/LocalizationTest/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace LocalizationTest.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"16.4.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"en-GB\")]\n        public string UICulture {\n            get {\n                return ((string)(this[\"UICulture\"]));\n            }\n            set {\n                this[\"UICulture\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"en-GB\")]\n        public string Culture {\n            get {\n                return ((string)(this[\"Culture\"]));\n            }\n            set {\n                this[\"Culture\"] = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/LocalizationTest/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\" GeneratedClassNamespace=\"LocalizationTest.Properties\" GeneratedClassName=\"Settings\">\n  <Profiles />\n  <Settings>\n    <Setting Name=\"UICulture\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">en-GB</Value>\n    </Setting>\n    <Setting Name=\"Culture\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">en-GB</Value>\n    </Setting>\n  </Settings>\n</SettingsFile>"
  },
  {
    "path": "tests/LocalizationTest/TestResource.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace LocalizationTest {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class TestResource {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal TestResource() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"LocalizationTest.TestResource\", typeof(TestResource).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to @test_label.\n        /// </summary>\n        internal static string test_label {\n            get {\n                return ResourceManager.GetString(\"test_label\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/LocalizationTest/TestResource.en-GB.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"test_label\" xml:space=\"preserve\">\n    <value>Test Label en-GB</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/LocalizationTest/TestResource.pl-PL.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"test_label\" xml:space=\"preserve\">\n    <value>Test Label pl-PL</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/LocalizationTest/TestResource.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"test_label\" xml:space=\"preserve\">\n    <value>@test_label</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/LocalizationTest.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.421\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"LocalizationTest\", \"LocalizationTest\\LocalizationTest.csproj\", \"{4463A940-4F5D-4325-8A9E-A8F6E4E8DA97}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WPFLocalizeExtension\", \"..\\src\\WPFLocalizeExtension.csproj\", \"{0C34E642-719D-427D-ACF2-0CDCBA63B5F1}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{4463A940-4F5D-4325-8A9E-A8F6E4E8DA97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4463A940-4F5D-4325-8A9E-A8F6E4E8DA97}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4463A940-4F5D-4325-8A9E-A8F6E4E8DA97}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4463A940-4F5D-4325-8A9E-A8F6E4E8DA97}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0C34E642-719D-427D-ACF2-0CDCBA63B5F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0C34E642-719D-427D-ACF2-0CDCBA63B5F1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0C34E642-719D-427D-ACF2-0CDCBA63B5F1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0C34E642-719D-427D-ACF2-0CDCBA63B5F1}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {8FE7F9FB-EA6A-451A-A7DA-4714756A66EA}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "tests/MemoryTest/App.xaml",
    "content": "﻿<Application x:Class=\"MemoryTest.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n\n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "tests/MemoryTest/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Windows;\n\nnamespace MemoryTest\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "tests/MemoryTest/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"MemoryTest.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:lex=\"http://wpflocalizeextension.codeplex.com\"\n        lex:LocalizeDictionary.DesignCulture=\"de\"\n        lex:ResxLocalizationProvider.DefaultAssembly=\"MemoryTest\"\n        lex:ResxLocalizationProvider.DefaultDictionary=\"Resources\"\n        SizeToContent=\"WidthAndHeight\"\n        Title=\"MainWindow\">\n    <StackPanel>\n        <!--<Label Content=\"{lex:Loc TestText}\" />-->\n        <Button Name=\"OpenWindow\" Click=\"OpenWindow_Click\" Content=\"Open New Window\" Margin=\"5\" />\n        <Button Name=\"OpenWindowUnlocalized\" Click=\"OpenWindowUnlocalized_Click\" Content=\"Open New Unlocalized Window\" Margin=\"5\" />\n        <Button Name=\"CloseWindows\" Click=\"CloseWindows_Click\" Content=\"Close Windows\" Margin=\"5\" />\n        <Button Name=\"GCCollect\" Click=\"GCCollect_Click\" Content=\"GCCollect\" Margin=\"5\" />\n    </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/MemoryTest/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace MemoryTest\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n\n            WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture = new System.Globalization.CultureInfo(\"en\");\n        }\n\n        List<Window> windowList = new List<Window>();\n\n        private void OpenWindow_Click(object sender, RoutedEventArgs e)\n        {\n            var wnd = new TestWindow();\n            windowList.Add(wnd);\n\n            wnd.Show();\n        }\n\n        private void CloseWindows_Click(object sender, RoutedEventArgs e)\n        {\n            foreach (var wnd in windowList)\n                wnd.Close();\n\n            windowList.Clear();\n        }\n\n        private void OpenWindowUnlocalized_Click(object sender, RoutedEventArgs e)\n        {\n            var wnd = new TestWindowUnlocalized();\n            windowList.Add(wnd);\n\n            wnd.Show();\n        }\n\n        private void GCCollect_Click(object sender, RoutedEventArgs e)\n        {\n            GC.Collect();\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MemoryTest/MemoryTest.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\t<PropertyGroup>\n\t\t<TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n    <!--Workaround for Error\tMSB4216\tCould not run the \"GenerateResource\" -->\n    <GenerateResourceMSBuildArchitecture>CurrentArchitecture</GenerateResourceMSBuildArchitecture>\n\n    <RootNamespace>MemoryTest</RootNamespace>\n\t\t<OutputType>WinExe</OutputType>\n\t\t<StartupObject /> </PropertyGroup>\n\n\t<ItemGroup>\n\t\t<!-- Resources -->\n    <EmbeddedResource Update=\"Properties\\Resources.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"Properties\\Resources.Designer.cs\" />\n\t\t<Compile Update=\"Properties\\Resources.Designer.cs\" AutoGen=\"True\" DependentUpon=\"Resources.resx\" DesignTime=\"True\" />\n\t</ItemGroup>\n  \n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t</ItemGroup>\n</Project>"
  },
  {
    "path": "tests/MemoryTest/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n//In order to begin building localizable applications, set\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n// [assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.MainAssembly)]\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n                                     //(used if a resource is not found in the page,\n                                     // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n                                              //(used if a resource is not found in the page,\n                                              // app, or any theme specific resource dictionaries)\n)]"
  },
  {
    "path": "tests/MemoryTest/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.18051\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace MemoryTest.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"MemoryTest.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to TestText.\n        /// </summary>\n        public static string TestText {\n            get {\n                return ResourceManager.GetString(\"TestText\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MemoryTest/Properties/Resources.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>Dies ist ein Test.</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/MemoryTest/Properties/Resources.en.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>This is a test.</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/MemoryTest/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"TestText\" xml:space=\"preserve\">\n    <value>TestText</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/MemoryTest/TestWindow.xaml",
    "content": "﻿<Window x:Class=\"MemoryTest.TestWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:lex=\"http://wpflocalizeextension.codeplex.com\"\n        lex:LocalizeDictionary.DesignCulture=\"en\"\n        lex:ResxLocalizationProvider.DefaultAssembly=\"MemoryTest\"\n        lex:ResxLocalizationProvider.DefaultDictionary=\"Resources\"\n        SizeToContent=\"WidthAndHeight\"\n        Title=\"TestWindow\">\n    <Label Content=\"{lex:Loc TestText}\" />\n</Window>\n"
  },
  {
    "path": "tests/MemoryTest/TestWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Shapes;\n\nnamespace MemoryTest\n{\n    /// <summary>\n    /// Interaction logic for TestWindow.xaml\n    /// </summary>\n    public partial class TestWindow : Window\n    {\n        private static int nextInstanceNumber = 0;\n\n        private int myInstanceNumber;\n\n        public TestWindow()\n        {\n            InitializeComponent();\n\n            myInstanceNumber = nextInstanceNumber;\n            nextInstanceNumber++;\n\n            Debug.WriteLine(string.Format(\"Creating localized instance {0}\", myInstanceNumber));\n        }\n\n        ~TestWindow()\n        {\n            Debug.WriteLine(string.Format(\"Finalizing localized instance {0}\", myInstanceNumber));\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MemoryTest/TestWindowUnlocalized.xaml",
    "content": "﻿<Window x:Class=\"MemoryTest.TestWindowUnlocalized\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        SizeToContent=\"WidthAndHeight\"\n        Title=\"TestWindowUnlocalized\">\n    <Label Content=\"This is a Test.\" />\n</Window>\n"
  },
  {
    "path": "tests/MemoryTest/TestWindowUnlocalized.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Shapes;\n\nnamespace MemoryTest\n{\n    /// <summary>\n    /// Interaction logic for TestWindowUnlocalized.xaml\n    /// </summary>\n    public partial class TestWindowUnlocalized : Window\n    {\n        private static int nextInstanceNumber = 0;\n\n        private int myInstanceNumber;\n\n        public TestWindowUnlocalized()\n        {\n            InitializeComponent();\n\n            myInstanceNumber = nextInstanceNumber;\n            nextInstanceNumber++;\n\n            Debug.WriteLine(string.Format(\"Creating unlocalized instance {0}\", myInstanceNumber));\n        }\n\n        ~TestWindowUnlocalized()\n        {\n            Debug.WriteLine(string.Format(\"Finalizing unlocalized instance {0}\", myInstanceNumber));\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MemoryTest.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30011.22\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WPFLocalizeExtension\", \"..\\src\\WPFLocalizeExtension.csproj\", \"{E8C5B094-2CB4-4C26-87F0-351B03612179}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"MemoryTest\", \"MemoryTest\\MemoryTest.csproj\", \"{3D591943-C256-46EB-88EA-CCA0B3A498E6}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3D591943-C256-46EB-88EA-CCA0B3A498E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3D591943-C256-46EB-88EA-CCA0B3A498E6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3D591943-C256-46EB-88EA-CCA0B3A498E6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3D591943-C256-46EB-88EA-CCA0B3A498E6}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {55C5581D-F925-4BAD-9B4B-88D097AA814E}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "tests/ProviderExample/CSVLocalizationProvider.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"CSVLocalizationProvider.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     http://wpflocalizeextension.codeplex.com/license\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nnamespace ProviderExample\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Collections.ObjectModel;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Management;\n    using System.Reflection;\n    using System.Text;\n    using System.Windows;\n    using WPFLocalizeExtension.Engine;\n    using WPFLocalizeExtension.Providers;\n    using XAMLMarkupExtensions.Base;\n\n    /// <summary>\n    /// A localization provider for comma separated files\n    /// </summary>\n    public class CSVLocalizationProvider : FrameworkElement, ILocalizationProvider\n    {\n        private string fileName = \"\";\n        /// <summary>\n        /// The name of the file without an extension.\n        /// </summary>\n        public string FileName\n        {\n            get { return fileName; }\n            set\n            {\n                if (fileName != value)\n                {\n                    fileName = value;\n\n                    this.AvailableCultures.Clear();\n\n                    var appPath = GetWorkingDirectory();\n                    var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);\n\n                    foreach (var c in cultures)\n                    {\n                        var csv = Path.Combine(appPath, this.FileName + \".\" + c.Name + \".csv\");\n                        if (File.Exists(csv))\n                            this.AvailableCultures.Add(c);\n                    }\n\n                    OnProviderChanged();\n                }\n            }\n        }\n\n        private bool hasHeader = false;\n        /// <summary>\n        /// A flag indicating, if it has a header row.\n        /// </summary>\n        public bool HasHeader\n        {\n            get { return hasHeader; }\n            set\n            {\n                hasHeader = value;\n                OnProviderChanged();\n            }\n        }\n\n        /// <summary>\n        /// Raise a <see cref=\"ILocalizationProvider.ProviderChanged\"/> event.\n        /// </summary>\n        private void OnProviderChanged()\n        {\n            ProviderChanged?.Invoke(this, new ProviderChangedEventArgs(null));\n        }\n\n        /// <summary>\n        /// Calls the <see cref=\"ILocalizationProvider.ProviderError\"/> event.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"message\">The error message.</param>\n        private void OnProviderError(DependencyObject target, string key, string message)\n        {\n            ProviderError?.Invoke(this, new ProviderErrorEventArgs(target, key, message));\n        }\n\n        /// <summary>\n        /// Get the working directory, depending on the design mode or runtime.\n        /// </summary>\n        /// <returns>The working directory.</returns>\n        private string GetWorkingDirectory()\n        {\n            if (AppDomain.CurrentDomain.FriendlyName.Contains(\"XDesProc\"))\n            {\n                foreach (var process in Process.GetProcesses())\n                {\n                    if (!process.ProcessName.Contains(\".vshost\"))\n                        continue;\n\n                    // Get the executable path (all paths are cached now in order to reduce WMI load.\n                    var dir = Path.GetDirectoryName(GetExecutablePath(process.Id));\n\n                    if (string.IsNullOrEmpty(dir))\n                        continue;\n\n                    return dir;\n                }\n\n                return null;\n\n                //var dte = (EnvDTE.DTE)Marshal.GetActiveObject(\"VisualStudio.DTE.10.0\");\n                //var sb = dte.Solution.SolutionBuild;\n                //string msg = \"\";\n\n                //foreach (String item in (Array)sb.StartupProjects)\n                //{\n                //    msg += item;\n                //}\n\n                //EnvDTE.Project startupProj = dte.Solution.Item(msg);\n\n                //return (Path.GetDirectoryName(startupProj.FullName));\n            }\n            else\n                return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);\n        }\n\n        private static Dictionary<int, string> executablePaths = new Dictionary<int, string>();\n\n        /// <summary>\n        /// Get the executable path for both x86 and x64 processes.\n        /// </summary>\n        /// <param name=\"processId\">The process id.</param>\n        /// <returns>The path if found; otherwise, null.</returns>\n        private static string GetExecutablePath(int processId)\n        {\n            if (executablePaths.ContainsKey(processId))\n                return executablePaths[processId];\n\n            const string wmiQueryString = \"SELECT ProcessId, ExecutablePath, CommandLine FROM Win32_Process\";\n            using (var searcher = new ManagementObjectSearcher(wmiQueryString))\n            using (var results = searcher.Get())\n            {\n                var query = from p in Process.GetProcesses()\n                            join mo in results.Cast<ManagementObject>()\n                            on p.Id equals (int)(uint)mo[\"ProcessId\"]\n                            where p.Id == processId\n                            select new\n                            {\n                                Process = p,\n                                Path = (string)mo[\"ExecutablePath\"],\n                                CommandLine = (string)mo[\"CommandLine\"],\n                            };\n                foreach (var item in query)\n                {\n                    executablePaths.Add(processId, item.Path);\n                    return item.Path;\n                }\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// Parses a key ([[Assembly:]Dict:]Key and return the parts of it.\n        /// </summary>\n        /// <param name=\"inKey\">The key to parse.</param>\n        /// <param name=\"outAssembly\">The found or default assembly.</param>\n        /// <param name=\"outDict\">The found or default dictionary.</param>\n        /// <param name=\"outKey\">The found or default key.</param>\n        public static void ParseKey(string inKey, out string outAssembly, out string outDict, out string outKey)\n        {\n            // Reset everything to null.\n            outAssembly = null;\n            outDict = null;\n            outKey = null;\n\n            if (!string.IsNullOrEmpty(inKey))\n            {\n                string[] split = inKey.Trim().Split(\":\".ToCharArray());\n\n                // assembly:dict:key\n                if (split.Length == 3)\n                {\n                    outAssembly = !string.IsNullOrEmpty(split[0]) ? split[0] : null;\n                    outDict = !string.IsNullOrEmpty(split[1]) ? split[1] : null;\n                    outKey = split[2];\n                }\n\n                // dict:key\n                if (split.Length == 2)\n                {\n                    outDict = !string.IsNullOrEmpty(split[0]) ? split[0] : null;\n                    outKey = split[1];\n                }\n\n                // key\n                if (split.Length == 1)\n                {\n                    outKey = split[0];\n                }\n            }\n        }\n\n        public FullyQualifiedResourceKeyBase GetFullyQualifiedResourceKey(string key, DependencyObject target)\n        {\n            ParseKey(key, out string assembly, out string dictionary, out key);\n\n            if (target == null)\n                return new FQAssemblyDictionaryKey(key, assembly, dictionary);\n\n            if (String.IsNullOrEmpty(assembly))\n                assembly = GetAssembly(target);\n\n            if (String.IsNullOrEmpty(dictionary))\n                dictionary = GetDictionary(target);\n\n            return new FQAssemblyDictionaryKey(key, assembly, dictionary);\n        }\n\n        #region Variables\n        /// <summary>\n        /// A dictionary for notification classes for changes of the individual target Parent changes.\n        /// </summary>\n        private readonly ParentNotifiers _parentNotifiers = new ParentNotifiers();\n        #endregion\n\n        /// <summary>\n        /// An action that will be called when a parent of one of the observed target objects changed.\n        /// </summary>\n        /// <param name=\"obj\">The target <see cref=\"DependencyObject\"/>.</param>\n        private void ParentChangedAction(DependencyObject obj)\n        {\n            OnProviderChanged(obj);\n        }\n\n        /// <summary>\n        /// Calls the <see cref=\"ILocalizationProvider.ProviderChanged\"/> event.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        protected virtual void OnProviderChanged(DependencyObject target)\n        {\n            try\n            {\n                var assembly = GetAssembly(target);\n                var dictionary = GetDictionary(target);\n\n                //if (!String.IsNullOrEmpty(assembly) && !String.IsNullOrEmpty(dictionary))\n                //    GetResourceManager(assembly, dictionary);\n            }\n            catch\n            {\n            }\n\n            ProviderChanged?.Invoke(this, new ProviderChangedEventArgs(target));\n        }\n\n        /// <summary>\n        /// Get the assembly from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The assembly name, if available.</returns>\n        protected string GetAssembly(DependencyObject target)\n        {\n            if (target == null)\n                return null;\n\n            return target.GetValueOrRegisterParentNotifier<string>(CSVEmbeddedLocalizationProvider.DefaultAssemblyProperty, ParentChangedAction, _parentNotifiers);\n        }\n\n        /// <summary>\n        /// Get the dictionary from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The dictionary name, if available.</returns>\n        protected string GetDictionary(DependencyObject target)\n        {\n            if (target == null)\n                return null;\n\n            return target.GetValueOrRegisterParentNotifier<string>(CSVEmbeddedLocalizationProvider.DefaultDictionaryProperty, ParentChangedAction, _parentNotifiers);\n        }\n\n        /// <summary>\n        /// Get the localized object.\n        /// </summary>\n        /// <param name=\"key\">The key to the value.</param>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"culture\">The culture to use.</param>\n        /// <returns>The value corresponding to the source/dictionary/key path for the given culture (otherwise NULL).</returns>\n        public object GetLocalizedObject(string key, DependencyObject target, CultureInfo culture)\n        {\n            string ret = null;\n\n            // Try to get the culture specific file.\n            var appPath = GetWorkingDirectory();\n            var csvPath = \"\";\n\n            while (culture != CultureInfo.InvariantCulture)\n            {\n                csvPath = Path.Combine(appPath, this.FileName + (String.IsNullOrEmpty(culture.Name) ? \"\" : \".\" + culture.Name) + \".csv\");\n\n                if (File.Exists(csvPath))\n                    break;\n\n                culture = culture.Parent;\n            }\n\n            if (!File.Exists(csvPath))\n            {\n                // Take the invariant culture.\n                csvPath = Path.Combine(appPath, this.FileName + \".csv\");\n\n                if (!File.Exists(csvPath))\n                {\n                    OnProviderError(target, key, \"A file for the provided culture \" + culture.EnglishName + \" does not exist at \" + csvPath + \".\");\n                    return null;\n                }\n            }\n\n            // Open the file.\n            using (var reader = new StreamReader(csvPath, Encoding.UTF8))\n            {\n                // Skip the header if needed.\n                if (this.HasHeader && !reader.EndOfStream)\n                    reader.ReadLine();\n\n                // Read each line and split it.\n                while (!reader.EndOfStream)\n                {\n                    var line = reader.ReadLine();\n                    var parts = line.Split(\";\".ToCharArray());\n\n                    if (parts.Length < 2)\n                        continue;\n\n                    // Check the key (1st column).\n                    if (parts[0] != key)\n                        continue;\n\n                    // Get the value (2nd column).\n                    ret = parts[1];\n                    break;\n                }\n            }\n\n            // Nothing found -> Raise the error message.\n            if (ret == null)\n                OnProviderError(target, key, \"The key does not exist in \" + csvPath + \".\");\n\n            return ret;\n        }\n\n        /// <summary>\n        /// An observable list of available cultures.\n        /// </summary>\n        private ObservableCollection<CultureInfo> availableCultures = null;\n        public ObservableCollection<CultureInfo> AvailableCultures\n        {\n            get\n            {\n                if (availableCultures == null)\n                    availableCultures = new ObservableCollection<CultureInfo>();\n\n                return availableCultures;\n            }\n        }\n\n        /// <summary>\n        /// Gets fired when the provider changed.\n        /// </summary>\n        public event ProviderChangedEventHandler ProviderChanged;\n\n        /// <summary>\n        /// An event that is fired when an error occurred.\n        /// </summary>\n        public event ProviderErrorEventHandler ProviderError;\n\n        /// <summary>\n        /// An event that is fired when a value changed.\n        /// </summary>\n        public event ValueChangedEventHandler ValueChanged;\n    }\n}\n"
  },
  {
    "path": "tests/ProviderExample/ProviderExample.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n    <!--Workaround for Error\tMSB4216\tCould not run the \"GenerateResource\" -->\n    <GenerateResourceMSBuildArchitecture>CurrentArchitecture</GenerateResourceMSBuildArchitecture>\n\n    <RootNamespace>ProviderExample</RootNamespace>\n\t\t<Version>1.0.0</Version>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<Compile Remove=\"TestProvider.cs\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<None Include=\"TestProvider.cs\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t</ItemGroup>\n\n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Management\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "tests/ProviderExample/TestProvider.cs",
    "content": "﻿#region Copyright information\n// <copyright file=\"CSVLocalizationProvider.cs\">\n//     Licensed under Microsoft Public License (Ms-PL)\n//     http://wpflocalizeextension.codeplex.com/license\n// </copyright>\n// <author>Uwe Mayer</author>\n#endregion\n\nusing System.Collections.Generic;\nusing WPFLocalizeExtension.Engine;\nusing XAMLMarkupExtensions.Base;\n\nnamespace ProviderExample\n{\n    using System;\n    using System.Collections.ObjectModel;\n    using System.Globalization;\n    using System.IO;\n    using System.Reflection;\n    using System.Runtime.InteropServices;\n    using System.Text;\n    using System.Windows;\n    using System.Windows.Media;\n    using WPFLocalizeExtension.Providers;\n\n    /// <summary>\n    /// A localization provider for comma separated files\n    /// </summary>\n    public class CSVLocalizationProvider : FrameworkElement, ILocalizationProvider\n    {\n        private string fileName = \"\";\n        /// <summary>\n        /// The name of the file without an extension.\n        /// </summary>\n        public string FileName\n        {\n            get { return fileName; }\n            set\n            {\n                if (fileName != value)\n                {\n                    fileName = value;\n\n                    this.AvailableCultures.Clear();\n\n                    var appPath = GetWorkingDirectory();\n                    var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);\n\n                    foreach (var c in cultures)\n                    {\n                        var csv = Path.Combine(appPath, this.FileName + \".\" + c.Name + \".csv\");\n                        if (File.Exists(csv))\n                            this.AvailableCultures.Add(c);\n                    }\n\n                    OnProviderChanged();\n                }\n            }\n        }\n\n        private bool hasHeader = false;\n        /// <summary>\n        /// A flag indicating, if it has a header row.\n        /// </summary>\n        public bool HasHeader\n        {\n            get { return hasHeader; }\n            set\n            {\n                hasHeader = value;\n                OnProviderChanged();\n            }\n        }\n\n        /// <summary>\n        /// Raise a <see cref=\"ILocalizationProvider.ProviderChanged\"/> event.\n        /// </summary>\n        private void OnProviderChanged()\n        {\n            if (ProviderChanged != null)\n                ProviderChanged(this, new ProviderChangedEventArgs(null));\n        }\n\n        /// <summary>\n        /// Calls the <see cref=\"ILocalizationProvider.ProviderError\"/> event.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"message\">The error message.</param>\n        private void OnProviderError(DependencyObject target, string key, string message)\n        {\n            if (ProviderError != null)\n                ProviderError(this, new ProviderErrorEventArgs(target, key, message));\n        }\n\n        /// <summary>\n        /// Get the working directory, depending on the design mode or runtime.\n        /// </summary>\n        /// <returns>The working directory.</returns>\n        private string GetWorkingDirectory()\n        {\n            if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(new DependencyObject()))\n            {\n                var dte = (EnvDTE.DTE)Marshal.GetActiveObject(\"VisualStudio.DTE.10.0\");\n                var sb = dte.Solution.SolutionBuild;\n                string msg = \"\";\n\n                foreach (String item in (Array)sb.StartupProjects)\n                {\n                    msg += item;\n                }\n\n                EnvDTE.Project startupProj = dte.Solution.Item(msg);\n\n                return (Path.GetDirectoryName(startupProj.FullName));\n            }\n            else\n                return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);\n        }\n\n        /// <summary>\n        /// Parses a key ([[Assembly:]Dict:]Key and return the parts of it.\n        /// </summary>\n        /// <param name=\"inKey\">The key to parse.</param>\n        /// <param name=\"outAssembly\">The found or default assembly.</param>\n        /// <param name=\"outDict\">The found or default dictionary.</param>\n        /// <param name=\"outKey\">The found or default key.</param>\n        public static void ParseKey(string inKey, out string outAssembly, out string outDict, out string outKey)\n        {\n            // Reset everything to null.\n            outAssembly = null;\n            outDict = null;\n            outKey = null;\n\n            if (!string.IsNullOrEmpty(inKey))\n            {\n                string[] split = inKey.Trim().Split(\":\".ToCharArray());\n\n                // assembly:dict:key\n                if (split.Length == 3)\n                {\n                    outAssembly = !string.IsNullOrEmpty(split[0]) ? split[0] : null;\n                    outDict = !string.IsNullOrEmpty(split[1]) ? split[1] : null;\n                    outKey = split[2];\n                }\n\n                // dict:key\n                if (split.Length == 2)\n                {\n                    outDict = !string.IsNullOrEmpty(split[0]) ? split[0] : null;\n                    outKey = split[1];\n                }\n\n                // key\n                if (split.Length == 1)\n                {\n                    outKey = split[0];\n                }\n            }\n        }\n\n        public FullyQualifiedResourceKeyBase GetFullyQualifiedResourceKey(string key, DependencyObject target)\n        {\n            String assembly, dictionary;\n            ParseKey(key, out assembly, out dictionary, out key);\n\n            if (target == null)\n                return new FQAssemblyDictionaryKey(key, assembly, dictionary);\n\n            if (String.IsNullOrEmpty(assembly))\n                assembly = GetAssembly(target);\n\n            if (String.IsNullOrEmpty(dictionary))\n                dictionary = GetDictionary(target);\n\n            return new FQAssemblyDictionaryKey(key, assembly, dictionary);\n        }\n\n        #region Variables\n        /// <summary>\n        /// A dictionary for notification classes for changes of the individual target Parent changes.\n        /// </summary>\n        private Dictionary<DependencyObject, ParentChangedNotifier> parentNotifiers = new Dictionary<DependencyObject, ParentChangedNotifier>();\n        #endregion\n\n        /// <summary>\n        /// An action that will be called when a parent of one of the observed target objects changed.\n        /// </summary>\n        /// <param name=\"obj\">The target <see cref=\"DependencyObject\"/>.</param>\n        private void ParentChangedAction(DependencyObject obj)\n        {\n            OnProviderChanged(obj);\n        }\n\n        /// <summary>\n        /// Calls the <see cref=\"ILocalizationProvider.ProviderChanged\"/> event.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        protected virtual void OnProviderChanged(DependencyObject target)\n        {\n            try\n            {\n                var assembly = GetAssembly(target);\n                var dictionary = GetDictionary(target);\n\n                //if (!String.IsNullOrEmpty(assembly) && !String.IsNullOrEmpty(dictionary))\n                //    GetResourceManager(assembly, dictionary);\n            }\n            catch\n            {\n            }\n\n            if (ProviderChanged != null)\n                ProviderChanged(this, new ProviderChangedEventArgs(target));\n        }\n\n        /// <summary>\n        /// Get the assembly from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The assembly name, if available.</returns>\n        protected string GetAssembly(DependencyObject target)\n        {\n            if (target == null)\n                return null;\n\n            return target.GetValueOrRegisterParentNotifier<string>(CSVEmbeddedLocalizationProvider.DefaultAssemblyProperty, ParentChangedAction, parentNotifiers);\n        }\n\n        /// <summary>\n        /// Get the dictionary from the context, if possible.\n        /// </summary>\n        /// <param name=\"target\">The target object.</param>\n        /// <returns>The dictionary name, if available.</returns>\n        protected string GetDictionary(DependencyObject target)\n        {\n            if (target == null)\n                return null;\n\n            return target.GetValueOrRegisterParentNotifier<string>(CSVEmbeddedLocalizationProvider.DefaultDictionaryProperty, ParentChangedAction, parentNotifiers);\n        }\n\n        /// <summary>\n        /// Get the localized object.\n        /// </summary>\n        /// <param name=\"key\">The key to the value.</param>\n        /// <param name=\"target\">The target object.</param>\n        /// <param name=\"culture\">The culture to use.</param>\n        /// <returns>The value corresponding to the source/dictionary/key path for the given culture (otherwise NULL).</returns>\n        public object GetLocalizedObject(string key, DependencyObject target, CultureInfo culture)\n        {\n            string ret = null;\n\n            // Try to get the culture specific file.\n            var appPath = GetWorkingDirectory();\n            var csvPath = \"\";\n\n            while (culture != CultureInfo.InvariantCulture)\n            {\n                csvPath = Path.Combine(appPath, this.FileName + (String.IsNullOrEmpty(culture.Name) ? \"\" : \".\" + culture.Name) + \".csv\");\n\n                if (File.Exists(csvPath))\n                    break;\n\n                culture = culture.Parent;\n            }\n\n            if (!File.Exists(csvPath))\n            {\n                // Take the invariant culture.\n                csvPath = Path.Combine(appPath, this.FileName + \".csv\");\n\n                if (!File.Exists(csvPath))\n                {\n                    OnProviderError(target, key, \"A file for the provided culture \" + culture.EnglishName + \" does not exist at \" + csvPath + \".\");\n                    return null;\n                }\n            }\n\n            // Open the file.\n            using (var reader = new StreamReader(csvPath, Encoding.UTF8))\n            {\n                // Skip the header if needed.\n                if (this.HasHeader && !reader.EndOfStream)\n                    reader.ReadLine();\n\n                // Read each line and split it.\n                while (!reader.EndOfStream)\n                {\n                    var line = reader.ReadLine();\n                    var parts = line.Split(\";\".ToCharArray());\n\n                    if (parts.Length < 2)\n                        continue;\n\n                    // Check the key (1st column).\n                    if (parts[0] != key)\n                        continue;\n\n                    // Get the value (2nd column).\n                    ret = parts[1];\n                    break;\n                }\n            }\n\n            // Nothing found -> Raise the error message.\n            if (ret == null)\n                OnProviderError(target, key, \"The key does not exist in \" + csvPath + \".\");\n\n            return ret;\n        }\n\n        /// <summary>\n        /// An observable list of available cultures.\n        /// </summary>\n        private ObservableCollection<CultureInfo> availableCultures = null;\n        public ObservableCollection<CultureInfo> AvailableCultures\n        {\n            get\n            {\n                if (availableCultures == null)\n                    availableCultures = new ObservableCollection<CultureInfo>();\n\n                return availableCultures;\n            }\n        }\n\n        /// <summary>\n        /// Gets fired when the provider changed.\n        /// </summary>\n        public event ProviderChangedEventHandler ProviderChanged;\n\n        /// <summary>\n        /// An event that is fired when an error occurred.\n        /// </summary>\n        public event ProviderErrorEventHandler ProviderError;\n\n        /// <summary>\n        /// An event that is fired when a value changed.\n        /// </summary>\n        public event ValueChangedEventHandler ValueChanged;\n    }\n}\n"
  },
  {
    "path": "tests/ResourceAssembly/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"0b296e0e-0611-438b-8e73-db3e89ed0242\")]\n"
  },
  {
    "path": "tests/ResourceAssembly/ResTexts.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ResourceAssembly {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class ResTexts {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal ResTexts() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"ResourceAssembly.ResTexts\", typeof(ResTexts).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Resource Assembly.\n        /// </summary>\n        internal static string resBack {\n            get {\n                return ResourceManager.GetString(\"resBack\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/ResourceAssembly/ResTexts.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"resBack\" xml:space=\"preserve\">\n    <value>Resource Assembly</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/ResourceAssembly/ResourceAssembly.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\t<PropertyGroup>\n\t\t<TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n    <UseWPF>True</UseWPF>\n    <RootNamespace>ResourceAssembly</RootNamespace>\n\t\t<Version>1.0.0</Version>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<EmbeddedResource Update=\"ResTexts.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"ResTexts.Designer.cs\" />\n\t\t<Compile Update=\"ResTexts.Designer.cs\" AutoGen=\"True\" DependentUpon=\"ResTexts.resx\" DesignTime=\"True\" />\n\t</ItemGroup>\n  \n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "tests/SatelliteAssemblyTest/App.xaml",
    "content": "﻿<Application x:Class=\"WPFLocalizeExtension___Satellite_Assembly_Test.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "tests/SatelliteAssemblyTest/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Windows;\n\nnamespace SatelliteAssemblyTest\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "tests/SatelliteAssemblyTest/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"SatelliteAssemblyTest.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:l=\"http://wpflocalizeextension.codeplex.com\"\n        l:LocalizeDictionary.DesignCulture=\"de\"\n        l:ResxLocalizationProvider.DefaultAssembly=\"SatelliteAssemblyTest\"\n        l:ResxLocalizationProvider.DefaultDictionary=\"TestRes\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"525\">\n    <StackPanel Margin=\"10\">\n            <ComboBox ItemsSource=\"{Binding Source={x:Static l:LocalizeDictionary.Instance}, Path=MergedAvailableCultures}\"\n                      SelectedItem=\"{Binding Source={x:Static l:LocalizeDictionary.Instance}, Path=Culture}\"\n                      DisplayMemberPath=\"NativeName\"\n                      FontSize=\"20\" Margin=\"2\"/>\n        <Viewbox>\n            <TextBlock Text=\"{l:Loc HelloWorld}\" />\n        </Viewbox>\n    </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/SatelliteAssemblyTest/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace SatelliteAssemblyTest\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "tests/SatelliteAssemblyTest/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n//In order to begin building localizable applications, set\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n    //(used if a resource is not found in the page,\n    // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n    //(used if a resource is not found in the page,\n    // app, or any theme specific resource dictionaries)\n)]"
  },
  {
    "path": "tests/SatelliteAssemblyTest/SatelliteAssemblyTest.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\t<PropertyGroup>\n    <TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n    <RootNamespace>SatelliteAssemblyTest</RootNamespace>\n\t\t<OutputType>WinExe</OutputType>\n\t\t<StartupObject />\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<!-- Resources -->\n\t\t<EmbeddedResource Update=\"TestRes.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"TestRes.Designer.cs\" />\n\t\t<Compile Update=\"TestRes.Designer.cs\" AutoGen=\"True\" DependentUpon=\"TestRes.resx\" DesignTime=\"True\" />\n\t</ItemGroup>\n\n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t</ItemGroup>\n</Project>"
  },
  {
    "path": "tests/SatelliteAssemblyTest/TestRes.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace SatelliteAssemblyTest {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class TestRes {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal TestRes() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"SatelliteAssemblyTest.TestRes\", typeof(TestRes).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Hello World!.\n        /// </summary>\n        internal static string HelloWorld {\n            get {\n                return ResourceManager.GetString(\"HelloWorld\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/SatelliteAssemblyTest/TestRes.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"HelloWorld\" xml:space=\"preserve\">\n    <value>Hallo Welt!</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/SatelliteAssemblyTest/TestRes.es.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"HelloWorld\" xml:space=\"preserve\">\n    <value>¡Hola, mundo!</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/SatelliteAssemblyTest/TestRes.fr.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"HelloWorld\" xml:space=\"preserve\">\n    <value>Bonjour tout le monde!</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/SatelliteAssemblyTest/TestRes.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"HelloWorld\" xml:space=\"preserve\">\n    <value>Hello World!</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/SatelliteAssemblyTest/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"XAMLMarkupExtensions\" version=\"1.3.0\" targetFramework=\"net40\" />\n</packages>"
  },
  {
    "path": "tests/SatelliteAssemblyTest.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 2012\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SatelliteAssemblyTest\", \"SatelliteAssemblyTest\\SatelliteAssemblyTest.csproj\", \"{7B916B54-6297-45AC-844A-BB11B1279AAE}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WPFLocalizeExtension\", \"..\\src\\WPFLocalizeExtension.csproj\", \"{E8C5B094-2CB4-4C26-87F0-351B03612179}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{7B916B54-6297-45AC-844A-BB11B1279AAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7B916B54-6297-45AC-844A-BB11B1279AAE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7B916B54-6297-45AC-844A-BB11B1279AAE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7B916B54-6297-45AC-844A-BB11B1279AAE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "tests/Tests.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WPFLocalizeExtension\", \"..\\src\\WPFLocalizeExtension.csproj\", \"{4A1CC23E-BA4A-4AC8-89CF-E29E0547EAEC}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WPFLocalizeExtension.UnitTests\", \"WPFLocalizeExtension.UnitTests\\WPFLocalizeExtension.UnitTests.csproj\", \"{93C35807-8585-43E3-BA53-15A7B811828E}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{4A1CC23E-BA4A-4AC8-89CF-E29E0547EAEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4A1CC23E-BA4A-4AC8-89CF-E29E0547EAEC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4A1CC23E-BA4A-4AC8-89CF-E29E0547EAEC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4A1CC23E-BA4A-4AC8-89CF-E29E0547EAEC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{93C35807-8585-43E3-BA53-15A7B811828E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{93C35807-8585-43E3-BA53-15A7B811828E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{93C35807-8585-43E3-BA53-15A7B811828E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{93C35807-8585-43E3-BA53-15A7B811828E}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "tests/ThreadPerformance/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "tests/ThreadPerformance/App.xaml",
    "content": "﻿<Application x:Class=\"ThreadPerformance.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:ThreadPerformance\"\n             StartupUri=\"MainView.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "tests/ThreadPerformance/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace ThreadPerformance\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "tests/ThreadPerformance/MainView.xaml",
    "content": "﻿<Window x:Class=\"ThreadPerformance.MainView\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:ThreadPerformance\"\n        xmlns:lex=\"http://wpflocalizeextension.codeplex.com\"\n        lex:ResxLocalizationProvider.DefaultAssembly=\"ThreadPerformance\"\n        lex:ResxLocalizationProvider.DefaultDictionary=\"MainView\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"450\" Width=\"800\">\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"*\"/>\n        </Grid.RowDefinitions>\n\n        <Grid>\n            <Grid.ColumnDefinitions>\n                <ColumnDefinition Width=\"*\"/>\n                <ColumnDefinition Width=\"*\"/>\n                <ColumnDefinition Width=\"*\"/>\n                <ColumnDefinition Width=\"*\"/>\n                <ColumnDefinition Width=\"*\"/>\n            </Grid.ColumnDefinitions>\n            <Button x:Name=\"btnOpenWindow\" Content=\"{lex:Loc}\" Click=\"BtnOpenWindow_Click\" />\n            <Button Grid.Column=\"1\" x:Name=\"btnOpenWindow2\" Content=\"{lex:Loc}\" Click=\"BtnOpenWindow2_Click\" />\n            <Button Grid.Column=\"2\" x:Name=\"btnGC\" Content=\"{lex:Loc}\" Click=\"BtnGC_Click\" />\n            <Button Grid.Column=\"3\" x:Name=\"btnDE\" Content=\"{lex:Loc}\" CommandParameter=\"de\" Command=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=SetCultureCommand}\"/>\n            <Button Grid.Column=\"4\" x:Name=\"btnEN\" Content=\"{lex:Loc}\" CommandParameter=\"\" Command=\"{Binding Source={x:Static lex:LocalizeDictionary.Instance}, Path=SetCultureCommand}\"/>\n        </Grid>\n        <Grid Grid.Row=\"1\">\n            <TabControl ItemsSource=\"{Binding Tabs, FallbackValue=1}\" SelectedItem=\"{Binding SelectedTab}\">\n                <TabControl.ItemTemplate>\n                    <DataTemplate>\n                        <Label x:Name=\"tabHeader\" Content=\"{Binding Name, FallbackValue=Header}\" ToolTip=\"{lex:Loc}\" />\n                    </DataTemplate>\n                </TabControl.ItemTemplate>\n                <TabControl.ContentTemplate>\n                    <DataTemplate>\n                        <ScrollViewer HorizontalScrollBarVisibility=\"Visible\" VerticalScrollBarVisibility=\"Auto\">\n                            <ListView ItemsSource=\"{Binding Items, FallbackValue=1}\" HorizontalContentAlignment=\"Left\" VerticalContentAlignment=\"Top\">\n                                <ListView.ItemsPanel>\n                                    <ItemsPanelTemplate>\n                                        <StackPanel IsItemsHost=\"True\" Orientation=\"Horizontal\" />\n                                    </ItemsPanelTemplate>\n                                </ListView.ItemsPanel>\n                                <ListView.ItemTemplate>\n                                    <DataTemplate>\n                                        <Border BorderThickness=\"5,0,0,0\" Margin=\"5,10,15,10\" Width=\"200\">\n                                            <Border.BorderBrush>\n                                                <SolidColorBrush Color=\"{DynamicResource {x:Static SystemColors.HighlightColorKey}}\"/>\n                                            </Border.BorderBrush>\n                                            <Border.Background>\n                                                <SolidColorBrush Color=\"{DynamicResource {x:Static SystemColors.MenuBarColorKey}}\"/>\n                                            </Border.Background>\n                                            <DockPanel LastChildFill=\"True\">\n                                                <Label x:Name=\"itemHeader\" Content=\"{Binding Name, FallbackValue=ItemHeader}\" ToolTip=\"{lex:Loc}\" DockPanel.Dock=\"Top\" />\n                                                <ListView DockPanel.Dock=\"Bottom\" ItemsSource=\"{Binding Entries, FallbackValue=1}\" Background=\"{x:Null}\" BorderThickness=\"0\" >\n                                                    <ListView.ItemsPanel>\n                                                        <ItemsPanelTemplate>\n                                                            <StackPanel IsItemsHost=\"True\" Orientation=\"Vertical\"/>\n                                                        </ItemsPanelTemplate>\n                                                    </ListView.ItemsPanel>\n                                                    <ListView.ItemTemplate>\n                                                        <DataTemplate>\n                                                            <Grid Width=\"180\">\n                                                                <Grid.ColumnDefinitions>\n                                                                    <ColumnDefinition Width=\"Auto\" />\n                                                                    <ColumnDefinition Width=\"*\" />\n                                                                </Grid.ColumnDefinitions>\n                                                                <Rectangle x:Name=\"icon\" Width=\"20\" Height=\"20\" Fill=\"DarkCyan\" ToolTip=\"{lex:Loc}\"/>\n                                                                <Label Content=\"{Binding Name, FallbackValue=Name}\" Grid.Column=\"1\" />\n                                                            </Grid>\n                                                        </DataTemplate>\n                                                    </ListView.ItemTemplate>\n                                                </ListView>\n                                            </DockPanel>\n                                        </Border>\n                                    </DataTemplate>\n                                </ListView.ItemTemplate>\n                            </ListView>\n                        </ScrollViewer>\n                    </DataTemplate>\n                </TabControl.ContentTemplate>\n            </TabControl>\n        </Grid>\n    </Grid>\n</Window>\n"
  },
  {
    "path": "tests/ThreadPerformance/MainView.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing System.Windows.Threading;\n\nnamespace ThreadPerformance\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainView : Window\n    {\n        public MainView()\n        {\n            InitializeComponent();\n            this.DataContext = new MainViewModel();\n        }\n\n        private void BtnOpenWindow_Click(object sender, RoutedEventArgs e)\n        {\n            var thread = new Thread(threadStart);\n            thread.SetApartmentState(ApartmentState.STA);\n            thread.Start();\n        }\n\n        private void threadStart()\n        {\n            var window = new MainView();\n            window.Closed += Window_Closed;\n            window.Show();\n            System.Windows.Threading.Dispatcher.Run();\n        }\n\n        private void Window_Closed(object sender, EventArgs e)\n        {\n            (sender as DispatcherObject).Dispatcher.InvokeShutdown();\n        }\n\n        private void BtnOpenWindow2_Click(object sender, RoutedEventArgs e)\n        {\n            var window = new MainView();\n            window.Show();\n        }\n\n        private void BtnGC_Click(object sender, RoutedEventArgs e)\n        {\n            System.GC.Collect();\n        }\n    }\n\n    public class ViewModelBase : INotifyPropertyChanged\n    {\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        protected void RaisePropertyChanged(string propertyName)\n        {\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n        }\n    }\n\n    public class MainViewModel : ViewModelBase\n    {\n        public MainViewModel()\n        {\n            Tabs = new ObservableCollection<TabModel>();\n            for(int i = 0; i < 2; i++)\n            {\n                Tabs.Add(new TabModel() { Name = Guid.NewGuid().ToString() });\n            }\n\n            SelectedTab = Tabs.FirstOrDefault();\n        }\n\n        private ObservableCollection<TabModel> _Tabs;\n\n        public ObservableCollection<TabModel> Tabs\n        {\n            get { return _Tabs; }\n            set { _Tabs = value; RaisePropertyChanged(nameof(Tabs)); }\n        }\n\n        private TabModel _SelectedTab;\n\n        public TabModel SelectedTab\n        {\n            get { return _SelectedTab; }\n            set { _SelectedTab = value; RaisePropertyChanged(nameof(SelectedTab)); }\n        }\n\n\n        public class TabModel : ViewModelBase\n        {\n            private string _Name;\n\n            public string Name\n            {\n                get { return _Name; }\n                set { _Name = value; RaisePropertyChanged(nameof(Name)); }\n            }\n\n            private ObservableCollection<ItemModel> _Items;\n\n            public ObservableCollection<ItemModel> Items\n            {\n                get { return _Items; }\n                set { _Items = value; RaisePropertyChanged(nameof(Items)); }\n            }\n\n\n            public TabModel()\n            {\n                Items = new ObservableCollection<ItemModel>();\n                for(int i = 0; i < 15; i++)\n                {\n                    Items.Add(new ItemModel() { Name = Guid.NewGuid().ToString() });\n                }\n            }\n\n\n            public class ItemModel : ViewModelBase\n            {\n                private string _Name;\n\n                public string Name\n                {\n                    get { return _Name; }\n                    set { _Name = value; RaisePropertyChanged(nameof(Name)); }\n                }\n\n                private ObservableCollection<EntrieModel> _Entries;\n\n                public ObservableCollection<EntrieModel> Entries\n                {\n                    get { return _Entries; }\n                    set { _Entries = value; RaisePropertyChanged(nameof(Entries)); }\n                }\n\n                public ItemModel()\n                {\n                    Entries = new ObservableCollection<EntrieModel>();\n                    for(int i = 0; i < 15; i++)\n                    {\n                        Entries.Add(new EntrieModel() { Name = Guid.NewGuid().ToString() });\n                    }\n                }\n\n                public class EntrieModel : ViewModelBase\n                {\n                    private string _Name;\n\n                    public string Name\n                    {\n                        get { return _Name; }\n                        set { _Name = value; RaisePropertyChanged(nameof(Name)); }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/ThreadPerformance/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n//In order to begin building localizable applications, set\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n                                     //(used if a resource is not found in the page,\n                                     // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n                                              //(used if a resource is not found in the page,\n                                              // app, or any theme specific resource dictionaries)\n)]\n"
  },
  {
    "path": "tests/ThreadPerformance/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ThreadPerformance.Properties\n{\n\n\n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources\n    {\n\n        private static global::System.Resources.ResourceManager resourceMan;\n\n        private static global::System.Globalization.CultureInfo resourceCulture;\n\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources()\n        {\n        }\n\n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager\n        {\n            get\n            {\n                if ((resourceMan == null))\n                {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"ThreadPerformance.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n\n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture\n        {\n            get\n            {\n                return resourceCulture;\n            }\n            set\n            {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/ThreadPerformance/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "tests/ThreadPerformance/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ThreadPerformance.Properties\n{\n\n\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"11.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\n    {\n\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n\n        public static Settings Default\n        {\n            get\n            {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/ThreadPerformance/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "tests/ThreadPerformance/Resources/MainView.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ThreadPerformance.Resources {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"15.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class MainView {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal MainView() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"ThreadPerformance.Resources.MainView\", typeof(MainView).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to German.\n        /// </summary>\n        internal static string btnDE_Content {\n            get {\n                return ResourceManager.GetString(\"btnDE_Content\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to English.\n        /// </summary>\n        internal static string btnEN_Content {\n            get {\n                return ResourceManager.GetString(\"btnEN_Content\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Garbage.\n        /// </summary>\n        internal static string BtnGC_Content {\n            get {\n                return ResourceManager.GetString(\"BtnGC_Content\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Open thread window.\n        /// </summary>\n        internal static string btnOpenWindow_Content {\n            get {\n                return ResourceManager.GetString(\"btnOpenWindow_Content\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Open window.\n        /// </summary>\n        internal static string btnOpenWindow2_Content {\n            get {\n                return ResourceManager.GetString(\"btnOpenWindow2_Content\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Icon description.\n        /// </summary>\n        internal static string icon_ToolTip {\n            get {\n                return ResourceManager.GetString(\"icon_ToolTip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Tooltip one.\n        /// </summary>\n        internal static string item1_ToolTip {\n            get {\n                return ResourceManager.GetString(\"item1_ToolTip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Tooltip two.\n        /// </summary>\n        internal static string item2_ToolTip {\n            get {\n                return ResourceManager.GetString(\"item2_ToolTip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Item description.\n        /// </summary>\n        internal static string itemHeader_ToolTip {\n            get {\n                return ResourceManager.GetString(\"itemHeader_ToolTip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Tab description.\n        /// </summary>\n        internal static string tabHeader_ToolTip {\n            get {\n                return ResourceManager.GetString(\"tabHeader_ToolTip\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/ThreadPerformance/Resources/MainView.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"btnDE_Content\" xml:space=\"preserve\">\n    <value>Deutsch</value>\n  </data>\n  <data name=\"btnEN_Content\" xml:space=\"preserve\">\n    <value>Englisch</value>\n  </data>\n  <data name=\"BtnGC_Content\" xml:space=\"preserve\">\n    <value>Garbage</value>\n  </data>\n  <data name=\"btnOpenWindow2_Content\" xml:space=\"preserve\">\n    <value>Fenster öffnen</value>\n  </data>\n  <data name=\"btnOpenWindow_Content\" xml:space=\"preserve\">\n    <value>Thread Fenster öffnen</value>\n  </data>\n  <data name=\"icon_ToolTip\" xml:space=\"preserve\">\n    <value>Icon Beschreibung</value>\n  </data>\n  <data name=\"item1_ToolTip\" xml:space=\"preserve\">\n    <value>Tooltip eins</value>\n  </data>\n  <data name=\"item2_ToolTip\" xml:space=\"preserve\">\n    <value>Tooltip zwei</value>\n  </data>\n  <data name=\"itemHeader_ToolTip\" xml:space=\"preserve\">\n    <value>Item Beschreibung</value>\n  </data>\n  <data name=\"tabHeader_ToolTip\" xml:space=\"preserve\">\n    <value>Tab Beschreibung</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/ThreadPerformance/Resources/MainView.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"btnDE_Content\" xml:space=\"preserve\">\n    <value>German</value>\n  </data>\n  <data name=\"btnEN_Content\" xml:space=\"preserve\">\n    <value>English</value>\n  </data>\n  <data name=\"BtnGC_Content\" xml:space=\"preserve\">\n    <value>Garbage</value>\n  </data>\n  <data name=\"btnOpenWindow2_Content\" xml:space=\"preserve\">\n    <value>Open window</value>\n  </data>\n  <data name=\"btnOpenWindow_Content\" xml:space=\"preserve\">\n    <value>Open thread window</value>\n  </data>\n  <data name=\"icon_ToolTip\" xml:space=\"preserve\">\n    <value>Icon description</value>\n  </data>\n  <data name=\"item1_ToolTip\" xml:space=\"preserve\">\n    <value>Tooltip one</value>\n  </data>\n  <data name=\"item2_ToolTip\" xml:space=\"preserve\">\n    <value>Tooltip two</value>\n  </data>\n  <data name=\"itemHeader_ToolTip\" xml:space=\"preserve\">\n    <value>Item description</value>\n  </data>\n  <data name=\"tabHeader_ToolTip\" xml:space=\"preserve\">\n    <value>Tab description</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/ThreadPerformance/ThreadPerformance.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net452;netcoreapp3.1</TargetFrameworks>\n    <UseWPF>True</UseWPF>\n    <AutoGenerateBindingRedirects Condition=\"!$(TargetFramework.StartsWith('netcore'))\">true</AutoGenerateBindingRedirects>\n    <!--Workaround for Error\tMSB4216\tCould not run the \"GenerateResource\" -->\n    <GenerateResourceMSBuildArchitecture>CurrentArchitecture</GenerateResourceMSBuildArchitecture>\n    <RootNamespace>ThreadPerformance</RootNamespace>\n\t\t<OutputType>WinExe</OutputType>\n\t\t<StartupObject />\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<!-- Resources -->\n\t\t<None Update=\"Example.csv\">\n\t\t  <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n\t\t</None>\n\t\t<None Update=\"Example.de.csv\">\n\t\t  <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n\t\t</None>\n\t</ItemGroup>\n  \n  <!--References for .Net Framwork 4 and 35-->\n  <ItemGroup Condition=\"!$(TargetFramework.StartsWith('netcore'))\">\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n\n  <!--References for .Net Core 3.1-->\n  <ItemGroup Condition=\"$(TargetFramework.StartsWith('netcore'))\">\n    <PackageReference Include=\"Microsoft.Windows.Compatibility\" Version=\"3.1.0\" />\n  </ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n\t</ItemGroup>\n</Project>"
  },
  {
    "path": "tests/ThreadPerformance/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"XAMLMarkupExtensions\" version=\"1.6.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "tests/ThreadPerformance.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.168\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ThreadPerformance\", \"ThreadPerformance\\ThreadPerformance.csproj\", \"{3DBDB832-3249-4859-8042-59CC10FD7F65}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WPFLocalizeExtension\", \"..\\src\\WPFLocalizeExtension.csproj\", \"{723FB912-2712-4147-B19F-7E496E46D395}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{3DBDB832-3249-4859-8042-59CC10FD7F65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3DBDB832-3249-4859-8042-59CC10FD7F65}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3DBDB832-3249-4859-8042-59CC10FD7F65}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3DBDB832-3249-4859-8042-59CC10FD7F65}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{723FB912-2712-4147-B19F-7E496E46D395}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{723FB912-2712-4147-B19F-7E496E46D395}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{723FB912-2712-4147-B19F-7E496E46D395}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{723FB912-2712-4147-B19F-7E496E46D395}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {0EBD4732-E879-47B1-A314-3E2241479F79}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "tests/VbWpfApplication/Application.xaml",
    "content": "﻿<Application x:Class=\"Application\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n        \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "tests/VbWpfApplication/Application.xaml.vb",
    "content": "﻿Class Application\n\n    ' Application-level events, such as Startup, Exit, and DispatcherUnhandledException\n    ' can be handled in this file.\n\nEnd Class\n"
  },
  {
    "path": "tests/VbWpfApplication/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"MainWindow\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:Engine=\"clr-namespace:WPFLocalizeExtension.Engine;assembly=WPFLocalizeExtension\" \n    Engine:LocalizeDictionary.DesignCulture=\"en-GB\"\n    xmlns:lex=\"clr-namespace:WPFLocalizeExtension.Extensions;assembly=WPFLocalizeExtension\"\n    Title=\"MainWindow\" Height=\"350\" Width=\"525\">\n    <Grid>\n        <Button Content=\"{lex:Loc VbWpfApplication:Strings:Button_Next}\" Height=\"124\" HorizontalAlignment=\"Left\" Margin=\"141,79,0,0\" Name=\"Button1\" VerticalAlignment=\"Top\" Width=\"231\" />\n    </Grid>\n</Window>\n"
  },
  {
    "path": "tests/VbWpfApplication/MainWindow.xaml.vb",
    "content": "﻿Class MainWindow \n    Private switch As Boolean\n\n    Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click\n        If switch Then\n            WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture = System.Globalization.CultureInfo.CreateSpecificCulture(\"en-gb\")\n        Else\n            WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture = System.Globalization.CultureInfo.CreateSpecificCulture(\"sv-se\")\n        End If\n\n        switch = Not switch\n    End Sub\nEnd Class\n"
  },
  {
    "path": "tests/VbWpfApplication/My Project/AssemblyInfo.vb",
    "content": "﻿Imports System\nImports System.Reflection\nImports System.Runtime.InteropServices\nImports System.Globalization\nImports System.Resources\nImports System.Windows\n\n' General Information about an assembly is controlled through the following \n' set of attributes. Change these attribute values to modify the information\n' associated with an assembly.\n\n' Review the values of the assembly attributes\n\n<Assembly: AssemblyTitle(\"WpfApplication1\")> \n<Assembly: AssemblyDescription(\"\")> \n<Assembly: AssemblyCompany(\"Microsoft\")> \n<Assembly: AssemblyProduct(\"WpfApplication1\")> \n<Assembly: AssemblyCopyright(\"Copyright @ Microsoft 2012\")> \n<Assembly: AssemblyTrademark(\"\")> \n<Assembly: ComVisible(false)>\n\n'In order to begin building localizable applications, set \n'<UICulture>CultureYouAreCodingWith</UICulture> in your .vbproj file\n'inside a <PropertyGroup>.  For example, if you are using US english \n'in your source files, set the <UICulture> to \"en-US\".  Then uncomment the\n'NeutralResourceLanguage attribute below.  Update the \"en-US\" in the line\n'below to match the UICulture setting in the project file.\n\n'<Assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)> \n\n\n'The ThemeInfo attribute describes where any theme specific and generic resource dictionaries can be found.\n'1st parameter: where theme specific resource dictionaries are located\n'(used if a resource is not found in the page, \n' or application resource dictionaries)\n\n'2nd parameter: where the generic resource dictionary is located\n'(used if a resource is not found in the page, \n'app, and any theme specific resource dictionaries)\n<Assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)>\n\n\n\n'The following GUID is for the ID of the typelib if this project is exposed to COM\n<Assembly: Guid(\"2065e028-9b96-44b3-9216-97b6cb1a2638\")> \n\n' Version information for an assembly consists of the following four values:\n'\n'      Major Version\n'      Minor Version \n'      Build Number\n'      Revision\n'\n' You can specify all the values or you can default the Build and Revision Numbers \n' by using the '*' as shown below:\n' <Assembly: AssemblyVersion(\"1.0.*\")> \n\n<Assembly: AssemblyVersion(\"1.0.0.0\")> \n<Assembly: AssemblyFileVersion(\"1.0.0.0\")> \n"
  },
  {
    "path": "tests/VbWpfApplication/My Project/MyExtensions/MyWpfExtension.vb",
    "content": "﻿#If _MyType <> \"Empty\" Then\n\nNamespace My\n    ''' <summary>\n    ''' Module used to define the properties that are available in the My Namespace for WPF\n    ''' </summary>\n    ''' <remarks></remarks>\n    <Global.Microsoft.VisualBasic.HideModuleName()> _\n    Module MyWpfExtension\n        Private s_Computer As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Devices.Computer)\n        Private s_User As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.ApplicationServices.User)\n        Private s_Windows As New ThreadSafeObjectProvider(Of MyWindows)\n        Private s_Log As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Logging.Log)\n        ''' <summary>\n        ''' Returns the application object for the running application\n        ''' </summary>\n        <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")>  _\n        Friend ReadOnly Property Application() As Application\n            Get\n                Return CType(Global.System.Windows.Application.Current, Application)\n            End Get\n        End Property\n        ''' <summary>\n        ''' Returns information about the host computer.\n        ''' </summary>\n        <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")>  _\n        Friend ReadOnly Property Computer() As Global.Microsoft.VisualBasic.Devices.Computer\n            Get\n                Return s_Computer.GetInstance()\n            End Get\n        End Property\n        ''' <summary>\n        ''' Returns information for the current user.  If you wish to run the application with the current \n        ''' Windows user credentials, call My.User.InitializeWithWindowsUser().\n        ''' </summary>\n        <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")>  _\n        Friend ReadOnly Property User() As Global.Microsoft.VisualBasic.ApplicationServices.User\n            Get\n                Return s_User.GetInstance()\n            End Get\n        End Property\n        ''' <summary>\n        ''' Returns the application log. The listeners can be configured by the application's configuration file.\n        ''' </summary>\n        <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")>  _\n        Friend ReadOnly Property Log() As Global.Microsoft.VisualBasic.Logging.Log\n            Get\n                Return s_Log.GetInstance()\n            End Get\n        End Property\n\n        ''' <summary>\n        ''' Returns the collection of Windows defined in the project.\n        ''' </summary>\n        <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")>  _\n        Friend ReadOnly Property Windows() As MyWindows\n            <Global.System.Diagnostics.DebuggerHidden()> _\n            Get\n                Return s_Windows.GetInstance()\n            End Get\n        End Property\n        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Never)> _\n        <Global.Microsoft.VisualBasic.MyGroupCollection(\"System.Windows.Window\", \"Create__Instance__\", \"Dispose__Instance__\", \"My.MyWpfExtenstionModule.Windows\")> _\n        Friend NotInheritable Class MyWindows\n            <Global.System.Diagnostics.DebuggerHidden()> _\n            Private Shared Function Create__Instance__(Of T As {New, Global.System.Windows.Window})(ByVal Instance As T) As T\n                If Instance Is Nothing Then\n                    If s_WindowBeingCreated IsNot Nothing Then\n                        If s_WindowBeingCreated.ContainsKey(GetType(T)) = True Then\n                            Throw New Global.System.InvalidOperationException(\"The window cannot be accessed via My.Windows from the Window constructor.\")\n                        End If\n                    Else\n                        s_WindowBeingCreated = New Global.System.Collections.Hashtable()\n                    End If\n                    s_WindowBeingCreated.Add(GetType(T), Nothing)\n                    Return New T()\n                    s_WindowBeingCreated.Remove(GetType(T))\n                Else\n                    Return Instance\n                End If\n            End Function\n            <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1822:MarkMembersAsStatic\")>  _\n            <Global.System.Diagnostics.DebuggerHidden()> _\n            Private Sub Dispose__Instance__(Of T As Global.System.Windows.Window)(ByRef instance As T)\n                instance = Nothing\n            End Sub\n            <Global.System.Diagnostics.DebuggerHidden()> _\n            <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Never)> _\n            Public Sub New()\n                MyBase.New()\n            End Sub\n            <Global.System.ThreadStatic()> Private Shared s_WindowBeingCreated As Global.System.Collections.Hashtable\n            <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Never)> Public Overrides Function Equals(ByVal o As Object) As Boolean\n                Return MyBase.Equals(o)\n            End Function\n            <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Never)> Public Overrides Function GetHashCode() As Integer\n                Return MyBase.GetHashCode\n            End Function\n            <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1822:MarkMembersAsStatic\")>  _\n            <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Never)> _\n            Friend Overloads Function [GetType]() As Global.System.Type\n                Return GetType(MyWindows)\n            End Function\n            <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Never)> Public Overrides Function ToString() As String\n                Return MyBase.ToString\n            End Function\n        End Class\n    End Module\nEnd Namespace\nPartial Class Application\n    Inherits Global.System.Windows.Application\n    <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")> _\n    <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1822:MarkMembersAsStatic\")> _\n    Friend ReadOnly Property Info() As Global.Microsoft.VisualBasic.ApplicationServices.AssemblyInfo\n        <Global.System.Diagnostics.DebuggerHidden()> _\n        Get\n            Return New Global.Microsoft.VisualBasic.ApplicationServices.AssemblyInfo(Global.System.Reflection.Assembly.GetExecutingAssembly())\n        End Get\n    End Property\nEnd Class\n#End If"
  },
  {
    "path": "tests/VbWpfApplication/My Project/Resources.Designer.vb",
    "content": "﻿'------------------------------------------------------------------------------\n' <auto-generated>\n'     This code was generated by a tool.\n'     Runtime Version:4.0.30319.488\n'\n'     Changes to this file may cause incorrect behavior and will be lost if\n'     the code is regenerated.\n' </auto-generated>\n'------------------------------------------------------------------------------\n\nOption Strict On\nOption Explicit On\n\nImports System\n\nNamespace My.Resources\n    \n    'This class was auto-generated by the StronglyTypedResourceBuilder\n    'class via a tool like ResGen or Visual Studio.\n    'To add or remove a member, edit your .ResX file then rerun ResGen\n    'with the /str option, or rebuild your VS project.\n    '''<summary>\n    '''  A strongly-typed resource class, for looking up localized strings, etc.\n    '''</summary>\n    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\"),  _\n     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _\n     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _\n     Global.Microsoft.VisualBasic.HideModuleNameAttribute()>  _\n    Friend Module Resources\n        \n        Private resourceMan As Global.System.Resources.ResourceManager\n        \n        Private resourceCulture As Global.System.Globalization.CultureInfo\n        \n        '''<summary>\n        '''  Returns the cached ResourceManager instance used by this class.\n        '''</summary>\n        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _\n        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager\n            Get\n                If Object.ReferenceEquals(resourceMan, Nothing) Then\n                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager(\"VbWpfApplication.Resources\", GetType(Resources).Assembly)\n                    resourceMan = temp\n                End If\n                Return resourceMan\n            End Get\n        End Property\n        \n        '''<summary>\n        '''  Overrides the current thread's CurrentUICulture property for all\n        '''  resource lookups using this strongly typed resource class.\n        '''</summary>\n        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _\n        Friend Property Culture() As Global.System.Globalization.CultureInfo\n            Get\n                Return resourceCulture\n            End Get\n            Set\n                resourceCulture = value\n            End Set\n        End Property\n    End Module\nEnd Namespace\n"
  },
  {
    "path": "tests/VbWpfApplication/My Project/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "tests/VbWpfApplication/My Project/Settings.Designer.vb",
    "content": "﻿'------------------------------------------------------------------------------\n' <auto-generated>\n'     This code was generated by a tool.\n'     Runtime Version:4.0.30319.488\n'\n'     Changes to this file may cause incorrect behavior and will be lost if\n'     the code is regenerated.\n' </auto-generated>\n'------------------------------------------------------------------------------\n\nOption Strict On\nOption Explicit On\n\n\n\n<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _\n Global.System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"10.0.0.0\"),  _\n Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _\nPartial Friend NotInheritable Class MySettings\n    Inherits Global.System.Configuration.ApplicationSettingsBase\n    \n    Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)\n    \n#Region \"My.Settings Auto-Save Functionality\"\n#If _MyType = \"WindowsForms\" Then\n    Private Shared addedHandler As Boolean\n\n    Private Shared addedHandlerLockObject As New Object\n\n    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _\n    Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)\n        If My.Application.SaveMySettingsOnExit Then\n            My.Settings.Save()\n        End If\n    End Sub\n#End If\n#End Region\n    \n    Public Shared ReadOnly Property [Default]() As MySettings\n        Get\n            \n#If _MyType = \"WindowsForms\" Then\n               If Not addedHandler Then\n                    SyncLock addedHandlerLockObject\n                        If Not addedHandler Then\n                            AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings\n                            addedHandler = True\n                        End If\n                    End SyncLock\n                End If\n#End If\n            Return defaultInstance\n        End Get\n    End Property\nEnd Class\n\nNamespace My\n    \n    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(),  _\n     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _\n     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()>  _\n    Friend Module MySettingsProperty\n        \n        <Global.System.ComponentModel.Design.HelpKeywordAttribute(\"My.Settings\")>  _\n        Friend ReadOnly Property Settings() As Global.VbWpfApplication.MySettings\n            Get\n                Return Global.VbWpfApplication.MySettings.Default\n            End Get\n        End Property\n    End Module\nEnd Namespace\n"
  },
  {
    "path": "tests/VbWpfApplication/My Project/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\" UseMySettingsClassName=\"true\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "tests/VbWpfApplication/Strings.Designer.vb",
    "content": "﻿'------------------------------------------------------------------------------\n' <auto-generated>\n'     This code was generated by a tool.\n'     Runtime Version:4.0.30319.488\n'\n'     Changes to this file may cause incorrect behavior and will be lost if\n'     the code is regenerated.\n' </auto-generated>\n'------------------------------------------------------------------------------\n\nOption Strict On\nOption Explicit On\n\nImports System\n\nNamespace My.Resources\n    \n    'This class was auto-generated by the StronglyTypedResourceBuilder\n    'class via a tool like ResGen or Visual Studio.\n    'To add or remove a member, edit your .ResX file then rerun ResGen\n    'with the /str option, or rebuild your VS project.\n    '''<summary>\n    '''  A strongly-typed resource class, for looking up localized strings, etc.\n    '''</summary>\n    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\"),  _\n     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _\n     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()>  _\n    Public Class Strings\n        \n        Private Shared resourceMan As Global.System.Resources.ResourceManager\n        \n        Private Shared resourceCulture As Global.System.Globalization.CultureInfo\n        \n        <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")>  _\n        Friend Sub New()\n            MyBase.New\n        End Sub\n        \n        '''<summary>\n        '''  Returns the cached ResourceManager instance used by this class.\n        '''</summary>\n        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _\n        Public Shared ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager\n            Get\n                If Object.ReferenceEquals(resourceMan, Nothing) Then\n                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager(\"VbWpfApplication.Strings\", GetType(Strings).Assembly)\n                    resourceMan = temp\n                End If\n                Return resourceMan\n            End Get\n        End Property\n        \n        '''<summary>\n        '''  Overrides the current thread's CurrentUICulture property for all\n        '''  resource lookups using this strongly typed resource class.\n        '''</summary>\n        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _\n        Public Shared Property Culture() As Global.System.Globalization.CultureInfo\n            Get\n                Return resourceCulture\n            End Get\n            Set\n                resourceCulture = value\n            End Set\n        End Property\n        \n        '''<summary>\n        '''  Looks up a localized string similar to @Button_Next.\n        '''</summary>\n        Public Shared ReadOnly Property Button_Next() As String\n            Get\n                Return ResourceManager.GetString(\"Button_Next\", resourceCulture)\n            End Get\n        End Property\n    End Class\nEnd Namespace\n"
  },
  {
    "path": "tests/VbWpfApplication/Strings.en-GB.Designer.vb",
    "content": ""
  },
  {
    "path": "tests/VbWpfApplication/Strings.en-GB.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Button_Next\" xml:space=\"preserve\">\n    <value>Next</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/VbWpfApplication/Strings.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Button_Next\" xml:space=\"preserve\">\n    <value>@Button_Next</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/VbWpfApplication/Strings.sv-SE.Designer.vb",
    "content": ""
  },
  {
    "path": "tests/VbWpfApplication/Strings.sv-SE.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Button_Next\" xml:space=\"preserve\">\n    <value>Nästa</value>\n  </data>\n</root>"
  },
  {
    "path": "tests/VbWpfApplication/VbWpfApplication.vbproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProjectGuid>{1F6BCD30-6F08-448F-B3FF-D47C27B32025}</ProjectGuid>\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{F184B08F-C81C-45F6-A57F-5ABD9991F28F}</ProjectTypeGuids>\n    <OutputType>WinExe</OutputType>\n    <RootNamespace>VbWpfApplication</RootNamespace>\n    <AssemblyName>VbWpfApplication</AssemblyName>\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\n    <TargetFrameworkProfile>Client</TargetFrameworkProfile>\n    <MyType>Custom</MyType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\n    <PlatformTarget>x86</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <DefineDebug>true</DefineDebug>\n    <DefineTrace>true</DefineTrace>\n    <IncrementalBuild>true</IncrementalBuild>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DocumentationFile>VbWpfApplication.xml</DocumentationFile>\n    <NoWarn>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314</NoWarn>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\n    <PlatformTarget>x86</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <DebugSymbols>false</DebugSymbols>\n    <DefineDebug>false</DefineDebug>\n    <DefineTrace>true</DefineTrace>\n    <IncrementalBuild>false</IncrementalBuild>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DocumentationFile>VbWpfApplication.xml</DocumentationFile>\n    <NoWarn>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314</NoWarn>\n  </PropertyGroup>\n  <PropertyGroup>\n    <OptionExplicit>On</OptionExplicit>\n  </PropertyGroup>\n  <PropertyGroup>\n    <OptionCompare>Binary</OptionCompare>\n  </PropertyGroup>\n  <PropertyGroup>\n    <OptionStrict>Off</OptionStrict>\n  </PropertyGroup>\n  <PropertyGroup>\n    <OptionInfer>On</OptionInfer>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Xaml\">\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"XAMLMarkupExtensions, Version=1.8.0.0, Culture=neutral, PublicKeyToken=c726e0262981a1eb, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\XAMLMarkupExtensions.1.8.0\\lib\\net40\\XAMLMarkupExtensions.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"Application.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Compile Include=\"Strings.Designer.vb\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Strings.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Strings.en-GB.Designer.vb\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Strings.en-GB.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Strings.sv-SE.Designer.vb\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Strings.sv-SE.resx</DependentUpon>\n    </Compile>\n    <Page Include=\"MainWindow.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"Application.xaml.vb\">\n      <DependentUpon>Application.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"MainWindow.xaml.vb\">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Import Include=\"System.Linq\" />\n    <Import Include=\"System.Xml.Linq\" />\n    <Import Include=\"Microsoft.VisualBasic\" />\n    <Import Include=\"System\" />\n    <Import Include=\"System.Collections\" />\n    <Import Include=\"System.Collections.Generic\" />\n    <Import Include=\"System.Diagnostics\" />\n    <Import Include=\"System.Windows\" />\n    <Import Include=\"System.Windows.Controls\" />\n    <Import Include=\"System.Windows.Data\" />\n    <Import Include=\"System.Windows.Documents\" />\n    <Import Include=\"System.Windows.Input\" />\n    <Import Include=\"System.Windows.Shapes\" />\n    <Import Include=\"System.Windows.Media\" />\n    <Import Include=\"System.Windows.Media.Imaging\" />\n    <Import Include=\"System.Windows.Navigation\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"My Project\\AssemblyInfo.vb\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"My Project\\MyExtensions\\MyWpfExtension.vb\">\n      <VBMyExtensionTemplateID>Microsoft.VisualBasic.WPF.MyExtension</VBMyExtensionTemplateID>\n      <VBMyExtensionTemplateVersion>1.0.0.0</VBMyExtensionTemplateVersion>\n    </Compile>\n    <Compile Include=\"My Project\\Resources.Designer.vb\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"My Project\\Settings.Designer.vb\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <EmbeddedResource Include=\"My Project\\Resources.resx\">\n      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.vb</LastGenOutput>\n      <CustomToolNamespace>My.Resources</CustomToolNamespace>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Strings.en-GB.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>Strings.en-GB.Designer.vb</LastGenOutput>\n      <CustomToolNamespace>My.Resources</CustomToolNamespace>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Strings.resx\">\n      <CustomToolNamespace>My.Resources</CustomToolNamespace>\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>Strings.Designer.vb</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Strings.sv-SE.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>Strings.sv-SE.Designer.vb</LastGenOutput>\n      <CustomToolNamespace>My.Resources</CustomToolNamespace>\n    </EmbeddedResource>\n    <None Include=\"My Project\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.vb</LastGenOutput>\n    </None>\n    <AppDesigner Include=\"My Project\\\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\">\n      <Project>{2ba3fdd8-ed09-4825-8f43-0484045623e3}</Project>\n      <Name>WPFLocalizeExtension</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.VisualBasic.targets\" />\n</Project>"
  },
  {
    "path": "tests/VbWpfApplication/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"XAMLMarkupExtensions\" version=\"1.8.0\" targetFramework=\"net40-client\" />\n</packages>"
  },
  {
    "path": "tests/VbWpfApplication.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30011.22\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{F184B08F-C81C-45F6-A57F-5ABD9991F28F}\") = \"VbWpfApplication\", \"VbWpfApplication\\VbWpfApplication.vbproj\", \"{1F6BCD30-6F08-448F-B3FF-D47C27B32025}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WPFLocalizeExtension\", \"..\\src\\WPFLocalizeExtension.csproj\", \"{2BA3FDD8-ED09-4825-8F43-0484045623E3}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{1F6BCD30-6F08-448F-B3FF-D47C27B32025}.Debug|Any CPU.ActiveCfg = Debug|x86\n\t\t{1F6BCD30-6F08-448F-B3FF-D47C27B32025}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{1F6BCD30-6F08-448F-B3FF-D47C27B32025}.Debug|x86.Build.0 = Debug|x86\n\t\t{1F6BCD30-6F08-448F-B3FF-D47C27B32025}.Release|Any CPU.ActiveCfg = Release|x86\n\t\t{1F6BCD30-6F08-448F-B3FF-D47C27B32025}.Release|x86.ActiveCfg = Release|x86\n\t\t{1F6BCD30-6F08-448F-B3FF-D47C27B32025}.Release|x86.Build.0 = Release|x86\n\t\t{2BA3FDD8-ED09-4825-8F43-0484045623E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2BA3FDD8-ED09-4825-8F43-0484045623E3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2BA3FDD8-ED09-4825-8F43-0484045623E3}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{2BA3FDD8-ED09-4825-8F43-0484045623E3}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{2BA3FDD8-ED09-4825-8F43-0484045623E3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2BA3FDD8-ED09-4825-8F43-0484045623E3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2BA3FDD8-ED09-4825-8F43-0484045623E3}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{2BA3FDD8-ED09-4825-8F43-0484045623E3}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {5029A687-DF6B-49BC-AF25-F7D40F98DD38}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "tests/WPFLocalizeExtension.UnitTests/ValueConvertersTests/LocExtensionTests.cs",
    "content": "﻿namespace WPFLocalizeExtension.UnitTests.ValueConvertersTests\n{\n    #region Usings\n    using Xunit;\n    using XAMLMarkupExtensions.Base;\n    using WPFLocalizeExtension.Engine;\n    using WPFLocalizeExtension.Extensions;\n    #endregion\n    \n    /// <summary>\n    /// Tests for <see cref=\"LocExtension\" />.\n    /// </summary>\n    public class LocExtensionTests\n    {\n        #region FallbackBehavior\n\n        private const string MISSING_KEY_RESULT = nameof(MISSING_KEY_RESULT);\n        \n        /// <summary>\n        /// Check different behaviors when key is not found at resource provider.\n        /// </summary>\n        [Theory]\n        [InlineData(FallbackBehavior.Default, \"Key: abacaba\")]\n        [InlineData(FallbackBehavior.Key, \"abacaba\")]\n        [InlineData(FallbackBehavior.EmptyString, \"\")]\n        public void FormatOutput_SpecifiedFallbackBehavior_SpecifiedOutput(FallbackBehavior fallbackBehavior, string expectedValue)\n        {\n            // ARRANGE.\n            const string key = \"abacaba\";\n            \n            var locExtension = new LocExtension(key);\n            locExtension.FallbackBehavior = fallbackBehavior;\n            var endPoint = new TargetInfo(null, null, typeof(string), -1);\n            var info = new TargetInfo(null, null, typeof(string), -1);\n\n            // ACT.\n            var resultValue = locExtension.FormatOutput(endPoint, info);\n            \n            // ASSERT.\n            Assert.Equal(expectedValue, resultValue);\n        }\n\n        /// <summary>\n        /// Check if <see cref=\"LocalizeDictionary.MissingKeyEvent\" /> specifies missing value, then <see cref=\"FallbackBehavior\" /> is not used.\n        /// </summary>\n        [Theory]\n        [InlineData(FallbackBehavior.Default)]\n        [InlineData(FallbackBehavior.Key)]\n        [InlineData(FallbackBehavior.EmptyString)]\n        public void FormatOutput_MissingKeyEventHandling_FallbackBehaviorNotUsed(FallbackBehavior fallbackBehavior)\n        {\n            // ARRANGE.\n            const string key = \"abacaba\";\n            \n            var locExtension = new LocExtension(key);\n            locExtension.FallbackBehavior = fallbackBehavior;\n            var endPoint = new TargetInfo(null, null, typeof(string), -1);\n            var info = new TargetInfo(null, null, typeof(string), -1);\n\n            // ACT.\n            object resultValue;\n            LocalizeDictionary.Instance.MissingKeyEvent += OnMissingKeyEvent;\n            \n            try\n            {\n                resultValue = locExtension.FormatOutput(endPoint, info);\n            }\n            finally\n            {\n                LocalizeDictionary.Instance.MissingKeyEvent -= OnMissingKeyEvent;\n            }\n            \n            // ASSERT.\n            Assert.Equal(MISSING_KEY_RESULT, resultValue);\n        }\n\n        /// <summary>\n        /// Handle <see cref=\"LocalizeDictionary.MissingKeyEvent\" />.\n        /// </summary>\n        private static void OnMissingKeyEvent(object sender, MissingKeyEventArgs e)\n        {\n            e.MissingKeyResult = MISSING_KEY_RESULT;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "tests/WPFLocalizeExtension.UnitTests/ValueConvertersTests/StringFormatConverterTests.cs",
    "content": "﻿namespace WPFLocalizeExtension.UnitTests.ValueConvertersTests\n{\n    #region Usings\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.Text;\n    using System.Windows;\n    using Xunit;\n    using WPFLocalizeExtension.ValueConverters;\n    #endregion\n    \n    /// <summary>\n    /// Tests for converter <see cref=\"StringFormatConverter\" />.\n    /// </summary>\n    public class StringFormatConverterTests\n    {\n        private const string CONVERTED_VALUE = \"hello world\";\n        private readonly object[] _values = new object[] { \"{0} {1}\", \"hello\", \"world\" };\n        \n        /// <summary>\n        /// Test data for <see cref=\"Convert_SpecifiedValues_ValueConverted\" />.\n        /// </summary>\n        public static IReadOnlyList<object[]> ExpectedStringAndValuesData =>\n            new List<object[]>\n            {\n                new object[] { \"hello world\", \"{0} {1}\", \"hello\", \"world\" },\n                new object[] { \"12345\", \"{0}{1}{2}{3}{4}\", 1, 2, 3, 4, 5 },\n                new object[] { \"hello world\", \"hello world\" },\n                new object[] { \"01.01.1970\", \"{0:dd.MM.yyyy}\", new DateTime(1970, 1, 1, 10, 0, 0) },\n                new object[] { \"hello world\", new StringBuilder(\"{0} {1}\"), \"hello\", \"world\" },\n                new object[] { \"hello world\", \"hello world\" },\n            };\n        \n        /// <summary>\n        /// Check that converter is supported <see cref=\"object\" /> and <see cref=\"string\" /> as target type.\n        /// </summary>\n        [Theory]\n        [InlineData(typeof(object))]\n        [InlineData(typeof(string))]\n        public void Convert_SupportedTargetType_ValueConverted(Type targetType)\n        {\n            // ARRANGE.\n            var converter = new StringFormatConverter();\n            \n            // ACT.\n            var convertedValue = converter.Convert(_values, targetType, null, CultureInfo.InvariantCulture);\n            \n            // ASSERT.\n            Assert.Equal(CONVERTED_VALUE, convertedValue);\n        }\n        \n        /// <summary>\n        /// Check that converter is not supported target types others except <see cref=\"object\" /> and <see cref=\"string\" />.\n        /// </summary>\n        [Theory]\n        [InlineData(typeof(int))]\n        [InlineData(typeof(DateTime))]\n        [InlineData(typeof(StringBuilder))]\n        public void Convert_UnsupportableTargetTypes_ExceptionThrown(Type targetType)\n        {\n            // ARRANGE.\n            var converter = new StringFormatConverter();\n            \n            // ACT + ASSERT.\n            var exception = Assert.Throws<Exception>(() => converter.Convert(_values, targetType, null, CultureInfo.InvariantCulture));\n            Assert.Equal(\"TargetType is not supported strings\", exception.Message);\n        }\n\n        /// <summary>\n        /// Check that exception is thrown if passed null as values parameter.\n        /// </summary>\n        [Fact]\n        public void Convert_ValuesIsNull_ExceptionThrown()\n        {\n            // ARRANGE.\n            var converter = new StringFormatConverter();\n            \n            // ACT + ASSERT.\n            var exception = Assert.Throws<Exception>(() => converter.Convert(null, typeof(string), null, CultureInfo.InvariantCulture));\n            Assert.Equal(\"Not enough parameters\", exception.Message);\n        }\n        \n        /// <summary>\n        /// Check that exception is thrown if passed empty array as values parameter.\n        /// </summary>\n        [Fact]\n        public void Convert_ValuesIsEmpty_ExceptionThrown()\n        {\n            // ARRANGE.\n            var converter = new StringFormatConverter();\n            \n            // ACT + ASSERT.\n            var exception = Assert.Throws<Exception>(() => converter.Convert(Array.Empty<object>(), typeof(string), null, CultureInfo.InvariantCulture));\n            Assert.Equal(\"Not enough parameters\", exception.Message);\n        }\n        \n        /// <summary>\n        /// Check that returns null if passed null format string.\n        /// </summary>\n        [Fact]\n        public void Convert_FormatStringIsNull_ReturnsNull()\n        {\n            // ARRANGE.\n            var converter = new StringFormatConverter();\n            \n            // ACT.\n            var convertedValue = converter.Convert(new object[] { null, \"hello\", \"world\" }, typeof(string), null, CultureInfo.InvariantCulture);\n            \n            // ASSERT.\n            Assert.Null(convertedValue);\n        }\n        \n        /// <summary>\n        /// Check that returns null if passed UnsetValue as second value.\n        /// </summary>\n        [Fact]\n        public void Convert_SecondValueIsUnsetValue_ReturnsNull()\n        {\n            // ARRANGE.\n            var converter = new StringFormatConverter();\n            \n            // ACT.\n            var convertedValue = converter.Convert(new[] { CONVERTED_VALUE, DependencyProperty.UnsetValue }, typeof(string), null, CultureInfo.InvariantCulture);\n            \n            // ASSERT.\n            Assert.Null(convertedValue);\n        }\n        \n        /// <summary>\n        /// Check different combinations of input values.\n        /// </summary>\n        [Theory]\n        [MemberData(nameof(ExpectedStringAndValuesData))]\n        public void Convert_SpecifiedValues_ValueConverted(string expectedConvertedValue, params object[] values)\n        {\n            // ARRANGE.\n            var converter = new StringFormatConverter();\n            \n            // ACT.\n            var convertedValue = converter.Convert(values, typeof(string), null, CultureInfo.InvariantCulture);\n            \n            // ASSERT.\n            Assert.Equal(expectedConvertedValue, convertedValue);\n        }\n\n        /// <summary>\n        /// Check that ConvertBack just return null value without throw exceptions.\n        /// </summary>\n        [Fact]\n        public void ConvertBack_AnyValue_ReturnsNull()\n        {\n            // ARRANGE.\n            var converter = new StringFormatConverter();\n            \n            // ACT.\n            var originalValues = converter.ConvertBack(CONVERTED_VALUE, new []{ typeof(string) }, null, CultureInfo.InvariantCulture);\n            \n            // ASSERT.\n            Assert.Null(originalValues);\n        }\n    }\n}"
  },
  {
    "path": "tests/WPFLocalizeExtension.UnitTests/WPFLocalizeExtension.UnitTests.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n    <PropertyGroup>\n\n        <IsPackable>false</IsPackable>\n\n        <TargetFramework>netcoreapp3.1</TargetFramework>\n    </PropertyGroup>\n\n    <ItemGroup>\n        <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"16.5.0\" />\n        <PackageReference Include=\"xunit\" Version=\"2.4.0\" />\n        <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.4.0\" />\n        <PackageReference Include=\"coverlet.collector\" Version=\"1.2.0\" />\n    </ItemGroup>\n\n    <ItemGroup>\n      <ProjectReference Include=\"..\\..\\src\\WPFLocalizeExtension.csproj\" />\n    </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "tests/XamlLocalizationTest.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.421\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Dependencies\", \"Dependencies\", \"{7141B014-FF60-4105-B88C-9812838D6D0D}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ResourceAssembly\", \"ResourceAssembly\\ResourceAssembly.csproj\", \"{B76576C2-D09F-417A-AEE3-47F31210DF14}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WPFLocalizeExtension\", \"..\\src\\WPFLocalizeExtension.csproj\", \"{E8C5B094-2CB4-4C26-87F0-351B03612179}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"AssemblyTest\", \"AssemblyTest\\AssemblyTest.csproj\", \"{DA56BE11-7D65-4602-9B5B-3EE51C20E830}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"AssemblyTestResourceLib\", \"AssemblyTestResourceLib\\AssemblyTestResourceLib.csproj\", \"{F8ED06E5-39CA-458B-8B84-E043C335BDE2}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ProviderExample\", \"ProviderExample\\ProviderExample.csproj\", \"{AEECE3FE-7731-47E4-9E0D-D84F18837168}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"MemoryTest\", \"MemoryTest\\MemoryTest.csproj\", \"{3D591943-C256-46EB-88EA-CCA0B3A498E6}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Fluent.Sample.Foundation\", \"FluentLexTest\\Fluent.Sample.Foundation.csproj\", \"{65C4A879-2E9E-4A74-9AC7-A31C71D1F612}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"GapTextWpfTest\", \"GapTextWpfTest\\GapTextWpfTest.csproj\", \"{777707A8-E4B6-4482-A67B-A80CC789317F}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{B76576C2-D09F-417A-AEE3-47F31210DF14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B76576C2-D09F-417A-AEE3-47F31210DF14}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B76576C2-D09F-417A-AEE3-47F31210DF14}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B76576C2-D09F-417A-AEE3-47F31210DF14}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{DA56BE11-7D65-4602-9B5B-3EE51C20E830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{DA56BE11-7D65-4602-9B5B-3EE51C20E830}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{DA56BE11-7D65-4602-9B5B-3EE51C20E830}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{DA56BE11-7D65-4602-9B5B-3EE51C20E830}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F8ED06E5-39CA-458B-8B84-E043C335BDE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F8ED06E5-39CA-458B-8B84-E043C335BDE2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F8ED06E5-39CA-458B-8B84-E043C335BDE2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F8ED06E5-39CA-458B-8B84-E043C335BDE2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AEECE3FE-7731-47E4-9E0D-D84F18837168}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AEECE3FE-7731-47E4-9E0D-D84F18837168}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AEECE3FE-7731-47E4-9E0D-D84F18837168}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AEECE3FE-7731-47E4-9E0D-D84F18837168}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3D591943-C256-46EB-88EA-CCA0B3A498E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3D591943-C256-46EB-88EA-CCA0B3A498E6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3D591943-C256-46EB-88EA-CCA0B3A498E6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3D591943-C256-46EB-88EA-CCA0B3A498E6}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{65C4A879-2E9E-4A74-9AC7-A31C71D1F612}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{65C4A879-2E9E-4A74-9AC7-A31C71D1F612}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{65C4A879-2E9E-4A74-9AC7-A31C71D1F612}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{777707A8-E4B6-4482-A67B-A80CC789317F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{777707A8-E4B6-4482-A67B-A80CC789317F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{777707A8-E4B6-4482-A67B-A80CC789317F}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{E8C5B094-2CB4-4C26-87F0-351B03612179} = {7141B014-FF60-4105-B88C-9812838D6D0D}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {DE4D86F8-3460-4CE7-9CE0-E8EEA1C3C10A}\n\tEndGlobalSection\nEndGlobal\n"
  }
]