diff --git a/migration/i8.2/oracle/202101152101_IDEMPIERE-4650.sql b/migration/i8.2/oracle/202101152101_IDEMPIERE-4650.sql
new file mode 100644
index 0000000000..ffa10720b8
--- /dev/null
+++ b/migration/i8.2/oracle/202101152101_IDEMPIERE-4650.sql
@@ -0,0 +1,25 @@
+SET SQLBLANKLINES ON
+SET DEFINE OFF
+
+-- IDEMPIERE-4650 Problems with Language Management in PO
+-- 2021 Jan 15 20:49:25 CET
+UPDATE AD_Column SET ReadOnlyLogic='@#AD_Client_ID@=0',Updated=TO_DATE('2021-01-15 20:49:25','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=7567
+;
+
+UPDATE AD_Client SET IsMultilingualDocument='Y' WHERE AD_Client_ID=0 AND IsMultilingualDocument!='Y';
+
+-- 2021 Jan 15 20:51:26 CET
+UPDATE AD_Process SET Help='In order to enable en_US as a translation you can enable any other language as base language.
+If you don''t want to have a base language choose a language that won''t be used for login.
+If all languages are going to be used as login, create an xx_XX language not login and use it as base.
+Please note that base language cannot be a system language.
+After running this process you must close all sessions and login again.
',Updated=TO_DATE('2021-01-15 20:51:26','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_ID=200040
+;
+
+-- Jan 17, 2021, 4:15:10 PM CET
+UPDATE AD_Client SET IsMultiLingualDocument='Y',Updated=TO_DATE('2021-01-17 16:15:10','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Client_ID=11
+;
+
+SELECT register_migration_script('202101152101_IDEMPIERE-4650.sql') FROM dual
+;
+
diff --git a/migration/i8.2/postgresql/202101152101_IDEMPIERE-4650.sql b/migration/i8.2/postgresql/202101152101_IDEMPIERE-4650.sql
new file mode 100644
index 0000000000..9a80a35e7e
--- /dev/null
+++ b/migration/i8.2/postgresql/202101152101_IDEMPIERE-4650.sql
@@ -0,0 +1,22 @@
+-- IDEMPIERE-4650 Problems with Language Management in PO
+-- 2021 Jan 15 20:49:25 CET
+UPDATE AD_Column SET ReadOnlyLogic='@#AD_Client_ID@=0',Updated=TO_TIMESTAMP('2021-01-15 20:49:25','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=7567
+;
+
+UPDATE AD_Client SET IsMultilingualDocument='Y' WHERE AD_Client_ID=0 AND IsMultilingualDocument!='Y';
+
+-- 2021 Jan 15 20:51:26 CET
+UPDATE AD_Process SET Help='In order to enable en_US as a translation you can enable any other language as base language.
+If you don''t want to have a base language choose a language that won''t be used for login.
+If all languages are going to be used as login, create an xx_XX language not login and use it as base.
+Please note that base language cannot be a system language.
+After running this process you must close all sessions and login again.
',Updated=TO_TIMESTAMP('2021-01-15 20:51:26','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_ID=200040
+;
+
+-- Jan 17, 2021, 4:15:10 PM CET
+UPDATE AD_Client SET IsMultiLingualDocument='Y',Updated=TO_TIMESTAMP('2021-01-17 16:15:10','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Client_ID=11
+;
+
+SELECT register_migration_script('202101152101_IDEMPIERE-4650.sql') FROM dual
+;
+
diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java
index 2f9a8baa57..9e05206ef9 100644
--- a/org.adempiere.base/src/org/compiere/model/PO.java
+++ b/org.adempiere.base/src/org/compiere/model/PO.java
@@ -3765,9 +3765,6 @@ public abstract class PO
return true;
String tableName = p_info.getTableName();
- if (tableName.startsWith("AD") && getAD_Client_ID() == 0)
- return true;
-
//
boolean trlColumnChanged = false;
for (int i = 0; i < p_info.getColumnCount(); i++)
@@ -3820,12 +3817,14 @@ public abstract class PO
}
}
StringBuilder whereid = new StringBuilder(" WHERE ").append(keyColumn).append("=").append(get_ID());
- StringBuilder andlang = new StringBuilder(" AND AD_Language=").append(DB.TO_STRING(client.getAD_Language()));
- StringBuilder andnotlang = new StringBuilder(" AND AD_Language!=").append(DB.TO_STRING(client.getAD_Language()));
+ StringBuilder andClientLang = new StringBuilder(" AND AD_Language=").append(DB.TO_STRING(client.getAD_Language()));
+ StringBuilder andNotClientLang = new StringBuilder(" AND AD_Language!=").append(DB.TO_STRING(client.getAD_Language()));
+ String baselang = Language.getBaseAD_Language();
+ StringBuilder andBaseLang = new StringBuilder(" AND AD_Language=").append(DB.TO_STRING(baselang));
+ StringBuilder andNotBaseLang = new StringBuilder(" AND AD_Language!=").append(DB.TO_STRING(baselang));
int no = -1;
if (client.isMultiLingualDocument()) {
- String baselang = Language.getBaseAD_Language();
if (client.getAD_Language().equals(baselang)) {
// tenant language = base language
// set all translations as untranslated
@@ -3837,13 +3836,14 @@ public abstract class PO
if (log.isLoggable(Level.FINE)) log.fine("#" + no);
} else {
// tenant language <> base language
- // auto update translation for tenant language
+ // for Tenants auto update translation for tenant language
+ // for System update translation for base language (which in fact must always update zero records as there must not be translations for base)
StringBuilder sqlexec = new StringBuilder()
.append(sqlupdate)
.append(sqlcols)
.append("IsTranslated='Y'")
.append(whereid)
- .append(andlang);
+ .append(getAD_Client_ID() == 0 ? andBaseLang : andClientLang);
no = DB.executeUpdate(sqlexec.toString(), m_trxName);
if (log.isLoggable(Level.FINE)) log.fine("#" + no);
if (no >= 0) {
@@ -3852,7 +3852,7 @@ public abstract class PO
.append(sqlupdate)
.append("IsTranslated='N'")
.append(whereid)
- .append(andnotlang);
+ .append(getAD_Client_ID() == 0 ? andNotBaseLang : andNotClientLang);
no = DB.executeUpdate(sqlexec.toString(), m_trxName);
if (log.isLoggable(Level.FINE)) log.fine("#" + no);
}