]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/StrGather.py
Sync EDKII BaseTools to BaseTools project r2093.
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / StrGather.py
index 52ab439e9b0b5129d5a827fabb93532f8017834d..3df493834c48cd5cb225e04f4e263839840e8940 100644 (file)
@@ -284,6 +284,65 @@ def CreateCFileStringValue(Value):
 \r
     return Str\r
 \r
+## GetFilteredLanguage\r
+#\r
+# apply get best language rules to the UNI language code list\r
+#\r
+# @param UniLanguageList:  language code definition list in *.UNI file\r
+# @param LanguageFilterList:  language code filter list of RFC4646 format in DSC file\r
+#\r
+# @retval UniLanguageListFiltered:   the filtered language code\r
+#\r
+def GetFilteredLanguage(UniLanguageList, LanguageFilterList):\r
+    UniLanguageListFiltered = []\r
+    # if filter list is empty, then consider there is no filter\r
+    if LanguageFilterList == []:\r
+        UniLanguageListFiltered = UniLanguageList\r
+        return UniLanguageListFiltered\r
+    for Language in LanguageFilterList:\r
+        # first check for exact match\r
+        if Language in UniLanguageList:\r
+            if Language not in UniLanguageListFiltered:\r
+                UniLanguageListFiltered += [Language]\r
+        # find the first one with the same/equivalent primary tag\r
+        else:\r
+            if Language.find('-') != -1:\r
+                PrimaryTag = Language[0:Language.find('-')].lower()\r
+            else:\r
+                PrimaryTag = Language\r
+            \r
+            if len(PrimaryTag) == 3:\r
+                PrimaryTag = LangConvTable.get(PrimaryTag)\r
+            \r
+            for UniLanguage in UniLanguageList:\r
+                if UniLanguage.find('-') != -1:\r
+                    UniLanguagePrimaryTag = UniLanguage[0:UniLanguage.find('-')].lower()\r
+                else:\r
+                    UniLanguagePrimaryTag = UniLanguage\r
+                \r
+                if len(UniLanguagePrimaryTag) == 3:\r
+                    UniLanguagePrimaryTag = LangConvTable.get(UniLanguagePrimaryTag)\r
+\r
+                if PrimaryTag == UniLanguagePrimaryTag:\r
+                    if UniLanguage not in UniLanguageListFiltered:\r
+                        UniLanguageListFiltered += [UniLanguage]    \r
+                    break\r
+            else:\r
+                # Here is rule 3 for "get best language"\r
+                # If tag is not listed in the Unicode file, the default ("en") tag should be used for that language\r
+                # for better processing, find the one that best suit for it.\r
+                DefaultTag = 'en'\r
+                if DefaultTag not in UniLanguageListFiltered:\r
+                    # check whether language code with primary code equivalent with DefaultTag already in the list, if so, use that\r
+                    for UniLanguage in UniLanguageList:\r
+                        if UniLanguage.startswith('en-') or UniLanguage.startswith('eng-'):\r
+                            if UniLanguage not in UniLanguageListFiltered:\r
+                                UniLanguageListFiltered += [UniLanguage]\r
+                            break\r
+                    else:\r
+                        UniLanguageListFiltered += [DefaultTag]\r
+    return  UniLanguageListFiltered\r
+\r
 \r
 ## Create content of .c file\r
 #\r
@@ -293,10 +352,11 @@ def CreateCFileStringValue(Value):
 # @param UniObjectClass   A UniObjectClass instance\r
 # @param IsCompatibleMode Compatible mode\r
 # @param UniBinBuffer     UniBinBuffer to contain UniBinary data.\r
+# @param FilterInfo       Platform language filter information \r
 #\r
 # @retval Str:           A string of .c file content\r
 #\r
-def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniBinBuffer=None):\r
+def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniBinBuffer, FilterInfo):\r
     #\r
     # Init array length\r
     #\r
