pentaho/pentaho-kettle · error · KettleFileException

i18n.Log.UnableToGetFiles

Error message

i18n.Log.UnableToGetFiles

What it means

Translator2 (the newer Translator UI) wraps any exception thrown while scanning rootDirectories for i18n files and locale key sets into a KettleFileException, with the directory list rendered from the localized message i18n.Log.UnableToGetFiles. It signals that the locale/file inventory for the configured source folders could not be built.

Solutions

  1. Check the directories listed in the error exist and are readable; fix the Translator2 configuration (loadConfiguration configFile / sourceFolder).
  2. Re-run loadConfiguration with the correct root source folder of the PDI project.
  3. Fix permissions on the source tree.
  4. Inspect the chained cause 'e' for the underlying exception type and file.

Example fix

// before
// configFile points to /home/olduser/pdi-ui/src (deleted)
translator2.readFiles(); // KettleFileException

// after
// update config to current checkout
translator2.loadConfiguration( configFile, "/home/dev/pentaho-kettle/ui/src" );
translator2.readFiles();
Defensive patterns

Strategy: validation

Validate before calling

for ( String dir : rootDirectories ) {
  if ( !new File( dir ).isDirectory() ) {
    throw new IllegalStateException( "Configured i18n root missing: " + dir );
  }
}

Try / catch

try {
  translator2.readFiles();
} catch ( KettleFileException e ) {
  log.error( "Check rootDirectories from the Translator2 config: " + e.getMessage(), e );
}

Prevention

When it happens

Trigger: readFiles() (called by open()/reload()) fails because a configured root directory does not exist or is unreadable, or processing a discovered locale file throws (parse/IO error).

Common situations: Translator2 config file points at source folders from a different machine or deleted checkout; the chosen source folder has no messages files; permissions issues after a workspace move.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/99f81312261abcb7. Report an issue: GitHub.

Appendix: source

Thrown at ui/src/main/java/org/pentaho/di/ui/i18n/editor/Translator2.java:252

              locales[j] = locales[j + 1];
              locales[j + 1] = l;
            }
          }
        }

        for ( int i = 0; i < locales.length; i++ ) {
          double donePct = 100 * (double) keyCounts[i] / nrKeys;
          int missingKeys = nrKeys - keyCounts[i];
          String statusKeys =
            "# "
              + nrFormat.format( i + 1L ) + " : " + locales[i] + " : " + pctFormat.format( donePct ) + "% "
              + BaseMessages.getString( PKG, "i18n.Log.CompleteKeys", keyCounts[i] )
              + ( missingKeys != 0 ? BaseMessages.getString( PKG, "i18n.Log.MissingKeys", missingKeys ) : EMPTY_STRING );
          System.out.println( statusKeys );
        }
      }
    } catch ( Exception e ) {
      throw new KettleFileException( BaseMessages.getString( PKG, "i18n.Log.UnableToGetFiles", rootDirectories
        .toString() ), e );
    }
  }

  public void loadConfiguration( String configFile, String sourceFolder ) throws Exception {
    // What are the locale to handle?
    //
    localeList = new ArrayList<>();
    rootDirectories = new ArrayList<>();
    filesToAvoid = new ArrayList<>();
    xmlFolders = new ArrayList<>();

    FileObject file = KettleVFS.getInstance( DefaultBowl.getInstance() ).getFileObject( configFile );
    if ( file.exists() ) {
      try {
        Document doc = XMLHandler.loadXMLFile( file );
        Node configNode = XMLHandler.getSubNode( doc, "translator-config" );

View on GitHub (pinned to f3058517a1)