From 8008f314b1f9c58b1e335257f0398a2c9fc87759 Mon Sep 17 00:00:00 2001
From: svenbarth <pascaldragon@googlemail.com>
Date: Wed, 12 Aug 2020 19:06:05 +0000
Subject: [PATCH] fcl-res: fix LANGUAGE attribute

Reintegrate fpcres-rc branch by Martok

git-svn-id: trunk@46385 -
---
 packages/fcl-res/src/rcparser.pas   | 2 +-
 packages/fcl-res/src/rcparser.y     | 2 +-
 packages/fcl-res/src/rcparserfn.inc | 8 ++++++++
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/packages/fcl-res/src/rcparser.pas b/packages/fcl-res/src/rcparser.pas
index b68016041a..a9e887db3f 100644
--- a/packages/fcl-res/src/rcparser.pas
+++ b/packages/fcl-res/src/rcparser.pas
@@ -266,7 +266,7 @@ begin
          yyval := yyv[yysp-1];
        end;
   63 : begin
-         aktresource.LangID:= MakeLangID(yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v); 
+         change_lang_id(MakeLangID(yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v)); 
        end;
   64 : begin
          aktresource.Characteristics:= yyv[yysp-0].yyrcnumtype.v; 
diff --git a/packages/fcl-res/src/rcparser.y b/packages/fcl-res/src/rcparser.y
index 515f4f53e0..3fe3072524 100644
--- a/packages/fcl-res/src/rcparser.y
+++ b/packages/fcl-res/src/rcparser.y
@@ -145,7 +145,7 @@ suboptions
     ;
 
 suboption
-    : _LANGUAGE numpos ',' numpos                  { aktresource.LangID:= MakeLangID($2.v, $4.v); }
+    : _LANGUAGE numpos ',' numpos                  { change_lang_id(MakeLangID($2.v, $4.v)); }
     | _CHARACTERISTICS numpos                      { aktresource.Characteristics:= $2.v; }
     | _VERSION numpos                              { aktresource.Version:= $2.v; }
     | _MOVEABLE                                    { aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_MOVEABLE; }
diff --git a/packages/fcl-res/src/rcparserfn.inc b/packages/fcl-res/src/rcparserfn.inc
index 3636bb2790..b982df034f 100644
--- a/packages/fcl-res/src/rcparserfn.inc
+++ b/packages/fcl-res/src/rcparserfn.inc
@@ -295,6 +295,14 @@ begin
   create_resource(aId, nil, cls);
 end;
 
+procedure change_lang_id(newlang: TLangID);
+begin
+  // cannot change a language id while it is contained in a list, so remove and re-add
+  aktresources.Remove(aktresource);
+  aktresource.LangID:= newlang;
+  aktresources.Add(aktresource);
+end;
+
 procedure raw_write_string(Stream: TMemoryStream; str: rcstrtype);
 var
   i: integer;