From 8b752480db720ab44dae670471c1e77af9341350 Mon Sep 17 00:00:00 2001 From: marhali Date: Tue, 1 Feb 2022 11:37:13 +0100 Subject: [PATCH] implement new folder strategies --- .../ionext/folder/FolderStrategy.java | 41 +++++++++++++++++ .../folder/ModularLocaleFolderStrategy.java | 42 ++++++++++++++++++ .../ModularNamespaceFolderStrategy.java | 42 ++++++++++++++++++ .../ionext/folder/SingleFolderStrategy.java | 37 ++++++++++++++++ .../easyi18n/model/TranslationFile.java | 44 +++++++++++++++++++ 5 files changed, 206 insertions(+) create mode 100644 src/main/java/de/marhali/easyi18n/ionext/folder/FolderStrategy.java create mode 100644 src/main/java/de/marhali/easyi18n/ionext/folder/ModularLocaleFolderStrategy.java create mode 100644 src/main/java/de/marhali/easyi18n/ionext/folder/ModularNamespaceFolderStrategy.java create mode 100644 src/main/java/de/marhali/easyi18n/ionext/folder/SingleFolderStrategy.java create mode 100644 src/main/java/de/marhali/easyi18n/model/TranslationFile.java diff --git a/src/main/java/de/marhali/easyi18n/ionext/folder/FolderStrategy.java b/src/main/java/de/marhali/easyi18n/ionext/folder/FolderStrategy.java new file mode 100644 index 0000000..c547a5e --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/ionext/folder/FolderStrategy.java @@ -0,0 +1,41 @@ +package de.marhali.easyi18n.ionext.folder; + +import com.intellij.openapi.vfs.VirtualFile; + +import de.marhali.easyi18n.model.SettingsState; +import de.marhali.easyi18n.model.TranslationFile; + +import org.apache.commons.io.FilenameUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Represents a specific translation file directory structure. + * @author marhali + */ +public abstract class FolderStrategy { + + protected final @NotNull SettingsState settings; + + public FolderStrategy(@NotNull SettingsState settings) { + this.settings = settings; + } + + /** + * Searches the translation folder for matching files based on the implementing strategy. + * The provided directory is already checked as a directory and can be used to query child items. + * @param localesDirectory Configured translation file directory + * @return translation files which matches the strategy + */ + public abstract List findFiles(@NotNull VirtualFile localesDirectory); + + /** + * Checks if the provided file is not a directory and matches the configured file pattern + * @param file File to check + * @return true if file matches and should be processed + */ + protected boolean isFileRelevant(@NotNull VirtualFile file) { + return !file.isDirectory() && FilenameUtils.wildcardMatch(file.getName(), this.settings.getFilePattern()); + } +} diff --git a/src/main/java/de/marhali/easyi18n/ionext/folder/ModularLocaleFolderStrategy.java b/src/main/java/de/marhali/easyi18n/ionext/folder/ModularLocaleFolderStrategy.java new file mode 100644 index 0000000..ba83b4c --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/ionext/folder/ModularLocaleFolderStrategy.java @@ -0,0 +1,42 @@ +package de.marhali.easyi18n.ionext.folder; + +import com.intellij.openapi.vfs.VirtualFile; + +import de.marhali.easyi18n.model.SettingsState; +import de.marhali.easyi18n.model.TranslationFile; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * Modularized translation folder strategy by locale. + * Directory => en dir => user.file / account.file + * @author marhali + */ +public class ModularLocaleFolderStrategy extends FolderStrategy { + + public ModularLocaleFolderStrategy(@NotNull SettingsState settings) { + super(settings); + } + + @Override + public List findFiles(@NotNull VirtualFile localesDirectory) { + List files = new ArrayList<>(); + + for(VirtualFile localeModuleDir : localesDirectory.getChildren()) { + if(localeModuleDir.isDirectory()) { + String locale = localeModuleDir.getNameWithoutExtension(); + + for(VirtualFile namespaceFile : localeModuleDir.getChildren()) { + if(super.isFileRelevant(namespaceFile)) { + files.add(new TranslationFile(namespaceFile, locale, namespaceFile.getNameWithoutExtension())); + } + } + } + } + + return files; + } +} diff --git a/src/main/java/de/marhali/easyi18n/ionext/folder/ModularNamespaceFolderStrategy.java b/src/main/java/de/marhali/easyi18n/ionext/folder/ModularNamespaceFolderStrategy.java new file mode 100644 index 0000000..bf9656d --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/ionext/folder/ModularNamespaceFolderStrategy.java @@ -0,0 +1,42 @@ +package de.marhali.easyi18n.ionext.folder; + +import com.intellij.openapi.vfs.VirtualFile; + +import de.marhali.easyi18n.model.SettingsState; +import de.marhali.easyi18n.model.TranslationFile; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * Modular translation folder strategy by namespace. + * Directory => user dir => en.file / de.file + * @author marhali + */ +public class ModularNamespaceFolderStrategy extends FolderStrategy { + + public ModularNamespaceFolderStrategy(@NotNull SettingsState settings) { + super(settings); + } + + @Override + public List findFiles(@NotNull VirtualFile localesDirectory) { + List files = new ArrayList<>(); + + for(VirtualFile namespaceModuleDir : localesDirectory.getChildren()) { + if(namespaceModuleDir.isDirectory()) { + String namespace = namespaceModuleDir.getNameWithoutExtension(); + + for(VirtualFile localeFile : namespaceModuleDir.getChildren()) { + if(super.isFileRelevant(localeFile)) { + files.add(new TranslationFile(localeFile, localeFile.getNameWithoutExtension(), namespace)); + } + } + } + } + + return files; + } +} diff --git a/src/main/java/de/marhali/easyi18n/ionext/folder/SingleFolderStrategy.java b/src/main/java/de/marhali/easyi18n/ionext/folder/SingleFolderStrategy.java new file mode 100644 index 0000000..81320f0 --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/ionext/folder/SingleFolderStrategy.java @@ -0,0 +1,37 @@ +package de.marhali.easyi18n.ionext.folder; + +import com.intellij.openapi.vfs.VirtualFile; + +import de.marhali.easyi18n.model.SettingsState; +import de.marhali.easyi18n.model.TranslationFile; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * Single directory translation folder strategy. + * Every child is recognized as a file for a specific language. + * Directory => en.file, de.file, fr.file + * @author marhali + */ +public class SingleFolderStrategy extends FolderStrategy { + + public SingleFolderStrategy(@NotNull SettingsState settings) { + super(settings); + } + + @Override + public List findFiles(@NotNull VirtualFile localesDirectory) { + List files = new ArrayList<>(); + + for(VirtualFile file : localesDirectory.getChildren()) { + if(super.isFileRelevant(file)) { + files.add(new TranslationFile(file, file.getNameWithoutExtension(), null)); + } + } + + return files; + } +} diff --git a/src/main/java/de/marhali/easyi18n/model/TranslationFile.java b/src/main/java/de/marhali/easyi18n/model/TranslationFile.java new file mode 100644 index 0000000..50f8cb4 --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/model/TranslationFile.java @@ -0,0 +1,44 @@ +package de.marhali.easyi18n.model; + +import com.intellij.openapi.vfs.VirtualFile; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Represents an existing translation file in a context a specific folder strategy. + * @author marhali + */ +public class TranslationFile { + + private final @NotNull VirtualFile virtualFile; + private final @NotNull String locale; + private final @Nullable String namespace; + + public TranslationFile(@NotNull VirtualFile virtualFile, @NotNull String locale, @Nullable String namespace) { + this.virtualFile = virtualFile; + this.locale = locale; + this.namespace = namespace; + } + + public @NotNull VirtualFile getVirtualFile() { + return virtualFile; + } + + public @NotNull String getLocale() { + return locale; + } + + public @Nullable String getNamespace() { + return namespace; + } + + @Override + public String toString() { + return "TranslationFile{" + + "virtualFile=" + virtualFile + + ", locale='" + locale + '\'' + + ", namespace='" + namespace + '\'' + + '}'; + } +}