diff --git a/CRM/Core/I18n.php b/CRM/Core/I18n.php
index be23d592ff0ca6e440e674d393760947fa3f5e0a..8a97d428c29709c866a4e9932291d0cd1ac684a1 100644
--- a/CRM/Core/I18n.php
+++ b/CRM/Core/I18n.php
@@ -282,11 +282,7 @@ class CRM_Core_I18n {
    * @return string
    */
   public static function getResourceDir() {
-    static $dir = NULL;
-    if ($dir === NULL) {
-      $dir = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'l10n' . DIRECTORY_SEPARATOR;
-    }
-    return $dir;
+    return \Civi::paths()->getPath('[civicrm.l10n]/.');
   }
 
   /**
diff --git a/Civi/Core/Paths.php b/Civi/Core/Paths.php
index 29bd7393d04d136a774eb417f329c69c2f08dcd7..a4ab40c220209185ca468a44518fdf8d313c80f6 100644
--- a/Civi/Core/Paths.php
+++ b/Civi/Core/Paths.php
@@ -78,6 +78,12 @@ class Paths {
           'path' => defined('CIVICRM_TEMPLATE_COMPILEDIR') ? CIVICRM_TEMPLATE_COMPILEDIR : \Civi::paths()->getPath('[civicrm.private]/templates_c'),
         ];
       })
+      ->register('civicrm.l10n', function () {
+        $dir = defined('CIVICRM_L10N_BASEDIR') ? CIVICRM_L10N_BASEDIR : \Civi::paths()->getPath('[civicrm.private]/l10n');
+        return [
+          'path' => is_dir($dir) ? $dir : \Civi::paths()->getPath('[civicrm.root]/l10n'),
+        ];
+      })
       ->register('wp.frontend.base', function () {
         return ['url' => rtrim(CIVICRM_UF_BASEURL, '/') . '/'];
       })
diff --git a/xml/GenCode.php b/xml/GenCode.php
index cee7f1475a5df5da572df96fdb93fb333a6454bd..01b541c9bdda5857b18d8cebf0f85ac564d52fda 100644
--- a/xml/GenCode.php
+++ b/xml/GenCode.php
@@ -27,6 +27,7 @@ date_default_timezone_set('UTC');
 
 define('CIVICRM_UF', 'Drupal');
 define('CIVICRM_UF_BASEURL', '/');
+define('CIVICRM_L10N_BASEDIR', getenv('CIVICRM_L10N_BASEDIR') ? getenv('CIVICRM_L10N_BASEDIR') : __DIR__ . '/../l10n');
 
 require_once 'CRM/Core/ClassLoader.php';
 CRM_Core_ClassLoader::singleton()->register();