diff --git a/README.md b/README.md
index 6b7afcd..c756c83 100644
--- a/README.md
+++ b/README.md
@@ -73,7 +73,7 @@ Adding a library api:
org.densy.polyglot
api
- 1.1.1-SNAPSHOT
+ 1.1.2-SNAPSHOT
```
@@ -82,7 +82,7 @@ Adding a library implementation:
org.densy.polyglot
core
- 1.1.1-SNAPSHOT
+ 1.1.2-SNAPSHOT
```
@@ -97,10 +97,10 @@ maven {
Adding a library api:
```groovy
-implementation "org.densy.polyglot:api:1.1.1-SNAPSHOT"
+implementation "org.densy.polyglot:api:1.1.2-SNAPSHOT"
```
Adding a library implementation:
```groovy
-implementation "org.densy.polyglot:core:1.1.1-SNAPSHOT"
+implementation "org.densy.polyglot:core:1.1.2-SNAPSHOT"
```
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index 569d8ae..f645f82 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -12,7 +12,7 @@ java {
allprojects {
group = "org.densy.polyglot"
- version = "1.1.1-SNAPSHOT"
+ version = "1.1.2-SNAPSHOT"
}
subprojects {
diff --git a/core/src/main/java/org/densy/polyglot/core/provider/PropertiesFileProvider.java b/core/src/main/java/org/densy/polyglot/core/provider/PropertiesFileProvider.java
new file mode 100644
index 0000000..7fe1236
--- /dev/null
+++ b/core/src/main/java/org/densy/polyglot/core/provider/PropertiesFileProvider.java
@@ -0,0 +1,97 @@
+package org.densy.polyglot.core.provider;
+
+import org.densy.polyglot.api.language.Language;
+import org.densy.polyglot.api.language.LanguageStandard;
+import org.densy.polyglot.api.provider.TranslationProvider;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * Properties file translation provider.
+ */
+public class PropertiesFileProvider implements TranslationProvider {
+ public static final Set ALLOWED_EXTENSIONS = Set.of("properties", "props", "ini", "cfg", "conf", "env", "lang", "txt");
+
+ private final File folder;
+ private final LanguageStandard languageStandard;
+ private final Map> translations;
+ private final Set allowedExtensions;
+
+ public PropertiesFileProvider(File folder, LanguageStandard languageStandard) {
+ this(folder, languageStandard, ALLOWED_EXTENSIONS);
+ }
+
+ public PropertiesFileProvider(File folder, LanguageStandard languageStandard, Set allowedExtensions) {
+ this.folder = folder;
+ this.languageStandard = languageStandard;
+ this.allowedExtensions = new HashSet<>(allowedExtensions);
+ this.translations = new HashMap<>();
+ this.loadTranslationsFromFolder();
+ }
+
+ private void loadTranslationsFromFolder() {
+ if (!folder.exists() || !folder.isDirectory()) {
+ return;
+ }
+
+ File[] propertiesFiles = folder.listFiles((dir, name) -> {
+ String lowerName = name.toLowerCase();
+ int dotIndex = lowerName.lastIndexOf('.');
+ if (dotIndex == -1) {
+ return false;
+ }
+ String extension = lowerName.substring(dotIndex + 1);
+ return allowedExtensions.contains(extension);
+ });
+
+ if (propertiesFiles == null) {
+ return;
+ }
+
+ for (File file : propertiesFiles) {
+ try {
+ String fileName = file.getName();
+ String languageString = fileName.substring(0, fileName.lastIndexOf('.'));
+
+ if (languageStandard.matches(languageString)) {
+ Language language = languageStandard.parseLanguage(languageString);
+ Properties properties = new Properties();
+
+ try (InputStreamReader reader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)) {
+ properties.load(reader);
+ }
+
+ Map translationMap = new HashMap<>();
+ for (String key : properties.stringPropertyNames()) {
+ translationMap.put(key, properties.getProperty(key));
+ }
+
+ this.translations.put(language, translationMap);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Error loading translation file: " + file.getName(), e);
+ } catch (Exception e) {
+ throw new RuntimeException("Error parsing translation file: " + file.getName(), e);
+ }
+ }
+ }
+
+ @Override
+ public Map> getTranslations() {
+ return new HashMap<>(translations);
+ }
+
+ @Override
+ public Set getSupportedLanguages() {
+ return new HashSet<>(translations.keySet());
+ }
+}
\ No newline at end of file