@@ -304,13 +364,29 @@ def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniBinBuffer=
     Str = ''\r
     Offset = 0\r
 \r
+    EDK2Module = FilterInfo[0]\r
+    if EDK2Module:\r
+        LanguageFilterList = FilterInfo[1]\r
+    else:\r
+        # EDK module is using ISO639-2 format filter, convert to the RFC4646 format\r
+        LanguageFilterList = [LangConvTable.get(F.lower()) for F in FilterInfo[1]]\r
+    \r
+    UniLanguageList = []\r
+    for IndexI in range(len(UniObjectClass.LanguageDef)):\r
+        UniLanguageList += [UniObjectClass.LanguageDef[IndexI][0]]           \r
+\r
+    UniLanguageListFiltered = GetFilteredLanguage(UniLanguageList, LanguageFilterList)\r
\r
+        \r
     #\r
     # Create lines for each language's strings\r
     #\r
     for IndexI in range(len(UniObjectClass.LanguageDef)):\r
         Language = UniObjectClass.LanguageDef[IndexI][0]\r
         LangPrintName = UniObjectClass.LanguageDef[IndexI][1]\r
-\r
+        if Language not in UniLanguageListFiltered:\r
+            continue\r
+        \r
         StringBuffer = StringIO()\r
         StrStringValue = ''\r
         ArrayLength = 0\r
@@ -428,13 +504,14 @@ def CreateCFileEnd():
 # @param BaseName:        The basename of strings\r
 # @param UniObjectClass   A UniObjectClass instance\r
 # @param IsCompatibleMode Compatible Mode\r
+# @param FilterInfo       Platform language filter information \r
 #\r
-# @retval CFile:         A string of complete .c file\r
+# @retval CFile:          A string of complete .c file\r
 #\r
-def CreateCFile(BaseName, UniObjectClass, IsCompatibleMode):\r
+def CreateCFile(BaseName, UniObjectClass, IsCompatibleMode, FilterInfo):\r
     CFile = ''\r
     #CFile = WriteLine(CFile, CreateCFileHeader())\r
-    CFile = WriteLine(CFile, CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode))\r
+    CFile = WriteLine(CFile, CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode, None, FilterInfo))\r
     CFile = WriteLine(CFile, CreateCFileEnd())\r
     return CFile\r
 \r
@@ -518,7 +595,7 @@ def SearchString(UniObjectClass, FileList, IsCompatibleMode):
 # This function is used for UEFI2.1 spec\r
 #\r
 #\r
-def GetStringFiles(UniFilList, SourceFileList, IncludeList, IncludePathList, SkipList, BaseName, IsCompatibleMode = False, ShellMode = False, UniGenCFlag = True, UniGenBinBuffer = None):\r
+def GetStringFiles(UniFilList, SourceFileList, IncludeList, IncludePathList, SkipList, BaseName, IsCompatibleMode = False, ShellMode = False, UniGenCFlag = True, UniGenBinBuffer = None, FilterInfo = [True, []]):\r
     Status = True\r
     ErrorMessage = ''\r
 \r
@@ -540,9 +617,9 @@ def GetStringFiles(UniFilList, SourceFileList, IncludeList, IncludePathList, Ski
     HFile = CreateHFile(BaseName, Uni, IsCompatibleMode, UniGenCFlag)\r
     CFile = None\r
     if IsCompatibleMode or UniGenCFlag:\r
-        CFile = CreateCFile(BaseName, Uni, IsCompatibleMode)\r
+        CFile = CreateCFile(BaseName, Uni, IsCompatibleMode, FilterInfo)\r
     if UniGenBinBuffer:\r
-        CreateCFileContent(BaseName, Uni, IsCompatibleMode, UniGenBinBuffer)\r
+        CreateCFileContent(BaseName, Uni, IsCompatibleMode, UniGenBinBuffer, FilterInfo)\r
 \r
     return HFile, CFile\r
 \r