Implement localization framework

A comprehensive localization framework is introduced to the project,
transitioning from the use of hardcoded language constants in the
Settings class to a dynamic, locale-specific ResourceBundle approach.
The changes include:

- Creation of the Localizer class that is now injected through Guice to
provide dynamic language support based on user locale. This approach
leverages the ResourceBundle mechanism for localization.
- Addition of ResourceBundle property files for English (default),
organized by specific namespaces to facilitate easy expansion and
maintenance.
- Refactoring throughout the application to replace direct usage of
language-specific constants from the Settings class with calls to the
Localizer class. This shift enhances maintainability and flexibility in
language support.

Change-Id: Ibe343fe6d2fee8cd799ab2196df22c6940335cc2
Signed-off-by: Patrizio <patrizio.gelosi@amarulasolutions.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java
index 68e02d4..1a73e46 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java
@@ -4,6 +4,7 @@
 import com.google.inject.Provider;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
 import com.googlesource.gerrit.plugins.chatgpt.data.ChangeSetDataHandler;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClient;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClientReview;
@@ -32,6 +33,7 @@
     private final Provider<GerritClientReview> clientReviewProvider;
     @Getter
     private final IChatGptClient chatGptClient;
+    private final Localizer localizer;
 
     private GerritCommentRange gerritCommentRange;
     private List<ReviewBatch> reviewBatches;
@@ -44,12 +46,15 @@
             Configuration config,
             ChangeSetData changeSetData,
             Provider<GerritClientReview> clientReviewProvider,
-            IChatGptClient chatGptClient) {
+            IChatGptClient chatGptClient,
+            Localizer localizer
+    ) {
         this.config = config;
         this.gerritClient = gerritClient;
         this.changeSetData = changeSetData;
         this.clientReviewProvider = clientReviewProvider;
         this.chatGptClient = chatGptClient;
+        this.localizer = localizer;
     }
 
     public void review(GerritChange change) throws Exception {
@@ -62,7 +67,7 @@
             log.info("No file to review has been found in the PatchSet");
             return;
         }
-        ChangeSetDataHandler.update(config, change, gerritClient, changeSetData);
+        ChangeSetDataHandler.update(config, change, gerritClient, changeSetData, localizer);
 
         if (changeSetData.getReviewSystemMessage() == null) {
             ChatGptResponseContent reviewReply = getReviewReply(change, patchSet);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/config/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/config/Configuration.java
index 2b8a5ae..f4dbd60 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/config/Configuration.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/config/Configuration.java
@@ -262,6 +262,10 @@
         return getDouble(KEY_FILTER_COMMENTS_RELEVANCE_THRESHOLD, DEFAULT_FILTER_COMMENTS_RELEVANCE_THRESHOLD);
     }
 
