diff --git a/src/AasxIntegrationBase/AasxLanguageHelper.cs b/src/AasxIntegrationBase/AasxLanguageHelper.cs
index d1c1ac72..a2d4a0b0 100644
--- a/src/AasxIntegrationBase/AasxLanguageHelper.cs
+++ b/src/AasxIntegrationBase/AasxLanguageHelper.cs
@@ -7,16 +7,136 @@ This source code is licensed under the Apache License 2.0 (see LICENSE.txt).
This source code may use other Open Source software components (see LICENSE.txt).
*/
+using AdminShellNS;
using System;
using System.Collections.Generic;
+using System.Collections.Immutable;
using System.Linq;
using System.Text;
+using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace AasxIntegrationBase
{
+ ///
+ /// This class lists valid combinations of ISO 639 (2 digit language codes)
+ /// and ISO 3166 (2 digit country codes). Only 1:1 relations are modelled.
+ ///
+ public class AasxLanguageTuple
+ {
+ ///
+ /// According ISO 639-2, 2 digit language code
+ ///
+ public string LangCode;
+
+ ///
+ /// According ISO 3166, 2 digit country code
+ ///
+ public string CountryCode;
+
+ ///
+ /// Marks the wildcard element
+ ///
+ public bool IsAny()
+ {
+ return LangCode == "" && CountryCode == ""
+ || LangCode == "All" && CountryCode == "All";
+ }
+ }
+
+ ///
+ /// Maintains a list of language tuples.
+ /// Note: Is always defaulted with a list of language tuples.
+ /// Could be cleard/ added.
+ ///
+ public class AasxLanguageTupleSet : MultiValueDictionary
+ {
+ public void Add(string lang, string country)
+ {
+ lang = lang?.ToLower().Trim();
+ country = country?.ToLower().Trim();
+
+ if (lang != null && lang != ""
+ && country != null && country != "")
+ {
+ this.Add(lang, new AasxLanguageTuple() { LangCode = lang, CountryCode = country });
+ }
+ }
+
+ ///
+ /// Rationale for default languages/ countries: member in IDTA or IEC TC65 WG24
+ ///
+ public void Init()
+ {
+ this.Clear();
+ Add("All", "All");
+ Add("en", "GB");
+ Add("en", "US");
+ Add("de", "DE");
+ Add("de", "CH");
+ Add("de", "AT");
+ Add("es", "ES");
+ Add("fi", "FI");
+ Add("fr", "FR");
+ Add("it", "IT");
+ Add("ja", "JP");
+ Add("ko", "KR");
+ Add("nl", "NL");
+ Add("no", "NO");
+ Add("pt", "PT");
+ Add("sv", "SE");
+ Add("zh", "CN");
+ }
+
+ public IEnumerable FindByLang(string lang)
+ {
+ lang = lang?.ToLower().Trim();
+ if (lang != null && lang != "" || this.ContainsKey(lang) == false)
+ yield break;
+ foreach (var x in this[lang])
+ yield return x;
+ }
+
+ public IEnumerable FindByCountry(string country)
+ {
+ country = country?.ToLower().Trim();
+ if (country != null && country != "")
+ yield break;
+ foreach (var tp in this.Values)
+ if (country == tp.CountryCode)
+ yield return tp;
+ }
+
+ public IEnumerable GetAllLanguages()
+ {
+ foreach (var tp in this.Values)
+ if (!tp.IsAny())
+ yield return tp.LangCode;
+ }
+
+ public IEnumerable GetAllCountries()
+ {
+ foreach (var tp in this.Values)
+ if (!tp.IsAny())
+ yield return tp.CountryCode;
+ }
+
+ public void InitByCustomString(string input)
+ {
+ this.Clear();
+ var pairs = input.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
+ foreach (var pair in pairs)
+ {
+ var m = Regex.Match(pair, @"(\w+)\s*/\s*(\w+)");
+ if (m.Success)
+ Add(m.Groups[1].ToString(), m.Groups[2].ToString());
+ }
+ }
+ }
+
public static class AasxLanguageHelper
{
+
public enum LangEnum { Any = 0, EN, DE, ZH, JA, KO, FR, ES };
public static string[] LangEnumToISO639String = {