diff --git a/CHANGELIST.md b/CHANGELIST.md
index 93d16f8e..0ca6bebf 100644
--- a/CHANGELIST.md
+++ b/CHANGELIST.md
@@ -58,6 +58,7 @@
- Better helper method organization
- Start supporting ordered tags and non-tags
- Add more non-tag support; rearrange info window
+- Fix incorrect language three-letter code
### 2.2 (2021-12-30)
- Fix Saturn header finding
diff --git a/MPF.Test/RedumpLib/ExtensionsTests.cs b/MPF.Test/RedumpLib/ExtensionsTests.cs
index 7d3db19c..a68ddbae 100644
--- a/MPF.Test/RedumpLib/ExtensionsTests.cs
+++ b/MPF.Test/RedumpLib/ExtensionsTests.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Data;
using System.Linq;
using RedumpLib.Data;
using Xunit;
@@ -250,6 +251,87 @@ namespace MPF.Test.RedumpLib
Assert.NotNull(actual);
}
+ ///
+ /// Ensure that every Language that has an ISO 639-1 code is unique
+ ///
+ [Fact]
+ public void NoDuplicateTwoLetterCodeTest()
+ {
+ var fullLanguages = Enum.GetValues(typeof(Language)).Cast().ToList();
+ var filteredLanguages = new Dictionary();
+
+ int totalCount = 0;
+ foreach (Language? language in fullLanguages)
+ {
+ string code = language.TwoLetterCode();
+ if (string.IsNullOrWhiteSpace(code))
+ continue;
+
+ // Throw if the code already exists
+ if (filteredLanguages.ContainsKey(code))
+ throw new DuplicateNameException($"Code {code} already in dictionary");
+
+ filteredLanguages[code] = language;
+ totalCount++;
+ }
+
+ Assert.Equal(totalCount, filteredLanguages.Count);
+ }
+
+ ///
+ /// Ensure that every Language that has a standard/bibliographic ISO 639-2 code is unique
+ ///
+ [Fact]
+ public void NoDuplicateThreeLetterCodeTest()
+ {
+ var fullLanguages = Enum.GetValues(typeof(Language)).Cast().ToList();
+ var filteredLanguages = new Dictionary();
+
+ int totalCount = 0;
+ foreach (Language? language in fullLanguages)
+ {
+ string code = language.ThreeLetterCode();
+ if (string.IsNullOrWhiteSpace(code))
+ continue;
+
+ // Throw if the code already exists
+ if (filteredLanguages.ContainsKey(code))
+ throw new DuplicateNameException($"Code {code} already in dictionary");
+
+ filteredLanguages[code] = language;
+ totalCount++;
+ }
+
+ Assert.Equal(totalCount, filteredLanguages.Count);
+ }
+
+ ///
+ /// Ensure that every Language that has a terminology ISO 639-2 code is unique
+ ///
+ [Fact]
+ public void NoDuplicateThreeLetterCodeAltTest()
+ {
+ var fullLanguages = Enum.GetValues(typeof(Language)).Cast().ToList();
+ var filteredLanguages = new Dictionary();
+
+ int totalCount = 0;
+ foreach (Language? language in fullLanguages)
+ {
+ string code = language.ThreeLetterCodeAlt();
+ if (string.IsNullOrWhiteSpace(code))
+ continue;
+
+ // Throw if the code already exists
+ if (filteredLanguages.ContainsKey(code))
+ throw new DuplicateNameException($"Code {code} already in dictionary");
+
+ filteredLanguages[code] = language;
+ totalCount++;
+ }
+
+ Assert.Equal(totalCount, filteredLanguages.Count);
+ }
+
///
/// Generate a test set of Language values
///
diff --git a/RedumpLib/Data/Enumerations.cs b/RedumpLib/Data/Enumerations.cs
index c204e2c0..72a31a66 100644
--- a/RedumpLib/Data/Enumerations.cs
+++ b/RedumpLib/Data/Enumerations.cs
@@ -842,7 +842,7 @@ namespace RedumpLib.Data
[Language(LongName = "Lozi", ThreeLetterCode = "loz")]
Lozi,
- [Language(LongName = "Luba-Katanga", TwoLetterCode = "lu", ThreeLetterCode = "loz")]
+ [Language(LongName = "Luba-Katanga", TwoLetterCode = "lu", ThreeLetterCode = "lub")]
LubaKatanga,
[Language(LongName = "Luba-Lulua", ThreeLetterCode = "lua")]
diff --git a/RedumpLib/Data/Extensions.cs b/RedumpLib/Data/Extensions.cs
index b31e8fd6..bb968ae9 100644
--- a/RedumpLib/Data/Extensions.cs
+++ b/RedumpLib/Data/Extensions.cs
@@ -970,21 +970,21 @@ namespace RedumpLib.Data
///
///
///
- private static string ThreeLetterCode(this Language? language) => ((LanguageAttribute)AttributeHelper.GetAttribute(language))?.ThreeLetterCode;
+ public static string ThreeLetterCode(this Language? language) => ((LanguageAttribute)AttributeHelper.GetAttribute(language))?.ThreeLetterCode;
///
/// Get the ISO 639-2 alternate code for each known language
///
///
///
- private static string ThreeLetterCodeAlt(this Language? language) => ((LanguageAttribute)AttributeHelper.GetAttribute(language))?.ThreeLetterCodeAlt;
+ public static string ThreeLetterCodeAlt(this Language? language) => ((LanguageAttribute)AttributeHelper.GetAttribute(language))?.ThreeLetterCodeAlt;
///
/// Get the ISO 639-1 code for each known language
///
///
///
- private static string TwoLetterCode(this Language? language) => ((LanguageAttribute)AttributeHelper.GetAttribute(language))?.TwoLetterCode;
+ public static string TwoLetterCode(this Language? language) => ((LanguageAttribute)AttributeHelper.GetAttribute(language))?.TwoLetterCode;
#endregion