+    public Locale getLocaleDefault() {
+        return Locale.getDefault();
+    }
+
     public int getVotingMinScore() {
         return getInt(KEY_VOTING_MIN_SCORE, DEFAULT_VOTING_MIN_SCORE);
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java
index 8ae9ac8..878202f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java
@@ -1,6 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.data;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClient;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt.ChatGptUserPrompt;
@@ -17,10 +18,16 @@
             Configuration config,
             GerritChange change,
             GerritClient gerritClient,
-            ChangeSetData changeSetData
+            ChangeSetData changeSetData,
+            Localizer localizer
     ) {
         GerritClientData gerritClientData = gerritClient.getClientData(change);
-        ChatGptUserPrompt chatGptUserPrompt = new ChatGptUserPrompt(config, changeSetData, change, gerritClientData);
+        ChatGptUserPrompt chatGptUserPrompt = new ChatGptUserPrompt(
+                config,
+                changeSetData,
+                change,
+                gerritClientData,
+                localizer);
 
         changeSetData.setCommentPropertiesSize(gerritClientData.getCommentProperties().size());
         changeSetData.setDirectives(new HashSet<>());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/localization/Localizer.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/localization/Localizer.java
new file mode 100644
index 0000000..dcf068b
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/localization/Localizer.java
@@ -0,0 +1,21 @@
+package com.googlesource.gerrit.plugins.chatgpt.localization;
+
+import com.google.inject.Inject;
+import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ResourceBundle;
+
+@Slf4j
+public class Localizer {
+    private final ResourceBundle resourceBundle;
+
+    @Inject
+    public Localizer(Configuration config) {
+        this.resourceBundle = ResourceBundle.getBundle("localization.localTexts", config.getLocaleDefault());
+    }
+
+    public String getText(String key) {
+        return resourceBundle.getString(key);
+    }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientComments.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientComments.java
index e67a3d8..f9cc867 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientComments.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientComments.java
@@ -7,6 +7,7 @@
 import com.google.gerrit.server.util.ManualRequestContext;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.messages.ClientMessage;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritCodeRange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritComment;
@@ -31,6 +32,7 @@
     private final ChangeSetData changeSetData;
     private final HashMap<String, GerritComment> commentMap;
     private final HashMap<String, GerritComment> patchSetCommentMap;
+    private final Localizer localizer;
 
     private String authorUsername;
     @Getter
@@ -38,9 +40,15 @@
 
     @VisibleForTesting
     @Inject
-    public GerritClientComments(Configuration config, AccountCache accountCache, ChangeSetData changeSetData) {
+    public GerritClientComments(
+            Configuration config,
+            AccountCache accountCache,
+            ChangeSetData changeSetData,
+            Localizer localizer
+    ) {
         super(config, accountCache);
         this.changeSetData = changeSetData;
+        this.localizer = localizer;
         commentProperties = new ArrayList<>();
         commentMap = new HashMap<>();
         patchSetCommentMap = new HashMap<>();
@@ -137,7 +145,7 @@
     }
 
     private void addLastComments(GerritChange change) {
-        ClientMessage clientMessage = new ClientMessage(config, changeSetData);
+        ClientMessage clientMessage = new ClientMessage(config, changeSetData, localizer);
         try {
             List<GerritComment> latestComments = retrieveComments(change);
             if (latestComments == null) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientReview.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientReview.java
index 9278064..c9f9470 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientReview.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientReview.java
@@ -11,6 +11,7 @@
 import com.google.gerrit.server.util.ManualRequestContext;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.review.ReviewBatch;
 import lombok.extern.slf4j.Slf4j;
@@ -22,15 +23,16 @@
 import java.util.Optional;
 
 import static com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt.MessageSanitizer.sanitizeChatGptMessage;
-import static com.googlesource.gerrit.plugins.chatgpt.settings.Settings.EMPTY_REVIEW_MESSAGE;
-import static com.googlesource.gerrit.plugins.chatgpt.settings.Settings.SYSTEM_MESSAGE_PREFIX;
 
 @Slf4j
 public class GerritClientReview extends GerritClientAccount {
+    private final Localizer localizer;
+
     @VisibleForTesting
     @Inject
-    public GerritClientReview(Configuration config, AccountCache accountCache) {
+    public GerritClientReview(Configuration config, AccountCache accountCache, Localizer localizer) {
         super(config, accountCache);
+        this.localizer = localizer;
     }
 
     public void setReview(
@@ -71,7 +73,7 @@
     private ReviewInput buildReview(List<ReviewBatch> reviewBatches, ChangeSetData changeSetData, Integer reviewScore) {
         ReviewInput reviewInput = ReviewInput.create();
         Map<String, List<CommentInput>> comments = new HashMap<>();
-        String systemMessage = EMPTY_REVIEW_MESSAGE;
+        String systemMessage = localizer.getText("message.empty.review");
         if (changeSetData.getReviewSystemMessage() != null) {
             systemMessage = changeSetData.getReviewSystemMessage();
         }
@@ -82,7 +84,7 @@
             }
         }
         if (comments.isEmpty()) {
-            reviewInput.message(SYSTEM_MESSAGE_PREFIX + systemMessage);
+            reviewInput.message(localizer.getText("system.message.prefix") + ' ' + systemMessage);
         }
         else {
             reviewInput.comments = comments;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/commands/ClientCommands.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/commands/ClientCommands.java
index e77decd..adf1f04 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/commands/ClientCommands.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/commands/ClientCommands.java
@@ -1,6 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.commands;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.ClientBase;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt.Directives;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
@@ -13,8 +14,6 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import static com.googlesource.gerrit.plugins.chatgpt.settings.Settings.MESSAGE_DEBUGGING_FUNCTIONALITIES_DISABLED;
-
 @Slf4j
 @Getter
 public class ClientCommands extends ClientBase {
@@ -51,11 +50,14 @@
     private final ChangeSetData changeSetData;
     @Getter
     private final Directives directives;
+    private final Localizer localizer;
+
     @Getter
     private boolean containingHistoryCommand;
 
-    public ClientCommands(Configuration config, ChangeSetData changeSetData) {
+    public ClientCommands(Configuration config, ChangeSetData changeSetData, Localizer localizer) {
         super(config);
+        this.localizer = localizer;
         this.changeSetData = changeSetData;
         directives = new Directives(changeSetData);
         containingHistoryCommand = false;
@@ -123,7 +125,9 @@
                             changeSetData.setReplyFilterEnabled(false);
                         }
                         else {
-                            changeSetData.setReviewSystemMessage(MESSAGE_DEBUGGING_FUNCTIONALITIES_DISABLED);
+                            changeSetData.setReviewSystemMessage(localizer.getText(
+                                    "message.debugging.functionalities.disabled"
+                            ));
                             log.debug("Unable to set Response Mode to Debug: `enableMessageDebugging` config must be " +
                                     "set to true");
                         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/messages/ClientMessage.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/messages/ClientMessage.java
index 749564f..6370782 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/messages/ClientMessage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/messages/ClientMessage.java
@@ -1,6 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.messages;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.ClientBase;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.commands.ClientCommands;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
@@ -21,14 +22,14 @@
     @Getter
     private String message;
 
-    public ClientMessage(Configuration config, ChangeSetData changeSetData) {
+    public ClientMessage(Configuration config, ChangeSetData changeSetData, Localizer localizer) {
         super(config);
         botMentionPattern = getBotMentionPattern();
-        clientCommands = new ClientCommands(config, changeSetData);
+        clientCommands = new ClientCommands(config, changeSetData, localizer);
     }
 
-    public ClientMessage(Configuration config, ChangeSetData changeSetData, String message) {
-        this(config, changeSetData);
+    public ClientMessage(Configuration config, ChangeSetData changeSetData, String message, Localizer localizer) {
+        this(config, changeSetData, localizer);
         this.message = message;
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptComment.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptComment.java
index 36253c2..7b9460a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptComment.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptComment.java
@@ -1,6 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.ClientBase;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.messages.ClientMessage;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritComment;
@@ -12,14 +13,16 @@
     protected ClientMessage commentMessage;
 
     private final ChangeSetData changeSetData;
+    private final Localizer localizer;
 
-    public ChatGptComment(Configuration config, ChangeSetData changeSetData) {
+    public ChatGptComment(Configuration config, ChangeSetData changeSetData, Localizer localizer) {
         super(config);
         this.changeSetData = changeSetData;
+        this.localizer = localizer;
     }
 
     protected String getCleanedMessage(GerritComment commentProperty) {
-        commentMessage = new ClientMessage(config, changeSetData, commentProperty.getMessage());
+        commentMessage = new ClientMessage(config, changeSetData, commentProperty.getMessage(), localizer);
         if (isFromAssistant(commentProperty)) {
             commentMessage.removeDebugMessages();
         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java
index f0624d5..1eb2771 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java
@@ -1,6 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptRequestMessage;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritComment;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
@@ -17,11 +18,8 @@
 public class ChatGptHistory extends ChatGptComment {
     private static final String ROLE_USER = "user";
     private static final String ROLE_ASSISTANT = "assistant";
-    private static final Set<String> MESSAGES_EXCLUDED_FROM_HISTORY = new HashSet<>() {{
-        add(Settings.GERRIT_DEFAULT_MESSAGE_DONE);
-        add(Settings.EMPTY_REVIEW_MESSAGE);
-    }};
 
+    private final Set<String> messagesExcludedFromHistory;
     private final HashMap<String, GerritComment> commentMap;
     private final HashMap<String, GerritComment> patchSetCommentMap;
     private final Set<String> patchSetCommentAdded;
@@ -30,9 +28,18 @@
 
     private boolean filterActive;
 
-    public ChatGptHistory(Configuration config, ChangeSetData changeSetData, GerritClientData gerritClientData) {
-        super(config, changeSetData);
+    public ChatGptHistory(
+            Configuration config,
+            ChangeSetData changeSetData,
+            GerritClientData gerritClientData,
+            Localizer localizer
+    ) {
+        super(config, changeSetData, localizer);
         CommentData commentData = gerritClientData.getCommentData();
+        messagesExcludedFromHistory = Set.of(
+            Settings.GERRIT_DEFAULT_MESSAGE_DONE,
+            localizer.getText("message.empty.review")
+        );
         commentMap = commentData.getCommentMap();
         patchSetCommentMap = commentData.getPatchSetCommentMap();
         patchSetComments = retrievePatchSetComments(gerritClientData);
@@ -123,7 +130,7 @@
     private void addMessageToHistory(List<ChatGptRequestMessage> messageHistory, GerritComment comment) {
         String messageContent = getCleanedMessage(comment);
         boolean shouldNotProcessComment = messageContent.isEmpty() ||
-                MESSAGES_EXCLUDED_FROM_HISTORY.contains(messageContent) ||
+                messagesExcludedFromHistory.contains(messageContent) ||
                 patchSetCommentAdded.contains(messageContent) ||
                 filterActive && isInactiveComment(comment);
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPrompt.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPrompt.java
index 8b7a788..0aa539a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPrompt.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPrompt.java
@@ -1,6 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptMessageItem;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
@@ -15,12 +16,18 @@
 public class ChatGptUserPrompt {
     private final ChatGptUserPromptBase chatGptUserPromptBase;
 
-    public ChatGptUserPrompt(Configuration config, ChangeSetData changeSetData, GerritChange change, GerritClientData gerritClientData) {
+    public ChatGptUserPrompt(
+            Configuration config,
+            ChangeSetData changeSetData,
+            GerritChange change,
+            GerritClientData gerritClientData,
+            Localizer localizer
+    ) {
         if (change.getIsCommentEvent()) {
-            chatGptUserPromptBase = new ChatGptUserPromptRequests(config, changeSetData, gerritClientData);
+            chatGptUserPromptBase = new ChatGptUserPromptRequests(config, changeSetData, gerritClientData, localizer);
         }
         else {
-            chatGptUserPromptBase = new ChatGptUserPromptReview(config, changeSetData, gerritClientData);
+            chatGptUserPromptBase = new ChatGptUserPromptReview(config, changeSetData, gerritClientData, localizer);
         }
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java
index bd3b8e2..1a2c8d5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java
@@ -1,6 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.patch.code.InlineCode;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.patch.diff.FileDiffProcessed;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptMessageItem;
@@ -28,11 +29,16 @@
     @Getter
     protected List<GerritComment> commentProperties;
 
-    public ChatGptUserPromptBase(Configuration config, ChangeSetData changeSetData, GerritClientData gerritClientData) {
+    public ChatGptUserPromptBase(
+            Configuration config,
+            ChangeSetData changeSetData,
+            GerritClientData gerritClientData,
+            Localizer localizer
+    ) {
         this.gerritClientData = gerritClientData;
         fileDiffsProcessed = gerritClientData.getFileDiffsProcessed();
         commentData = gerritClientData.getCommentData();
-        gptMessageHistory = new ChatGptHistory(config, changeSetData, gerritClientData);
+        gptMessageHistory = new ChatGptHistory(config, changeSetData, gerritClientData, localizer);
         messageItems = new ArrayList<>();
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java
index 0c23bbd..9316bc5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java
@@ -1,6 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptMessageItem;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptRequestMessage;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
@@ -14,9 +15,10 @@
     public ChatGptUserPromptRequests(
             Configuration config,
             ChangeSetData changeSetData,
-            GerritClientData gerritClientData
+            GerritClientData gerritClientData,
+            Localizer localizer
     ) {
-        super(config, changeSetData, gerritClientData);
+        super(config, changeSetData, gerritClientData, localizer);
         commentProperties = commentData.getCommentProperties();
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java
index c65b4a9..006fac9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java
@@ -1,6 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptMessageItem;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptRequestMessage;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
@@ -15,9 +16,10 @@
     public ChatGptUserPromptReview(
             Configuration config,
             ChangeSetData changeSetData,
-            GerritClientData gerritClientData
+            GerritClientData gerritClientData,
+            Localizer localizer
     ) {
-        super(config, changeSetData, gerritClientData);
+        super(config, changeSetData, gerritClientData, localizer);
         commentProperties = new ArrayList<>(commentData.getCommentMap().values());
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/settings/Settings.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/settings/Settings.java
index 3705e01..9e74d10 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/settings/Settings.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/settings/Settings.java
@@ -16,11 +16,6 @@
     );
     public static final String GERRIT_COMMIT_MESSAGE_PREFIX = "Subject: ";
 
-    public static final String SYSTEM_MESSAGE_PREFIX = "SYSTEM MESSAGE: ";
-    public static final String EMPTY_REVIEW_MESSAGE = "No update to show for this Change Set";
-    public static final String MESSAGE_DEBUGGING_FUNCTIONALITIES_DISABLED = "Message Debugging functionalities are " +
-            "disabled";
-
     public enum MODES {
         stateless,
         stateful
diff --git a/src/main/resources/localization/localTexts.properties b/src/main/resources/localization/localTexts.properties
new file mode 100644
index 0000000..512f858
--- /dev/null
+++ b/src/main/resources/localization/localTexts.properties
@@ -0,0 +1,3 @@
+system.message.prefix=SYSTEM MESSAGE:
+message.empty.review=No update to show for this Change Set
+message.debugging.functionalities.disabled=Message Debugging functionalities are disabled
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
index fb1859f..fd316e0 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
@@ -36,6 +36,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.listener.GerritEventContextModule;
 import com.google.inject.TypeLiteral;
 import com.google.inject.util.Providers;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClient;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClientComments;
@@ -298,21 +299,28 @@
     }
 
     private void initTest() {
-        ChangeSetData changeSetData = new ChangeSetData(GPT_USER_ACCOUNT_ID, config.getVotingMinScore(), config.getMaxReviewFileSize());
+        ChangeSetData changeSetData = new ChangeSetData(
+                GPT_USER_ACCOUNT_ID,
+                config.getVotingMinScore(),
+                config.getMaxReviewFileSize()
+        );
+        Localizer localizer = new Localizer(config);
         gerritClient =
             new GerritClient(
                 new GerritClientFacade(
                     config,
                     changeSetData,
-                    new GerritClientComments(config, accountCacheMock, changeSetData),
+                    new GerritClientComments(config, accountCacheMock, changeSetData, localizer),
                     getGerritClientPatchSet()));
         patchSetReviewer =
             new PatchSetReviewer(
                 gerritClient,
                 config,
                 changeSetData,
-                Providers.of(new GerritClientReview(config, accountCacheMock)),
-                getChatGptClient());
+                Providers.of(new GerritClientReview(config, accountCacheMock, localizer)),
+                getChatGptClient(),
+                localizer
+            );
         mockConfigCreator = mock(ConfigCreator.class);
     }
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java
index e814f64..2f4c452 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java
@@ -2,6 +2,7 @@
 
 import com.google.gerrit.server.account.AccountCache;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClient;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClientReview;
@@ -67,13 +68,14 @@
     @Test
     public void setReview() throws Exception {
         ChangeSetData changeSetData = new ChangeSetData(1, config.getVotingMinScore(), config.getMaxReviewFileSize());
+        Localizer localizer = new Localizer(config);
         when(config.getGerritUserName()).thenReturn("Your Gerrit username");
 
         List<ReviewBatch> reviewBatches = new ArrayList<>();
         reviewBatches.add(new ReviewBatch());
         reviewBatches.get(0).setContent("message");
 
-        GerritClientReview gerritClientReview = new GerritClientReview(config, accountCache);
+        GerritClientReview gerritClientReview = new GerritClientReview(config, accountCache, localizer);
         gerritClientReview.setReview(new GerritChange("Your changeId"), reviewBatches, changeSetData);
     }
 }