【问题标题】:Reading the regional location setting (country code) in Windows using Ruby?使用 Ruby 在 Windows 中读取区域位置设置(国家代码)?
【发布时间】:2019-01-05 22:06:28
【问题描述】:

我正在尝试使用 Ruby 访问 控制面板:区域和语言:位置:当前位置设置。我只对国家代码感兴趣。

我得到的最接近的是来自系统区域设置的国家/地区代码,但这并不是我想要的。

`systeminfo | findstr /B /C:"System Locale"`.to_s.upcase.strip[30..31]

希望有人知道。谢谢。

【问题讨论】:

    标签: ruby windows internationalization regional-settings


    【解决方案1】:

    使用 Win32 API:

    require 'Win32API'
    
    # Set up some Win32 constants
    GEOCLASS_NATION  = 16
    GEO_ISO2         = 4
    GEO_FRIENDLYNAME = 8
    
    # Set up some API calls
    GetUserGeoID = Win32API.new('kernel32', 'GetUserGeoID', ['L'], 'L')
    GetGeoInfo   = Win32API.new('kernel32', 'GetGeoInfoA', ['L', 'L', 'P', 'L', 'L'], 'L')
    
    # Get user's GEOID
    geoid = GetUserGeoID.call(GEOCLASS_NATION)
    => 77
    
    # Get ISO name
    buffer = " " * 100
    GetGeoInfo.call(geoid, GEO_ISO2, buffer, buffer.length, 0)
    geo_iso = buffer.strip
    => "FI"
    
    # Get friendly name
    buffer = " " * 100
    GetGeoInfo.call(geoid, GEO_FRIENDLYNAME, buffer, buffer.length, 0)
    geo_name = buffer.strip
    => "Finland"
    

    GetUserGeoID 的文档:
    http://msdn.microsoft.com/en-us/library/dd318138.aspx

    GetGeoInfo 的文档:
    https://docs.microsoft.com/en-us/windows/desktop/api/winnls/nf-winnls-getgeoinfoa

    要将 GEOID 转换为位置名称,您还可以使用此表:
    http://msdn.microsoft.com/en-us/library/dd374073.aspx

    【讨论】:

    • 这比我预期的要多得多。但这是正确的解决方案。谢谢。
    • Nit: GetUserGeoID 不返回 LCID,它返回 GEOID。如果您的客户端使用的是 Windows 10,您可以转至 GetUserDefaultGeoName 并跳过此步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多