mirror of
https://github.com/kwsch/PKHeX
synced 2024-11-25 13:30:20 +00:00
Standardize language codes and improve locale handling (#4353)
Use standard BCP 47 language codes Move Culture utils into WinFormsUtil Detect system language on first launch
This commit is contained in:
parent
42c1dee4e1
commit
3707ee5eb1
269 changed files with 119 additions and 63 deletions
|
@ -323,7 +323,7 @@ public sealed class ShowdownSet : IBattleTemplate
|
|||
/// <summary>
|
||||
/// Gets the localized Text representation of the set details.
|
||||
/// </summary>
|
||||
/// <param name="lang">2 character language code</param>
|
||||
/// <param name="lang">Language code</param>
|
||||
public string LocalizedText(string lang = DefaultLanguage) => LocalizedText(GameLanguage.GetLanguageIndex(lang));
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -22,7 +22,7 @@ public static class GameInfo
|
|||
|
||||
public static GameStrings GetStrings(int index)
|
||||
{
|
||||
return Languages[index] ??= new GameStrings(GameLanguage.Language2Char(index));
|
||||
return Languages[index] ??= new GameStrings(GameLanguage.LanguageCode(index));
|
||||
}
|
||||
|
||||
public static GameStrings Strings
|
||||
|
|
|
@ -10,14 +10,13 @@ public static class GameLanguage
|
|||
{
|
||||
public const string DefaultLanguage = "en"; // English
|
||||
public static int DefaultLanguageIndex => Array.IndexOf(LanguageCodes, DefaultLanguage);
|
||||
public static string Language2Char(int lang) => (uint)lang >= LanguageCodes.Length ? DefaultLanguage : LanguageCodes[lang];
|
||||
|
||||
public static string LanguageCode(int lang) => (uint)lang >= LanguageCodes.Length ? DefaultLanguage : LanguageCodes[lang];
|
||||
public static int LanguageCount => LanguageCodes.Length;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the language from the requested 2-char <see cref="lang"/> code.
|
||||
/// Gets the language from the requested language code.
|
||||
/// </summary>
|
||||
/// <param name="lang">2 character language code</param>
|
||||
/// <param name="lang">Language code</param>
|
||||
/// <returns>Index of the language code; if not a valid language code, returns the <see cref="DefaultLanguageIndex"/>.</returns>
|
||||
public static int GetLanguageIndex(string lang)
|
||||
{
|
||||
|
@ -25,11 +24,18 @@ public static class GameLanguage
|
|||
return l < 0 ? DefaultLanguageIndex : l;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks whether the language code is supported.
|
||||
/// </summary>
|
||||
/// <param name="lang">Language code</param>
|
||||
/// <returns>True if valid, False otherwise</returns>
|
||||
public static bool IsLanguageValid(string lang) => Array.IndexOf(LanguageCodes, lang) != -1;
|
||||
|
||||
/// <summary>
|
||||
/// Language codes supported for loading string resources
|
||||
/// </summary>
|
||||
/// <see cref="ProgramLanguage"/>
|
||||
private static readonly string[] LanguageCodes = ["ja", "en", "fr", "it", "de", "es", "ko", "zh", "zh2"];
|
||||
private static readonly string[] LanguageCodes = ["ja", "en", "fr", "it", "de", "es", "ko", "zh-Hans", "zh-Hant"];
|
||||
|
||||
/// <summary>
|
||||
/// Pokétransporter location names, ordered per index of <see cref="LanguageCodes"/>
|
||||
|
|
|
@ -715,7 +715,7 @@ public sealed class GameStrings : IBasicStrings
|
|||
// in Generation 9, TM #'s are padded to 3 digits; format them appropriately here
|
||||
var clone = (string[])itemlist.Clone();
|
||||
var span = clone.AsSpan();
|
||||
var zero = lang is "ja" or "zh" or "zh2" ? "0" : "0";
|
||||
var zero = lang is "ja" or "zh-Hans" or "zh-Hant" ? "0" : "0";
|
||||
InsertZero(span[328..420], zero); // 01-92
|
||||
InsertZero(span[618..621], zero); // 93-95
|
||||
InsertZero(span[690..694], zero); // 96-99
|
||||
|
|
|
@ -8,14 +8,14 @@ namespace PKHeX.Core;
|
|||
public static class GeoLocation
|
||||
{
|
||||
private static readonly string[]?[] CountryList = GetCountryList();
|
||||
private static readonly string[] lang_geo = ["ja", "en", "fr", "de", "it", "es", "zh", "ko", "zh2"];
|
||||
private static readonly string[] lang_geo = ["ja", "en", "fr", "de", "it", "es", "zh-Hans", "ko", "zh-Hant"];
|
||||
private static readonly string[]?[]?[] RegionList = new string[CountryList.Length][][];
|
||||
|
||||
/// <summary>
|
||||
/// Returns the index of which the <see cref="language"/> is in the country/region list.
|
||||
/// </summary>
|
||||
public static int GetLanguageIndex(string language) => Array.IndexOf(lang_geo, language);
|
||||
private static int GetLanguageIndex(LanguageID language) => GetLanguageIndex(language.GetLanguage2CharName());
|
||||
private static int GetLanguageIndex(LanguageID language) => GetLanguageIndex(language.GetLanguageCode());
|
||||
|
||||
private const string INVALID = nameof(INVALID);
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ internal static class Encounters7SM
|
|||
internal static readonly EncounterArea7[] SlotsMN = EncounterArea7.GetAreas(Get("mn", "sm"u8), MN);
|
||||
|
||||
private const string tradeSM = "tradesm";
|
||||
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeSM);
|
||||
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeSM, "zh");
|
||||
|
||||
public static readonly EncounterStatic7[] StaticSM = // @ a\1\5\5
|
||||
[
|
||||
|
|
|
@ -13,7 +13,7 @@ internal static class Encounters7USUM
|
|||
internal static readonly EncounterArea7[] SlotsUM = EncounterArea7.GetAreas(Get("um", "uu"u8), UM);
|
||||
|
||||
private const string tradeUSUM = "tradeusum";
|
||||
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeUSUM);
|
||||
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeUSUM, "zh");
|
||||
|
||||
public static readonly EncounterStatic7[] StaticUSUM =
|
||||
[
|
||||
|
|
|
@ -758,7 +758,7 @@ internal static class Encounters8
|
|||
];
|
||||
|
||||
private const string tradeSWSH = "tradeswsh";
|
||||
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeSWSH, "zh2");
|
||||
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeSWSH);
|
||||
private static readonly string[] TradeOT_R1 = [string.Empty, "チホコ", "Regina", "Régiona", "Regionalia", "Regine", string.Empty, "Tatiana", "지민", "易蒂", "易蒂"];
|
||||
private static readonly IndividualValueSet TradeIVs = new(15, 15, 15, 15, 15, 15);
|
||||
|
||||
|
|
|
@ -93,7 +93,7 @@ internal static class Encounters8b
|
|||
];
|
||||
|
||||
private const string tradeBDSP = "tradebdsp";
|
||||
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeBDSP, "zh2");
|
||||
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeBDSP);
|
||||
|
||||
internal static readonly EncounterTrade8b[] TradeGift_BDSP =
|
||||
[
|
||||
|
|
|
@ -152,7 +152,7 @@ internal static class Encounters9
|
|||
];
|
||||
|
||||
private const string tradeSV = "tradesv";
|
||||
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeSV, "zh2");
|
||||
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeSV);
|
||||
|
||||
internal static readonly EncounterTrade9[] TradeGift_SV =
|
||||
[
|
||||
|
|
|
@ -63,11 +63,11 @@ public static class Language
|
|||
};
|
||||
|
||||
/// <summary>
|
||||
/// Gets the 2-character language name for the given <see cref="LanguageID"/>.
|
||||
/// Gets the language code for the given <see cref="LanguageID"/>.
|
||||
/// </summary>
|
||||
/// <param name="language">Language ID to get the 2-character name for.</param>
|
||||
/// <returns>2-character language name.</returns>
|
||||
public static string GetLanguage2CharName(this LanguageID language) => language switch
|
||||
/// <param name="language">Language ID to get the language code for.</param>
|
||||
/// <returns>Language code.</returns>
|
||||
public static string GetLanguageCode(this LanguageID language) => language switch
|
||||
{
|
||||
Japanese => "ja",
|
||||
French => "fr",
|
||||
|
@ -75,8 +75,8 @@ public static class Language
|
|||
German => "de",
|
||||
Spanish => "es",
|
||||
Korean => "ko",
|
||||
ChineseS => "zh",
|
||||
ChineseT => "zh2",
|
||||
ChineseS => "zh-Hans",
|
||||
ChineseT => "zh-Hant",
|
||||
_ => GameLanguage.DefaultLanguage,
|
||||
};
|
||||
|
||||
|
|
|
@ -24,8 +24,8 @@ public static class SpeciesName
|
|||
Util.GetSpeciesList("es"), // 6 (reserved for Gen3 KO?, unused)
|
||||
Util.GetSpeciesList("es"), // 7
|
||||
Util.GetSpeciesList("ko"), // 8
|
||||
Util.GetSpeciesList("zh"), // 9 Simplified
|
||||
Util.GetSpeciesList("zh2"), // 10 Traditional
|
||||
Util.GetSpeciesList("zh-Hans"), // 9 Simplified
|
||||
Util.GetSpeciesList("zh-Hant"), // 10 Traditional
|
||||
];
|
||||
|
||||
/// <summary>
|
||||
|
@ -221,7 +221,7 @@ public static class SpeciesName
|
|||
/// For a Gen7 species name request, return the old species name (hardcoded... yay).
|
||||
/// In an updated Gen8 game, the species nickname will automatically reset to the correct localization (on save/load ?), fixing existing entries.
|
||||
/// We don't differentiate patch revisions, just generation; Gen8 will return the latest localization.
|
||||
/// Gen8 did revise CHT species names, but only for Barraskewda, Urshifu, and Zarude. These species are new (Gen8); we can just use the latest.
|
||||
/// Gen8 did revise CHS species names, but only for Barraskewda, Urshifu, and Zarude. These species are new (Gen8); we can just use the latest.
|
||||
/// </remarks>
|
||||
private static string GetSpeciesName7ZH(ushort species, int language) => species switch
|
||||
{
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue