c# - 在 Windows Docker 容器中设置语言和区域设置

标签 c# .net docker frameworks

我正在创建一个基于 mcr.microsoft.com/dotnet/framework/runtime:4.8 的 docker 容器基础图像。

此图像设置为 en_US ,这意味着所有 Windows 语言和区域设置以及默认位置都设置为美国。

我需要做的是将其更改为 en_GB并将位置更改为 United Kindom对于默认用户,因为我有一个 .Net 应用程序,它依赖于使用它来将数据输出到 Excel 的 3rd 方库。但是,到目前为止,我尝试过的任何内容似乎都无法更改语言和区域设置。

到目前为止我尝试过的事情:

  • 试图使用 intl.cpl用于导入设置并更新默认用户的国际设置:
  • # Set Locale and language 
    & $env:SystemRoot\System32\control.exe "intl.cpl,,/f:`"UKRegion.xml`""
    
    # Set Languages/culture
    Set-Culture en-GB
    

    UKRegion.xml 的内容:
    <gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
        <!--User List-->
        <gs:UserList>
            <gs:User UserID="Current" CopySettingsToDefaultUserAcct="true" CopySettingsToSystemAcct="true"/> 
        </gs:UserList>
    
        <!-- user locale -->
        <gs:UserLocale> 
            <gs:Locale Name="en-GB" SetAsCurrent="true"/> 
        </gs:UserLocale>
    
        <!-- system locale -->
        <gs:SystemLocale Name="en-GB"/>
        <!-- GeoID -->
    
        <gs:LocationPreferences>
            <gs:GeoID Value="242"/>
        </gs:LocationPreferences>
    
        <gs:MUILanguagePreferences>
            <gs:MUILanguage Value="en-GB"/>
            <gs:MUIFallback Value="en-US"/>
        </gs:MUILanguagePreferences>
    
        <!-- input preferences -->
        <gs:InputPreferences>
            <!--en-GB-->
            <gs:InputLanguageID Action="add" ID="0809:00000809" Default="true"/> 
        </gs:InputPreferences>
    </gs:GlobalizationServices>
    
  • powershell 中启动应用程序之前设置值脚本:
  • Set-WinSystemLocale -SystemLocale en-GB
    Set-WinHomeLocation -GeoId 242
    Set-WinUserLanguageList -LanguageList (New-WinUserLanguageList -Language en-GB) -Force
    Set-Location -Path "C:\\AppFolder"
    .\AppExe.exe
    

    设置容器并附加后,我可以看到 Get-WinHomeLocation已更新,Get-WinUserLanguageList显示 en_GB作为一个选项,但是 Windows 的默认语言来自 Get-WinSystemLocale仍然返回 en-US
    我还考虑从 en-GB Windows Server Core 基础镜像构建我自己的基础镜像,并运行 Microsoft 运行的框架设置来创建 Framework 运行时 4.8 镜像,但 Microsoft 似乎没有发布 en-GB 基础镜像!

    有没有其他人遇到过这个?你是怎么解决的?还有其他建议吗?

    最佳答案

    答案是 Docker 容器在使用进程隔离时从主机继承语言设置。因此,根据需要更改主机的语言设置。在 PowerShell 中,要设置区域,您可以执行以下操作:

    Set-WinSystemLocale en-GB
    Restart-Computer
    

    现在运行 Docker:
    docker run -it --isolation=process mcr.microsoft.com/windows/servercore:1909 PowerShell
    

    在 Docker shell 中:
    Get-WinSystemLocale
    
    LCID             Name             DisplayName
    ----             ----             -----------
    2057             en-GB            English (United Kingdom)
    

    关于c# - 在 Windows Docker 容器中设置语言和区域设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58168226/

    相关文章:

    c# - .Net 命名空间可以跨越多个程序集吗?

    Docker 构建输出脚本从 dockerfile 运行

    python - 在 Mac 上使用 Docker 使用 Py2exe

    c# - 如何使用 CodeDOM 表达空合并运算符?

    C# 将大于 Int64 的数字转换为 HexaDecimal

    c# - WCF 和 IIS 中的神秘问题?

    c# - Winforms Entity Framework

    c# - YouTube上传API-离线获取Auth token

    google-chrome - Chrome 浏览器在 chrome 节点 Docker 容器中运行多个 chrome 浏览器时崩溃

    c# - 如何通过 String.Format 格式化字符串