diff --git a/exampleSite/config.toml b/exampleSite/config.toml
index 30c9980f8c..1f2d5a9e85 100644
--- a/exampleSite/config.toml
+++ b/exampleSite/config.toml
@@ -89,6 +89,9 @@ disableHugoGeneratorInject = true
title = "Hugo Relearn Theme"
weight = 1
languageName = "English"
+ # Language dependend settings:
+ # Use case https://gohugo.io/content-management/multilingual/#translation-by-content-directory
+ #contentDir = "content/en"
[languages.en.params]
landingPageName = " Home"
@@ -129,6 +132,9 @@ disableHugoGeneratorInject = true
title = "Cap'n Hugo Relearrrn Theme"
weight = 2
languageName = "Arrr! ☠ Pirrrates ☠"
+ # Language dependend settings:
+ # Use case https://gohugo.io/content-management/multilingual/#translation-by-content-directory
+ #contentDir = "content/pir"
[languages.pir.params]
landingPageName = " Arrr! Home"
@@ -168,9 +174,22 @@ disableHugoGeneratorInject = true
[[module.mounts]]
source = 'assets'
target = 'assets'
+
+ # Language dependend settings:
+ # Use case https://gohugo.io/content-management/multilingual/#translation-by-filename
[[module.mounts]]
source = 'content'
target = 'content'
+ # Use case https://gohugo.io/content-management/multilingual/#translation-by-content-directory
+ #[[module.mounts]]
+ # lang = 'en'
+ # source = 'content/en'
+ # target = 'content'
+ #[[module.mounts]]
+ # lang = 'pir'
+ # source = 'content/pir'
+ # target = 'content'
+
[[module.mounts]]
source = 'data'
target = 'data'
diff --git a/exampleSite/makeTransByConentDir.js b/exampleSite/makeTransByConentDir.js
new file mode 100644
index 0000000000..9bc57d1656
--- /dev/null
+++ b/exampleSite/makeTransByConentDir.js
@@ -0,0 +1,172 @@
+// Converts a multilang content folder given in the form of "Translation by Filename"
+// into the form of "Translation by content directory"
+// see https://gohugo.io/content-management/multilingual/#translate-your-content
+
+const fs = require('fs');
+const path = require('path');
+
+function getLanguages(directoryPath) {
+ const langs = {};
+ try {
+ const files = fs.readdirSync(directoryPath);
+ files.forEach((file) => {
+ const filePath = path.join(directoryPath, file);
+ const regex = /^(.*?)\.([^.]+)\.([^.]+)$/;
+ const match = file.match(regex);
+ if (match) {
+ const fileName = match[1];
+ const fileLang = match[2];
+ const fileExtension = match[3];
+ langs[fileLang] = true;
+ } else {
+ try {
+ const stats = fs.statSync(filePath);
+ if (stats.isDirectory()) {
+ Object.assign(langs, getLanguages(filePath));
+ }
+ } catch (err) {
+ console.error(`Error reading file/directory ${filePath}: ${err}`);
+ }
+ }
+ });
+ } catch (err) {
+ console.error(`Error reading directory ${directoryPath}: ${err}`);
+ }
+ return langs;
+}
+
+function processDirectory(directoryPath, oldDirectory, newDirectory, langs) {
+ try {
+ const files = fs.readdirSync(directoryPath);
+ files.forEach((file) => {
+ const relSubDirectory = directoryPath.replace(oldDirectory, '');
+ const filePath = path.join(directoryPath, file);
+ try {
+ const stats = fs.statSync(filePath);
+ const langRegex = /^(.*?)\.([^.]+)\.([^.]+)$/;
+ const langMatch = file.match(langRegex);
+ if (langMatch) {
+ if (stats.isDirectory() || stats.isFile()) {
+ // language files are be copied over as is
+ // language directories are completly copied over as is, no need to scan its content as it already identified for a language
+ const fileName = langMatch[1];
+ const fileLang = langMatch[2];
+ const fileExtension = langMatch[3];
+ const newFileDirectory = path.join(newDirectory, fileLang, relSubDirectory);
+ const newFilePath = path.join(newFileDirectory, fileName + '.' + fileExtension);
+ try {
+ fs.mkdirSync(newFileDirectory, { recursive: true });
+ fs.cpSync(filePath, newFilePath, { recursive: true });
+ } catch (err) {
+ console.error(`Error copying file/directory ${filePath} to ${newFilePath}: ${err}`);
+ return false;
+ }
+ }
+ } else {
+ if (stats.isDirectory()) {
+ // non-language directories by itself are irrelevant, but let's check for their content
+ if (!processDirectory(filePath, oldDirectory, newDirectory, langs)) {
+ return false;
+ }
+ } else if (stats.isFile()){
+ // non-language files are a different beast: copy the file into all languages that don't have a language file
+ const nonLangRegex = /^(.*?)(\.([^.]+))?$/;
+ const nonLangMatch = file.match(nonLangRegex);
+ const fileName = nonLangMatch[1];
+ const fileExtension = nonLangMatch.length > 3 ? nonLangMatch[3] : "";
+ Object.keys(langs).forEach((fileLang) => {
+ const langFilePath = path.join(directoryPath, fileName + '.' + fileLang + '.' + fileExtension);
+ const langExists = fs.existsSync(langFilePath);
+ if (!langExists) {
+ const newFileDirectory = path.join(newDirectory, fileLang, relSubDirectory);
+ const newFilePath = path.join(newFileDirectory, fileName + '.' + fileExtension);
+ try {
+ fs.mkdirSync(newFileDirectory, { recursive: true });
+ fs.cpSync(filePath, newFilePath, { recursive: true });
+ } catch (err) {
+ console.error(`Error copying file ${filePath} to ${newFilePath}: ${err}`);
+ return false;
+ }
+ }
+ });
+ }
+ }
+ } catch (err) {
+ console.error(`Error reading file/directory ${filePath}: ${err}`);
+ return false;
+ }
+ });
+ } catch (err) {
+ console.error(`Error reading directory ${directoryPath}: ${err}`);
+ return false;
+ }
+ return true;
+}
+
+function modifyConfig(configDirectory) {
+
+}
+
+function runThatShit(contentDirectory) {
+ const sourceDirectory = contentDirectory;
+ const backupDirectory = contentDirectory + ".backup";
+ const targetDirectory = contentDirectory + ".temp";
+
+ // check directories
+ try {
+ fs.accessSync(sourceDirectory, fs.constants.W_OK | fs.constants.R_OK);
+ } catch (err) {
+ console.error(`No read/write permisson for directory ${sourceDirectory}: ${err}`);
+ return false;
+ }
+ /*
+ try {
+ fs.statSync(backupDirectory);
+ console.error(`Backup directory from last failed conversion still present ${backupDirectory}`);
+ return false;
+ } catch (err) {}
+ */
+
+ // Make space for the conversion
+ try {
+ fs.rmSync(targetDirectory, { recursive: true });
+ } catch (err) {
+ try {
+ fs.statSync(targetDirectory);
+ console.error(`Error removing directory ${targetDirectory}: ${err}`);
+ return false;
+ } catch (err) {}
+ }
+ try {
+ fs.rmSync(backupDirectory, { recursive: true });
+ } catch (err) {
+ try {
+ fs.statSync(backupDirectory);
+ console.error(`Error removing directory ${backupDirectory}: ${err}`);
+ return false;
+ } catch (err) {}
+ }
+
+ // convert that shit
+ const langs = getLanguages(sourceDirectory);
+ if( !processDirectory(sourceDirectory, sourceDirectory, targetDirectory, langs) ){
+ return false;
+ }
+
+ // move final result around
+ try {
+ fs.renameSync(sourceDirectory, backupDirectory);
+ fs.renameSync(targetDirectory, sourceDirectory);
+ fs.rmSync(backupDirectory, { recursive: true });
+ } catch (err) {
+ console.error(`Error deleting/renaming directories: ${err}`);
+ return false;
+ }
+
+ // edit the config file accordingly
+ modifyConfig(path.join(sourceDirectory, ".."));
+ return true;
+}
+
+const contentDirectory = path.join(__dirname, 'content');
+runThatShit(contentDirectory);