From d318bf01bd3d1eafcb20caa36bc9f4dc2429a7cb Mon Sep 17 00:00:00 2001 From: Kristyna Fuchsova <492905@fi.muni.cz> Date: Mon, 31 Jan 2022 01:47:22 +0100 Subject: [PATCH] adds straightforward localization --- .../pv168/project/data/category/Category.java | 1 + .../fi/pv168/project/data/task/TaskStatus.java | 1 + .../model/CategoryStatisticsTableModel.java | 7 +++++-- .../project/model/db/AbstractDataModel.java | 9 ++++++--- .../fi/pv168/project/model/db/TaskModel.java | 5 ++++- .../project/model/db/UpdatableDataModel.java | 5 ++++- .../fi/pv168/project/ui/action/AddAction.java | 7 +++++-- .../pv168/project/ui/action/DeleteAction.java | 7 +++++-- .../fi/pv168/project/ui/action/EditAction.java | 6 ++++-- .../project/ui/action/task/GoToAction.java | 4 +++- .../ui/action/task/ToggleCompletionAction.java | 5 ++++- .../ui/dialog/AbstractEntityDialog.java | 9 ++++++--- .../project/ui/dialog/CategoryDialog.java | 7 +++++-- .../project/ui/dialog/ComboBoxDialog.java | 4 +++- .../pv168/project/ui/dialog/SubTaskDialog.java | 5 ++++- .../fi/pv168/project/ui/dialog/TaskDialog.java | 13 ++++++++----- .../project/ui/dialog/error/ErrorDialog.java | 4 +++- .../project/ui/main/panel/WelcomePanel.java | 10 +++++----- .../panel/listholder/CategoryHolderPanel.java | 11 +++++++---- .../listholder/DependencyHolderPanel.java | 11 +++++++---- .../panel/listholder/SubTaskHolderPanel.java | 13 ++++++++----- .../toolbar/CategoriesStatisticsToolBar.java | 7 +++++-- .../project/ui/main/toolbar/TasksToolBar.java | 7 +++++-- .../main/view/CategoryAndStatisticsView.java | 12 ++++++++---- .../pv168/project/ui/main/view/TaskView.java | 18 +++++++++++------- .../ui/renderer/list/TaskListRenderer.java | 9 +++++++-- .../fi/pv168/project/model/db/i18n.properties | 7 +++++++ .../pv168/project/model/db/i18n_cs.properties | 7 +++++++ .../fi/pv168/project/model/i18n.properties | 2 ++ .../fi/pv168/project/model/i18n_cs.properties | 2 ++ .../fi/pv168/project/ui/action/i18n.properties | 6 ++++++ .../pv168/project/ui/action/i18n_cs.properties | 6 ++++++ .../project/ui/action/task/i18n.properties | 3 +++ .../project/ui/action/task/i18n_cs.properties | 3 +++ .../project/ui/dialog/error/i18n.properties | 1 + .../project/ui/dialog/error/i18n_cs.properties | 1 + .../fi/pv168/project/ui/dialog/i18n.properties | 16 ++++++++++++++++ .../pv168/project/ui/dialog/i18n_cs.properties | 16 ++++++++++++++++ .../project/ui/main/panel/i18n.properties | 4 ++++ .../project/ui/main/panel/i18n_cs.properties | 4 ++++ .../ui/main/panel/listholder/i18n.properties | 15 +++++++++++++++ .../main/panel/listholder/i18n_cs.properties | 15 +++++++++++++++ .../project/ui/main/toolbar/i18n.properties | 5 +++++ .../project/ui/main/toolbar/i18n_cs.properties | 5 +++++ .../pv168/project/ui/main/view/i18n.properties | 14 ++++++++++++++ .../project/ui/main/view/i18n_cs.properties | 13 +++++++++++++ .../project/ui/renderer/list/i18n.properties | 2 ++ .../ui/renderer/list/i18n_cs.properties | 2 ++ 48 files changed, 283 insertions(+), 63 deletions(-) create mode 100644 src/main/resources/cz/muni/fi/pv168/project/model/db/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/model/db/i18n_cs.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/model/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/model/i18n_cs.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/action/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/action/i18n_cs.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/action/task/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/action/task/i18n_cs.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/dialog/error/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/dialog/error/i18n_cs.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/dialog/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/dialog/i18n_cs.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/i18n_cs.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/listholder/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/listholder/i18n_cs.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/main/toolbar/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/main/toolbar/i18n_cs.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/main/view/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/main/view/i18n_cs.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/renderer/list/i18n.properties create mode 100644 src/main/resources/cz/muni/fi/pv168/project/ui/renderer/list/i18n_cs.properties diff --git a/src/main/java/cz/muni/fi/pv168/project/data/category/Category.java b/src/main/java/cz/muni/fi/pv168/project/data/category/Category.java index 525daa8e..62935b66 100644 --- a/src/main/java/cz/muni/fi/pv168/project/data/category/Category.java +++ b/src/main/java/cz/muni/fi/pv168/project/data/category/Category.java @@ -79,6 +79,7 @@ public class Category implements Identifiable { timeSpents.removeIf(categoryTime -> categoryTime.getTaskId().equals(taskId)); } + //TODO: add support for language structures in localization private PeriodFormatter createFormatter() { return new PeriodFormatterBuilder() .appendDays() diff --git a/src/main/java/cz/muni/fi/pv168/project/data/task/TaskStatus.java b/src/main/java/cz/muni/fi/pv168/project/data/task/TaskStatus.java index 31afb954..9e3b0fcf 100644 --- a/src/main/java/cz/muni/fi/pv168/project/data/task/TaskStatus.java +++ b/src/main/java/cz/muni/fi/pv168/project/data/task/TaskStatus.java @@ -11,6 +11,7 @@ public enum TaskStatus { @Override public String toString() { String value = this.name().replace("_", " "); + //TODO: solve hardcoded locale of root return value.charAt(0) + value.substring(1).toLowerCase(Locale.ROOT); } diff --git a/src/main/java/cz/muni/fi/pv168/project/model/CategoryStatisticsTableModel.java b/src/main/java/cz/muni/fi/pv168/project/model/CategoryStatisticsTableModel.java index 12f87f08..3c325bad 100644 --- a/src/main/java/cz/muni/fi/pv168/project/model/CategoryStatisticsTableModel.java +++ b/src/main/java/cz/muni/fi/pv168/project/model/CategoryStatisticsTableModel.java @@ -1,6 +1,7 @@ package cz.muni.fi.pv168.project.model; import cz.muni.fi.pv168.project.data.category.Category; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import javax.swing.ListModel; import javax.swing.event.ListDataEvent; @@ -13,6 +14,8 @@ public class CategoryStatisticsTableModel extends AbstractTableModel implements private LocalDate fromDate; private LocalDate toDate; + private static final I18N I18N = new I18N(CategoryStatisticsTableModel.class); + public CategoryStatisticsTableModel(ListModel<Category> model) { fromDate = LocalDate.now(); toDate = LocalDate.now(); @@ -48,9 +51,9 @@ public class CategoryStatisticsTableModel extends AbstractTableModel implements public String getColumnName(int columnIndex) { switch (columnIndex) { case 0: - return "Category name"; + return I18N.getString("columnNameTitle"); case 1: - return "Time spent"; + return I18N.getString("columnTimeTitle"); default: throw new IndexOutOfBoundsException("Invalid column index: " + columnIndex); } diff --git a/src/main/java/cz/muni/fi/pv168/project/model/db/AbstractDataModel.java b/src/main/java/cz/muni/fi/pv168/project/model/db/AbstractDataModel.java index fc8e0fd0..36aeaabc 100644 --- a/src/main/java/cz/muni/fi/pv168/project/model/db/AbstractDataModel.java +++ b/src/main/java/cz/muni/fi/pv168/project/model/db/AbstractDataModel.java @@ -2,18 +2,21 @@ package cz.muni.fi.pv168.project.model.db; import cz.muni.fi.pv168.project.model.EditableModel; import cz.muni.fi.pv168.project.ui.dialog.error.ErrorDialog; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import javax.swing.DefaultListModel; public abstract class AbstractDataModel<E> extends DefaultListModel<E> implements EditableModel<E> { + private static final I18N I18N = new I18N(AbstractDataModel.class); + @Override public void setElementAt(E element, int index) { try { update(element); } catch (Exception e) { e.printStackTrace(); - ErrorDialog.show("Error when editing " + element, e); + ErrorDialog.show(I18N.getString("editingEntError") + " " + element, e); } super.setElementAt(element, index); } @@ -24,7 +27,7 @@ public abstract class AbstractDataModel<E> extends DefaultListModel<E> implement add(element); } catch (Exception e) { e.printStackTrace(); - ErrorDialog.show("Error when adding " + element, e); + ErrorDialog.show(I18N.getString("addingEntError") + " " + element, e); } super.addElement(element); @@ -37,7 +40,7 @@ public abstract class AbstractDataModel<E> extends DefaultListModel<E> implement delete((E) obj); } catch (Exception e) { e.printStackTrace(); - ErrorDialog.show("Error when removing " + obj, e); + ErrorDialog.show(I18N.getString("deletingEntError") + " " + obj, e); } return super.removeElement(obj); } diff --git a/src/main/java/cz/muni/fi/pv168/project/model/db/TaskModel.java b/src/main/java/cz/muni/fi/pv168/project/model/db/TaskModel.java index 13a8842d..8e6ed12e 100644 --- a/src/main/java/cz/muni/fi/pv168/project/model/db/TaskModel.java +++ b/src/main/java/cz/muni/fi/pv168/project/model/db/TaskModel.java @@ -4,12 +4,15 @@ import cz.muni.fi.pv168.project.data.task.Task; import cz.muni.fi.pv168.project.db.DataAccessException; import cz.muni.fi.pv168.project.db.interfaces.DataAccessObject; import cz.muni.fi.pv168.project.ui.dialog.error.ErrorDialog; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import java.util.ArrayList; import java.util.function.Predicate; public class TaskModel extends UpdatableDataModel<Task> { + private static final I18N I18N = new I18N(TaskModel.class); + public TaskModel(DataAccessObject<Task> dao) { super(dao); } @@ -26,7 +29,7 @@ public class TaskModel extends UpdatableDataModel<Task> { addAll(tasks); } catch (DataAccessException e) { e.printStackTrace(); - ErrorDialog.show("Error when querying all elements.", e); + ErrorDialog.show(I18N.getString("queryAllError"), e); } } } diff --git a/src/main/java/cz/muni/fi/pv168/project/model/db/UpdatableDataModel.java b/src/main/java/cz/muni/fi/pv168/project/model/db/UpdatableDataModel.java index 781a685a..37574542 100644 --- a/src/main/java/cz/muni/fi/pv168/project/model/db/UpdatableDataModel.java +++ b/src/main/java/cz/muni/fi/pv168/project/model/db/UpdatableDataModel.java @@ -2,11 +2,14 @@ package cz.muni.fi.pv168.project.model.db; import cz.muni.fi.pv168.project.db.interfaces.DataAccessObject; import cz.muni.fi.pv168.project.ui.dialog.error.ErrorDialog; +import cz.muni.fi.pv168.project.ui.i18n.I18N; public class UpdatableDataModel<E> extends AbstractDataModel<E> { protected final DataAccessObject<E> dataAccessObject; + private static final I18N I18N = new I18N(UpdatableDataModel.class); + public UpdatableDataModel(DataAccessObject<E> dao) { this.dataAccessObject = dao; updateAll(); @@ -33,7 +36,7 @@ public class UpdatableDataModel<E> extends AbstractDataModel<E> { addAll(dataAccessObject.getAll()); } catch (Exception e) { e.printStackTrace(); - ErrorDialog.show("Error when querying all elements.", e); + ErrorDialog.show(I18N.getString("queryAllError"), e); } } } diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/action/AddAction.java b/src/main/java/cz/muni/fi/pv168/project/ui/action/AddAction.java index b0920eb2..65839010 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/action/AddAction.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/action/AddAction.java @@ -1,5 +1,6 @@ package cz.muni.fi.pv168.project.ui.action; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.main.tab.ListHolder; import javax.swing.Icon; @@ -9,10 +10,12 @@ import java.awt.event.KeyEvent; public final class AddAction<T> extends AbstractAction<T> { + private static final I18N I18N = new I18N(AddAction.class); + public AddAction(ListHolder<T> listHolder, Icon icon, String description) { super(listHolder, selectedRowsCount -> true); - putValue(NAME, "Add"); + putValue(NAME, I18N.getString("addAction")); putValue(SMALL_ICON, icon); putValue(SHORT_DESCRIPTION, description); putValue(MNEMONIC_KEY, KeyEvent.VK_A); @@ -23,7 +26,7 @@ public final class AddAction<T> extends AbstractAction<T> { public void actionPerformed(ActionEvent e) { var maybeResult = getDialogFactory() .newAddDialog() - .show("Add"); + .show(I18N.getString("addAction")); maybeResult.ifPresent(t -> { listHolder.getModel().addElement(t); diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/action/DeleteAction.java b/src/main/java/cz/muni/fi/pv168/project/ui/action/DeleteAction.java index 7a398f96..2f99853f 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/action/DeleteAction.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/action/DeleteAction.java @@ -1,5 +1,6 @@ package cz.muni.fi.pv168.project.ui.action; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.main.tab.ListHolder; import javax.swing.Icon; @@ -12,10 +13,12 @@ import java.util.List; public final class DeleteAction<T> extends AbstractAction<T> { + private static final I18N I18N = new I18N(DeleteAction.class); + public DeleteAction(ListHolder<T> listHolder, Icon icon, String description) { super(listHolder, selectedRowsCount -> selectedRowsCount >= 1); - putValue(NAME, "Delete"); + putValue(NAME, I18N.getString("deleteAction")); putValue(SMALL_ICON, icon); putValue(SHORT_DESCRIPTION, description); putValue(MNEMONIC_KEY, KeyEvent.VK_D); @@ -24,7 +27,7 @@ public final class DeleteAction<T> extends AbstractAction<T> { @Override public void actionPerformed(ActionEvent e) { - int result = JOptionPane.showConfirmDialog(listHolder.getList(), "Are you sure you want to delete?"); + int result = JOptionPane.showConfirmDialog(listHolder.getList(), I18N.getString("confirmation")); if (result != JOptionPane.OK_OPTION) { return; } diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/action/EditAction.java b/src/main/java/cz/muni/fi/pv168/project/ui/action/EditAction.java index f58f080d..f4c83818 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/action/EditAction.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/action/EditAction.java @@ -1,6 +1,7 @@ package cz.muni.fi.pv168.project.ui.action; import cz.muni.fi.pv168.project.data.task.Task; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.main.tab.ListHolder; import org.jetbrains.annotations.Nullable; @@ -13,10 +14,11 @@ import java.util.function.Supplier; public final class EditAction<T> extends AbstractAction<T> { + private static final cz.muni.fi.pv168.project.ui.i18n.I18N I18N = new I18N(EditAction.class); public EditAction(ListHolder<T> listHolder, Icon icon, String description, @Nullable Supplier<Task> taskSupplier) { super(listHolder, selectedRowsCount -> selectedRowsCount == 1, taskSupplier); - putValue(NAME, "Edit"); + putValue(NAME, I18N.getString("editAction")); putValue(SMALL_ICON, icon); putValue(SHORT_DESCRIPTION, description); putValue(MNEMONIC_KEY, KeyEvent.VK_E); @@ -38,7 +40,7 @@ public final class EditAction<T> extends AbstractAction<T> { var maybeResult = getDialogFactory() .newEditDialog(list.getSelectedValue()) - .show("Edit"); + .show(I18N.getString("editAction")); maybeResult.ifPresent(t -> { listHolder.getModel().setElementAt(t, listHolder.getModel().indexOf(t)); diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/action/task/GoToAction.java b/src/main/java/cz/muni/fi/pv168/project/ui/action/task/GoToAction.java index 38779db5..5d76b37f 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/action/task/GoToAction.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/action/task/GoToAction.java @@ -2,6 +2,7 @@ package cz.muni.fi.pv168.project.ui.action.task; import cz.muni.fi.pv168.project.data.task.Task; import cz.muni.fi.pv168.project.ui.action.AbstractAction; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.main.tab.ListHolder; import javax.swing.JList; @@ -13,12 +14,13 @@ import java.util.List; public final class GoToAction extends AbstractAction<Task> { private final JList<Task> destinationList; + private static final I18N I18N = new I18N(GoToAction.class); public GoToAction(ListHolder<Task> sourceListHolder, JList<Task> destinationList, String description) { super(sourceListHolder, selectedRowsCount -> selectedRowsCount == 1); this.destinationList = destinationList; - putValue(NAME, "Go to task"); + putValue(NAME, I18N.getString("goTo")); putValue(SHORT_DESCRIPTION, description); putValue(MNEMONIC_KEY, KeyEvent.VK_G); putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl G")); diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/action/task/ToggleCompletionAction.java b/src/main/java/cz/muni/fi/pv168/project/ui/action/task/ToggleCompletionAction.java index 0a6fe08b..22ebb3fc 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/action/task/ToggleCompletionAction.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/action/task/ToggleCompletionAction.java @@ -3,6 +3,7 @@ package cz.muni.fi.pv168.project.ui.action.task; import cz.muni.fi.pv168.project.data.task.ITask; import cz.muni.fi.pv168.project.data.task.Task; import cz.muni.fi.pv168.project.ui.action.AbstractAction; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.main.tab.ListHolder; import org.jetbrains.annotations.Nullable; @@ -14,10 +15,12 @@ import java.util.function.Supplier; public class ToggleCompletionAction<T extends ITask> extends AbstractAction<T> { + private static final I18N I18N = new I18N(ToggleCompletionAction.class); + public ToggleCompletionAction(ListHolder<T> listHolder, String description, @Nullable Supplier<Task> taskSupplier) { super(listHolder, selectedRowsCount -> selectedRowsCount == 1, taskSupplier); - putValue(NAME, "Toggle completion"); + putValue(NAME, I18N.getString("toggleAction")); putValue(SHORT_DESCRIPTION, description); putValue(MNEMONIC_KEY, KeyEvent.VK_T); putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl T")); diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/AbstractEntityDialog.java b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/AbstractEntityDialog.java index 418bafb0..1e4cb007 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/AbstractEntityDialog.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/AbstractEntityDialog.java @@ -1,6 +1,7 @@ package cz.muni.fi.pv168.project.ui.dialog; import cz.muni.fi.pv168.project.ui.centering.WindowCenterer; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.resources.Icons; import javax.swing.BorderFactory; @@ -23,6 +24,8 @@ abstract class AbstractEntityDialog<E> extends JDialog { private final JPanel panel; private final JButton okButton; + private static final I18N I18N = new I18N(AbstractEntityDialog.class); + private boolean wasOk; AbstractEntityDialog() { @@ -30,12 +33,12 @@ abstract class AbstractEntityDialog<E> extends JDialog { panel.setLayout(new GridBagLayout()); wasOk = false; - okButton = new JButton("OK"); + okButton = new JButton(I18N.getString("buttonConfirm")); okButton.addActionListener(e -> { wasOk = true; this.dispose(); }); - JButton cancelButton = new JButton("Cancel"); + JButton cancelButton = new JButton(I18N.getString("buttonDismiss")); cancelButton.addActionListener(e -> this.dispose()); GridBagConstraints gbc = new GridBagConstraints(); @@ -54,7 +57,7 @@ abstract class AbstractEntityDialog<E> extends JDialog { gbc.gridx = 2; okCancelPanel.add(cancelButton, gbc); - this.setTitle("New filesystem VM"); + this.setTitle(I18N.getString("vmTitle")); this.setMinimumSize(new Dimension(300, 100)); this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); this.setModalityType(ModalityType.APPLICATION_MODAL); diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/CategoryDialog.java b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/CategoryDialog.java index a084b31d..2e3d3a0b 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/CategoryDialog.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/CategoryDialog.java @@ -3,6 +3,7 @@ package cz.muni.fi.pv168.project.ui.dialog; import cz.muni.fi.pv168.project.color.AppColors; import cz.muni.fi.pv168.project.data.category.Category; import cz.muni.fi.pv168.project.ui.component.SimpleColorChooser; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import javax.swing.JLabel; import javax.swing.JTextField; @@ -16,6 +17,8 @@ public class CategoryDialog extends AbstractLaidOutDialog<Category> { private final SimpleColorChooser colorField = new SimpleColorChooser(); private final JLabel colorCodeField = new JLabel(); + private static final I18N I18N = new I18N(CategoryDialog.class); + public CategoryDialog() { colorCodeField.setText("#FFFFFF"); colorField.getSelectionModel().addChangeListener( @@ -34,8 +37,8 @@ public class CategoryDialog extends AbstractLaidOutDialog<Category> { } private void addFields() { - addLabeledField("Name:", nameField, labelGbc, componentGbc, getRowThenIncrement()); - addLabeledField("Color:", colorField, labelGbc, componentGbc, getRowThenIncrement()); + addLabeledField(I18N.getString("fieldLabelName"), nameField, labelGbc, componentGbc, getRowThenIncrement()); + addLabeledField(I18N.getString("fieldLabelColor"), colorField, labelGbc, componentGbc, getRowThenIncrement()); var colorCodeGbc = (GridBagConstraints) labelGbc.clone(); colorCodeGbc.fill = GridBagConstraints.CENTER; diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/ComboBoxDialog.java b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/ComboBoxDialog.java index 5eab0d5d..1ebbeea5 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/ComboBoxDialog.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/ComboBoxDialog.java @@ -1,6 +1,7 @@ package cz.muni.fi.pv168.project.ui.dialog; import cz.muni.fi.pv168.project.model.ComboBoxModelAdapter; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import javax.swing.JComboBox; import java.util.Collection; @@ -8,10 +9,11 @@ import java.util.Collection; public class ComboBoxDialog<T> extends AbstractLaidOutDialog<T> { private final JComboBox<T> comboBox; + private static final I18N I18N = new I18N(ComboBoxDialog.class); public ComboBoxDialog(Collection<T> entities) { comboBox = new JComboBox<>(ComboBoxModelAdapter.fromCollection(entities)); - addLabeledField("Select :", comboBox, labelGbc, middleComponent, getRow()); + addLabeledField(I18N.getString("fieldLabelSelect"), comboBox, labelGbc, middleComponent, getRow()); // gray out button when nothing is initially selected getOkButton().setEnabled(false); diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/SubTaskDialog.java b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/SubTaskDialog.java index 788fbe77..f7bb0d55 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/SubTaskDialog.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/SubTaskDialog.java @@ -1,6 +1,7 @@ package cz.muni.fi.pv168.project.ui.dialog; import cz.muni.fi.pv168.project.data.task.SubTask; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import javax.swing.JTextField; @@ -9,6 +10,8 @@ public class SubTaskDialog extends AbstractLaidOutDialog<SubTask> { protected SubTask entity; protected final JTextField titleField = new JTextField(); + private static final I18N I18N = new I18N(SubTaskDialog.class); + public SubTaskDialog() { entity = new SubTask(""); this.addTitle(); @@ -23,7 +26,7 @@ public class SubTaskDialog extends AbstractLaidOutDialog<SubTask> { } protected void addTitle() { - addLabeledField("Title:", titleField, labelGbc, componentGbc, getRowThenIncrement()); + addLabeledField(I18N.getString("fieldLabelTitle"), titleField, labelGbc, componentGbc, getRowThenIncrement()); } @Override diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/TaskDialog.java b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/TaskDialog.java index 45d59ea5..31c99fab 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/TaskDialog.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/TaskDialog.java @@ -2,6 +2,7 @@ package cz.muni.fi.pv168.project.ui.dialog; import cz.muni.fi.pv168.project.data.task.Task; import cz.muni.fi.pv168.project.model.LocalDateModel; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import org.jdatepicker.DateModel; import org.jdatepicker.JDatePicker; import org.joda.time.Duration; @@ -31,6 +32,8 @@ public class TaskDialog extends AbstractLaidOutDialog<Task> { private final JTextField estimatedTimeField = new IntegerTextField(0); private final JDatePicker datePicker = new JDatePicker(dueTimeModel); + private static final I18N I18N = new I18N(TaskDialog.class); + public TaskDialog() { descriptionField.setLineWrap(true); descriptionField.setFont(descriptionField.getFont().deriveFont(11f)); @@ -45,17 +48,17 @@ public class TaskDialog extends AbstractLaidOutDialog<Task> { } protected void addFields() { - addLabeledField("Title:", titleField, labelGbc, componentGbc, getRowThenIncrement()); - addLabeledField("Description:", new JScrollPane(descriptionField), labelGbc, componentGbc, getRowThenIncrement()); - addLabeledField("Estimated time:", createEstimatedTimePanel(), labelGbc, componentGbc, getRowThenIncrement()); - addLabeledField("Due time:", datePicker, labelGbc, componentGbc, getRowThenIncrement()); + addLabeledField(I18N.getString("labelTitle"), titleField, labelGbc, componentGbc, getRowThenIncrement()); + addLabeledField(I18N.getString("labelDescription"), new JScrollPane(descriptionField), labelGbc, componentGbc, getRowThenIncrement()); + addLabeledField(I18N.getString("labelEstTime"), createEstimatedTimePanel(), labelGbc, componentGbc, getRowThenIncrement()); + addLabeledField(I18N.getString("labelDueTime"), datePicker, labelGbc, componentGbc, getRowThenIncrement()); } private JPanel createEstimatedTimePanel() { JPanel estimatePanel = new JPanel(new BorderLayout()); estimatePanel.add(estimatedTimeField, BorderLayout.CENTER); - estimatePanel.add(new JLabel(" hours"), BorderLayout.EAST); + estimatePanel.add(new JLabel(" " + I18N.getString("estimatedTimeUnit")), BorderLayout.EAST); return estimatePanel; } diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/error/ErrorDialog.java b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/error/ErrorDialog.java index 84b02d52..7b9592e3 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/dialog/error/ErrorDialog.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/dialog/error/ErrorDialog.java @@ -1,5 +1,6 @@ package cz.muni.fi.pv168.project.ui.dialog.error; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -15,6 +16,7 @@ import java.io.StringWriter; public final class ErrorDialog { private final JPanel panel = new JPanel(); + private static final I18N I18N = new I18N(ErrorDialog.class); private ErrorDialog(String message, Throwable throwable) { panel.setLayout(new GridBagLayout()); @@ -39,7 +41,7 @@ public final class ErrorDialog { private void show(Component parentComponent) { JOptionPane.showMessageDialog(parentComponent, panel, - "Error occurred", + I18N.getString("error"), JOptionPane.ERROR_MESSAGE); } diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/WelcomePanel.java b/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/WelcomePanel.java index 9a67f20b..51e7f77b 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/WelcomePanel.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/WelcomePanel.java @@ -1,5 +1,7 @@ package cz.muni.fi.pv168.project.ui.main.panel; +import cz.muni.fi.pv168.project.ui.i18n.I18N; + import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JTextArea; @@ -13,11 +15,9 @@ import java.awt.Font; public class WelcomePanel { private final JPanel panel; - private static final String WELCOME_MESSAGE = - "Welcome to to:do, your daily task reminder.\n" + "\n" + - "You can use the toolbar buttons above to add, edit, or delete tasks and categories.\n" + - "Switch between tasks and categories using the tabs.\n" + - "Click on a task in the list on the left to see details."; + + private static final I18N I18N = new I18N(WelcomePanel.class); + private static final String WELCOME_MESSAGE = I18N.getString("welcomeMessage"); public WelcomePanel() { var welcomeTextArea = new JTextArea(WELCOME_MESSAGE); diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/CategoryHolderPanel.java b/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/CategoryHolderPanel.java index e8f921ef..19cf6844 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/CategoryHolderPanel.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/CategoryHolderPanel.java @@ -9,6 +9,7 @@ import cz.muni.fi.pv168.project.ui.action.DeleteAction; import cz.muni.fi.pv168.project.ui.action.EditAction; import cz.muni.fi.pv168.project.ui.dialog.factory.DialogFactory; import cz.muni.fi.pv168.project.ui.dialog.factory.ExistingCategoryDialogFactory; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.popup.PopupMenuFactory; import cz.muni.fi.pv168.project.ui.renderer.list.InnerColoredListRenderer; import cz.muni.fi.pv168.project.ui.resources.Icons; @@ -20,17 +21,19 @@ public class CategoryHolderPanel extends AbstractHolderPanel<Category> { private final ExistingCategoryDialogFactory factory; + private static final I18N I18N = new I18N(CategoryHolderPanel.class); + public CategoryHolderPanel(TaskCategoryDao categoryDao, CategoryDao parentDao) { super( - new TaskCategoryModel(categoryDao, parentDao), "Categories", + new TaskCategoryModel(categoryDao, parentDao), I18N.getString("panelName"), new InnerColoredListRenderer<>(Category::getName, Category::getColor, Font.BOLD | Font.ITALIC), Optional.empty()); factory = new ExistingCategoryDialogFactory(parentDao); PopupMenuFactory.builder() - .addMenuItem(new AddAction<>(this, Icons.ADD_CATEGORY_ICON, "Add category").addUpdatable(this)) - .addMenuItem(new EditAction<>(this, Icons.EDIT_CATEGORY_ICON, "Edit category").addUpdatable(this)) - .addMenuItem(new DeleteAction<>(this, Icons.REMOVE_CATEGORY_BIN_ICON, "Remove category").addUpdatable(this)) + .addMenuItem(new AddAction<>(this, Icons.ADD_CATEGORY_ICON, I18N.getString("addCategoryOption")).addUpdatable(this)) + .addMenuItem(new EditAction<>(this, Icons.EDIT_CATEGORY_ICON, I18N.getString("editCategoryOption")).addUpdatable(this)) + .addMenuItem(new DeleteAction<>(this, Icons.REMOVE_CATEGORY_BIN_ICON, I18N.getString("removeCategoryOption")).addUpdatable(this)) .buildFor(this.getList()); } diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/DependencyHolderPanel.java b/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/DependencyHolderPanel.java index 3ce31ffc..dadb40d6 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/DependencyHolderPanel.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/DependencyHolderPanel.java @@ -9,6 +9,7 @@ import cz.muni.fi.pv168.project.ui.action.DeleteAction; import cz.muni.fi.pv168.project.ui.action.task.GoToAction; import cz.muni.fi.pv168.project.ui.dialog.factory.DependencyTaskDialogFactory; import cz.muni.fi.pv168.project.ui.dialog.factory.DialogFactory; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.popup.PopupMenuFactory; import cz.muni.fi.pv168.project.ui.renderer.list.TaskStatusListRenderer; import cz.muni.fi.pv168.project.ui.resources.Icons; @@ -21,19 +22,21 @@ public class DependencyHolderPanel extends AbstractHolderPanel<Task> { private final DependencyTaskDialogFactory factory; + private static final I18N I18N = new I18N(DependencyHolderPanel.class); + public DependencyHolderPanel(JList<Task> superiorTaskList, DependencyDao dependencyDao, TaskDao taskDao) { super( - new TaskDependencyModel(dependencyDao), "Dependencies", + new TaskDependencyModel(dependencyDao), I18N.getString("panelName"), new TaskStatusListRenderer<>(Task::getTitle, Task::getTaskStatus, Task::isUrgent, Font.PLAIN), Optional.of(Task::isCompleted) ); factory = new DependencyTaskDialogFactory(dependencyDao, taskDao); PopupMenuFactory.builder() - .addMenuItem(new GoToAction(this, superiorTaskList, "Go to dependency")) + .addMenuItem(new GoToAction(this, superiorTaskList, I18N.getString("goToAction"))) .addSeparator() - .addMenuItem(new AddAction<>(this, Icons.ADD_TASK_ICON, "Add dependency").addUpdatable(this)) - .addMenuItem(new DeleteAction<>(this, Icons.REMOVE_TASK_BIN_ICON, "Remove dependency").addUpdatable(this)) + .addMenuItem(new AddAction<>(this, Icons.ADD_TASK_ICON, I18N.getString("addAction")).addUpdatable(this)) + .addMenuItem(new DeleteAction<>(this, Icons.REMOVE_TASK_BIN_ICON, I18N.getString("removeAction")).addUpdatable(this)) .buildFor(this.getList()); } diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/SubTaskHolderPanel.java b/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/SubTaskHolderPanel.java index 159a637e..6662ce49 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/SubTaskHolderPanel.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/main/panel/listholder/SubTaskHolderPanel.java @@ -10,6 +10,7 @@ import cz.muni.fi.pv168.project.ui.action.EditAction; import cz.muni.fi.pv168.project.ui.action.task.ToggleCompletionAction; import cz.muni.fi.pv168.project.ui.dialog.factory.DialogFactory; import cz.muni.fi.pv168.project.ui.dialog.factory.SubTaskDialogFactory; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.popup.PopupMenuFactory; import cz.muni.fi.pv168.project.ui.renderer.list.TaskStatusListRenderer; import cz.muni.fi.pv168.project.ui.resources.Icons; @@ -19,20 +20,22 @@ import java.util.Optional; public class SubTaskHolderPanel extends AbstractHolderPanel<SubTask> { + private static final I18N I18N = new I18N(SubTaskHolderPanel.class); + public SubTaskHolderPanel(SubTaskDao subTaskDao) { super( - new SubTaskModel(subTaskDao), "Sub tasks", + new SubTaskModel(subTaskDao), I18N.getString("panelName"), new TaskStatusListRenderer<>(SubTask::getTitle, task -> task.isCompleted() ? TaskStatus.FINISHED : TaskStatus.PLANNED, task -> false, Font.PLAIN), Optional.of(SubTask::isCompleted) ); PopupMenuFactory.builder() - .addMenuItem(new ToggleCompletionAction<>(this, "Toggle completion").addUpdatable(this)) + .addMenuItem(new ToggleCompletionAction<>(this, I18N.getString("completionToggle")).addUpdatable(this)) .addSeparator() - .addMenuItem(new AddAction<>(this, Icons.ADD_TASK_ICON, "Add subtask").addUpdatable(this)) - .addMenuItem(new EditAction<>(this, Icons.EDIT_TASK_ICON, "Edit subtask").addUpdatable(this)) - .addMenuItem(new DeleteAction<>(this, Icons.REMOVE_TASK_BIN_ICON, "Remove subtask").addUpdatable(this)) + .addMenuItem(new AddAction<>(this, Icons.ADD_TASK_ICON, I18N.getString("addAction")).addUpdatable(this)) + .addMenuItem(new EditAction<>(this, Icons.EDIT_TASK_ICON, I18N.getString("editAction")).addUpdatable(this)) + .addMenuItem(new DeleteAction<>(this, Icons.REMOVE_TASK_BIN_ICON, I18N.getString("removeAction")).addUpdatable(this)) .buildFor(this.getList()); } diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/main/toolbar/CategoriesStatisticsToolBar.java b/src/main/java/cz/muni/fi/pv168/project/ui/main/toolbar/CategoriesStatisticsToolBar.java index 15376a32..8fab7c67 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/main/toolbar/CategoriesStatisticsToolBar.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/main/toolbar/CategoriesStatisticsToolBar.java @@ -2,6 +2,7 @@ package cz.muni.fi.pv168.project.ui.main.toolbar; import cz.muni.fi.pv168.project.model.LocalDateModel; import cz.muni.fi.pv168.project.ui.action.TabActions; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import org.jdatepicker.JDatePicker; import javax.swing.Action; @@ -19,6 +20,8 @@ public class CategoriesStatisticsToolBar { private final JDatePicker showStatisticsFrom; private final JDatePicker showStatisticsTo; + private static final I18N I18N = new I18N(CategoriesStatisticsToolBar.class); + public CategoriesStatisticsToolBar(TabActions tabActions) { toolbar = new JToolBar(JToolBar.HORIZONTAL); toolbar.setFloatable(false); @@ -26,10 +29,10 @@ public class CategoriesStatisticsToolBar { showStatisticsFrom = new JDatePicker(new LocalDateModel()); showStatisticsTo = new JDatePicker(new LocalDateModel()); - JLabel fromText = new JLabel("From"); + JLabel fromText = new JLabel(I18N.getString("from")); fromText.setFont(fromText.getFont().deriveFont(Font.BOLD)); - JLabel toText = new JLabel("To"); + JLabel toText = new JLabel(I18N.getString("to")); toText.setFont(toText.getFont().deriveFont(Font.BOLD)); for (Action action : tabActions.getLeftSideActions()) { diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/main/toolbar/TasksToolBar.java b/src/main/java/cz/muni/fi/pv168/project/ui/main/toolbar/TasksToolBar.java index 6d12551a..2b879d2d 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/main/toolbar/TasksToolBar.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/main/toolbar/TasksToolBar.java @@ -2,6 +2,7 @@ package cz.muni.fi.pv168.project.ui.main.toolbar; import cz.muni.fi.pv168.project.data.task.TaskStatus; import cz.muni.fi.pv168.project.ui.action.TabActions; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import javax.swing.Action; import javax.swing.Box; @@ -17,12 +18,14 @@ public class TasksToolBar { private final JCheckBox isJustToday; private final JComboBox<TaskStatus> taskTypes; + private static final I18N I18N = new I18N(TasksToolBar.class); + public TasksToolBar(TabActions tabActions) { toolBar = new JToolBar(JToolBar.HORIZONTAL); toolBar.setFloatable(false); - isJustToday = new JCheckBox("Only urgent tasks", false); - isJustToday.setToolTipText("Show only tasks that are overdue or due today"); + isJustToday = new JCheckBox(I18N.getString("filter"), false); + isJustToday.setToolTipText(I18N.getString("filterTooltip")); taskTypes = new JComboBox<>(TaskStatus.values()); taskTypes.setSelectedItem(TaskStatus.ALL); diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/main/view/CategoryAndStatisticsView.java b/src/main/java/cz/muni/fi/pv168/project/ui/main/view/CategoryAndStatisticsView.java index 3b552b0c..cba592b5 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/main/view/CategoryAndStatisticsView.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/main/view/CategoryAndStatisticsView.java @@ -9,6 +9,7 @@ import cz.muni.fi.pv168.project.ui.action.EditAction; import cz.muni.fi.pv168.project.ui.action.TabActions; import cz.muni.fi.pv168.project.ui.dialog.factory.CategoryDialogFactory; import cz.muni.fi.pv168.project.ui.dialog.factory.DialogFactory; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.main.tab.Tab; import cz.muni.fi.pv168.project.ui.main.toolbar.CategoriesStatisticsToolBar; import cz.muni.fi.pv168.project.ui.popup.PopupMenuFactory; @@ -30,6 +31,8 @@ public class CategoryAndStatisticsView implements Tab<Category> { private final CategoryView categoryView; private final StatisticsView statisticsView; + private static final I18N I18N = new I18N(CategoryAndStatisticsView.class); + public CategoryAndStatisticsView(DaoHolder daoHolder) { categoryModel = new UpdatableDataModel<>(daoHolder.getCategoryDao()); splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); @@ -38,9 +41,10 @@ public class CategoryAndStatisticsView implements Tab<Category> { this.statisticsView = new StatisticsView(categoryModel); TabActions tabActions = TabActions.builder() - .addLeftSideAction(new AddAction<>(this, Icons.ADD_CATEGORY_ICON, "Add a new category")) - .addLeftSideAction(new EditAction<>(this, Icons.EDIT_CATEGORY_ICON, "Edit a selected category")) - .addLeftSideAction(new DeleteAction<>(this, Icons.REMOVE_CATEGORY_BIN_ICON, "Delete a selected category") + .addLeftSideAction(new AddAction<>(this, Icons.ADD_CATEGORY_ICON, I18N.getString("addActionDesc"))) + .addLeftSideAction(new EditAction<>(this, Icons.EDIT_CATEGORY_ICON, I18N.getString("editActionDesc"))) + //TODO: edit locale accroding to count + .addLeftSideAction(new DeleteAction<>(this, Icons.REMOVE_CATEGORY_BIN_ICON, I18N.getString("deleteActionDesc")) .addEnabledCondition(selectedCount -> daoHolder .getTaskDao() .getAll() @@ -65,7 +69,7 @@ public class CategoryAndStatisticsView implements Tab<Category> { @Override public String getLabel() { - return "Categories"; + return I18N.getString("label"); } @Override diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/main/view/TaskView.java b/src/main/java/cz/muni/fi/pv168/project/ui/main/view/TaskView.java index a9428731..fccb731c 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/main/view/TaskView.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/main/view/TaskView.java @@ -13,6 +13,7 @@ import cz.muni.fi.pv168.project.ui.action.Updatable; import cz.muni.fi.pv168.project.ui.action.task.ToggleCompletionAction; import cz.muni.fi.pv168.project.ui.dialog.factory.DialogFactory; import cz.muni.fi.pv168.project.ui.dialog.factory.TaskDialogFactory; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.main.panel.CardPanel; import cz.muni.fi.pv168.project.ui.main.panel.TaskPanel; import cz.muni.fi.pv168.project.ui.main.panel.WelcomePanel; @@ -51,8 +52,10 @@ public class TaskView implements Tab<Task> { private final TaskPanel taskPanel; private final CardPanel cardPanel; - public static final String WELCOME_CARD = "Welcome"; - public static final String TASK_CARD = "Task"; + private static final I18N I18N = new I18N(TaskView.class); + + public static final String WELCOME_CARD = I18N.getString("welcomeCard"); + public static final String TASK_CARD = I18N.getString("taskCard"); public TaskView(DaoHolder daoHolder) { taskModel = new TaskModel(daoHolder.getTaskDao()); @@ -74,10 +77,11 @@ public class TaskView implements Tab<Task> { .addComponent(taskPanel, TASK_CARD); tabActions = TabActions.builder() - .addLeftSideAction(new AddAction<>(this, Icons.ADD_TASK_ICON, "Add a new task")) - .addLeftSideAction(new EditAction<>(this, Icons.EDIT_TASK_ICON, "Edit a selected task", headerList::getSelectedValue) + .addLeftSideAction(new AddAction<>(this, Icons.ADD_TASK_ICON, I18N.getString("addActionDesc"))) + .addLeftSideAction(new EditAction<>(this, Icons.EDIT_TASK_ICON, I18N.getString("editActionDesc"), headerList::getSelectedValue) .addUpdatable(taskPanel)) - .addLeftSideAction(new DeleteAction<>(this, Icons.REMOVE_TASK_BIN_ICON, "Delete a selected task") + //TODO: edit locale accroding to count + .addLeftSideAction(new DeleteAction<>(this, Icons.REMOVE_TASK_BIN_ICON, I18N.getString("deleteActionDesc")) .addEnabledCondition(selectedCount -> daoHolder .getTaskDao() .getAll() @@ -133,7 +137,7 @@ public class TaskView implements Tab<Task> { private void createPopupMenu(CategoryDao categoryDao) { PopupMenuFactory.builder() .addMenuItems(tabActions.getLeftSideActions()) - .addMenuItem(new ToggleCompletionAction<>(this, "Toggle task completion", headerList::getSelectedValue) + .addMenuItem(new ToggleCompletionAction<>(this, I18N.getString("actionToggle"), headerList::getSelectedValue) .addUpdatable(new Updatable() { @Override public void updateFrom(Task task) { @@ -155,7 +159,7 @@ public class TaskView implements Tab<Task> { @Override public String getLabel() { - return "Tasks"; + return I18N.getString("label"); } @Override diff --git a/src/main/java/cz/muni/fi/pv168/project/ui/renderer/list/TaskListRenderer.java b/src/main/java/cz/muni/fi/pv168/project/ui/renderer/list/TaskListRenderer.java index cfeab217..3dd79dc8 100644 --- a/src/main/java/cz/muni/fi/pv168/project/ui/renderer/list/TaskListRenderer.java +++ b/src/main/java/cz/muni/fi/pv168/project/ui/renderer/list/TaskListRenderer.java @@ -2,6 +2,8 @@ package cz.muni.fi.pv168.project.ui.renderer.list; import cz.muni.fi.pv168.project.data.task.Task; import cz.muni.fi.pv168.project.data.task.TaskStatus; +import cz.muni.fi.pv168.project.ui.dialog.TaskDialog; +import cz.muni.fi.pv168.project.ui.i18n.I18N; import cz.muni.fi.pv168.project.ui.main.panel.TaskStatusPanel; import javax.swing.BorderFactory; @@ -28,8 +30,11 @@ public class TaskListRenderer implements ListCellRenderer<Task> { private final TaskStatusPanel completionPanel; private final JPanel panel; - public static final String TITLE_DATE_DELIMITER = "- due"; - public static final String TIME_FORMAT = "Estimated %d hours"; + private static final I18N I18N = new I18N(TaskListRenderer.class); + + public static final String TITLE_DATE_DELIMITER = I18N.getString("delimiter"); + //TODO localization depending on count + public static final String TIME_FORMAT = I18N.getString("timeFormat"); public TaskListRenderer() { panel = new JPanel(new GridBagLayout()); diff --git a/src/main/resources/cz/muni/fi/pv168/project/model/db/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/model/db/i18n.properties new file mode 100644 index 00000000..10adbcd6 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/model/db/i18n.properties @@ -0,0 +1,7 @@ +AbstractDataModel.editingEntError=Error when editing +AbstractDataModel.addingEntError=Error when adding +AbstractDataModel.deletingEntError=Error when removing + +UpdatableDataModel.queryAllError=Error when querying all elements. + +TaskModel.queryAllError=Error when querying all elements. diff --git a/src/main/resources/cz/muni/fi/pv168/project/model/db/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/model/db/i18n_cs.properties new file mode 100644 index 00000000..68508870 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/model/db/i18n_cs.properties @@ -0,0 +1,7 @@ +AbstractDataModel.editingEntError=Chyba p\u0159i editaci +AbstractDataModel.addingEntError=Chyba p\u0159i p\u0159id\u00E1v\u00E1n\u00ED +AbstractDataModel.deletingEntError=Chyba p\u0159i maz\u00E1n\u00ED + +UpdatableDataModel.queryAllError=Chyba p\u0159i na\u010D\u00EDt\u00E1n\u00ED v\u0161ech polo\u017Eek. + +TaskModel.queryAllError=Chyba p\u0159i na\u010D\u00EDt\u00E1n\u00ED v\u0161ech polo\u017Eek. diff --git a/src/main/resources/cz/muni/fi/pv168/project/model/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/model/i18n.properties new file mode 100644 index 00000000..047e78c4 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/model/i18n.properties @@ -0,0 +1,2 @@ +CategoryStatisticsTableModel.columnNameTitle=Category name +CategoryStatisticsTableModel.columnTimeTitle=Time spent \ No newline at end of file diff --git a/src/main/resources/cz/muni/fi/pv168/project/model/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/model/i18n_cs.properties new file mode 100644 index 00000000..4062662d --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/model/i18n_cs.properties @@ -0,0 +1,2 @@ +CategoryStatisticsTableModel.columnNameTitle=Jm\u00E9no kategorie +CategoryStatisticsTableModel.columnTimeTitle=Str\u00E1ven\u00FD \u010Das \ No newline at end of file diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/action/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/action/i18n.properties new file mode 100644 index 00000000..cd425203 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/action/i18n.properties @@ -0,0 +1,6 @@ +AddAction.addAction=Add + +DeleteAction.deleteAction=Delete +DeleteAction.confirmation=Are you sure you want to delete? + +EditAction.editAction=Edit diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/action/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/action/i18n_cs.properties new file mode 100644 index 00000000..175d2253 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/action/i18n_cs.properties @@ -0,0 +1,6 @@ +AddAction.addAction=P\u0159idat + +DeleteAction.deleteAction=Smazat +DeleteAction.confirmation=Jste si jisti, \u017Ee chcete v\u00FDb\u011Br smazat? + +EditAction.editAction=Upravit diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/action/task/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/action/task/i18n.properties new file mode 100644 index 00000000..c825f947 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/action/task/i18n.properties @@ -0,0 +1,3 @@ +GoToAction.goTo=Go to task + +ToggleCompletionAction.toggleAction=Toggle completion diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/action/task/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/action/task/i18n_cs.properties new file mode 100644 index 00000000..1b2c7cde --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/action/task/i18n_cs.properties @@ -0,0 +1,3 @@ +GoToAction.goTo=P\u0159ej\u00EDt na \u00FAlohu + +ToggleCompletionAction.toggleAction=P\u0159epnout spln\u011Bn\u00ED diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/error/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/error/i18n.properties new file mode 100644 index 00000000..9853a874 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/error/i18n.properties @@ -0,0 +1 @@ +error=Nastala chyba diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/error/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/error/i18n_cs.properties new file mode 100644 index 00000000..fb36abc6 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/error/i18n_cs.properties @@ -0,0 +1 @@ +error=Error occurred diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/i18n.properties new file mode 100644 index 00000000..ebbb22d2 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/i18n.properties @@ -0,0 +1,16 @@ +AbstractEntityDialog.buttonConfirm=OK +AbstractEntityDialog.buttonDismiss=Cancel +AbstractEntityDialog.vmTitle=New filesystem VM + +CategoryDialog.fieldLabelName=Name: +CategoryDialog.fieldLabelColor=Color: + +ComboBoxDialog.fieldLabelSelect=Select: + +SubTaskDialog.fieldLabelTitle=Title: + +TaskDialog.labelTitle=Title: +TaskDialog.labelDescription=Description: +TaskDialog.labelEstTime=Estimated time: +TaskDialog.labelDueTime=Due time: +TaskDialog.estimatedTimeUnit=hours diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/i18n_cs.properties new file mode 100644 index 00000000..dbbfe4b5 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/dialog/i18n_cs.properties @@ -0,0 +1,16 @@ +AbstractEntityDialog.buttonConfirm=OK +AbstractEntityDialog.buttonDismiss=Zru\u0161it +AbstractEntityDialog.vmTitle=Nov\u00FD filesystem VM + +CategoryDialog.fieldLabelName=Jm\u00E9no: +CategoryDialog.fieldLabelColor=Barva: + +ComboBoxDialog.fieldLabelSelect=Vybrat: + +SubTaskDialog.fieldLabelTitle=N\u00E1zev: + +TaskDialog.labelTitle=N\u00E1zev: +TaskDialog.labelDescription=Popis: +TaskDialog.labelEstTime=Odhadovan\u00FD \u010Das: +TaskDialog.labelDueTime=Deadline: +TaskDialog.estimatedTimeUnit=hodin diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/i18n.properties new file mode 100644 index 00000000..d2b790f0 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/i18n.properties @@ -0,0 +1,4 @@ +WelcomePanel.welcomeMessage=Welcome to to:do, your daily task reminder.\n\n\ + You can use the toolbar buttons above to add, edit, or delete tasks and categories.\n\ + Switch between tasks and categories using the tabs.\n\ + Click on a task in the list on the left to see details. \ No newline at end of file diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/i18n_cs.properties new file mode 100644 index 00000000..0b9d2838 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/i18n_cs.properties @@ -0,0 +1,4 @@ +WelcomePanel.welcomeMessage=V\u00EDtejte v to:do, va\u0161em denn\u00EDm pl\u00E1nova\u010Di \u00FAloh.\n\n\ + M\u016F\u017Eete pou\u017E\u00EDt horn\u00ED tla\u010D\u00EDtka pro p\u0159id\u00E1n\u00ED, editaci, nebo odstran\u011Bn\u00ED \u00FAloh a kategori\u00ED.\n\ + P\u0159ep\u00EDnat mezi plohami a kategoriemi m\u016F\u017Eete pomoc\u00ED z\u00E1lo\u017Eek.\n\ + Klikn\u011Bte na \u00FAlohu nalevo pro zobrazen\u00ED jej\u00EDch detail\u016F. \ No newline at end of file diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/listholder/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/listholder/i18n.properties new file mode 100644 index 00000000..62fd6d52 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/listholder/i18n.properties @@ -0,0 +1,15 @@ +CategoryHolderPanel.panelName=Categories +CategoryHolderPanel.addCategoryOption=Add category +CategoryHolderPanel.editCategoryOption=Edit category +CategoryHolderPanel.removeCategoryOption=Remove category + +DependencyHolderPanel.panelName=Dependencies +DependencyHolderPanel.goToAction=Go to dependency +DependencyHolderPanel.addAction=Add dependency +DependencyHolderPanel.removeAction=Remove dependency + +SubTaskHolderPanel.panelName=Sub tasks +SubTaskHolderPanel.completionToggle=Toggle completion +SubTaskHolderPanel.addAction=Add subtask +SubTaskHolderPanel.editAction=Edit subtask +SubTaskHolderPanel.removeAction=Remove subtask \ No newline at end of file diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/listholder/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/listholder/i18n_cs.properties new file mode 100644 index 00000000..733a5132 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/main/panel/listholder/i18n_cs.properties @@ -0,0 +1,15 @@ +CategoryHolderPanel.panelName=Kategorie +CategoryHolderPanel.addCategoryOption=P\u0159idat kategorii +CategoryHolderPanel.editCategoryOption=Upravit kategorii +CategoryHolderPanel.removeCategoryOption=Smazat kategorii + +DependencyHolderPanel.panelName=Dependence +DependencyHolderPanel.goToAction=P\u0159ej\u00EDt na dependenci +DependencyHolderPanel.addAction=P\u0159idat dependenci +DependencyHolderPanel.deleteAction=Smazat dependenci + +SubTaskHolderPanel.panelName=Pod\u00FAlohy +SubTaskHolderPanel.completionToggle=P\u0159epnout spln\u011Bn\u00ED +SubTaskHolderPanel.addAction=P\u0159idat pod\u00FAlohu +SubTaskHolderPanel.editAction=Upravit pod\u00FAlohu +SubTaskHolderPanel.removeAction=Smazat pod\u00FAlohu \ No newline at end of file diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/main/toolbar/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/main/toolbar/i18n.properties new file mode 100644 index 00000000..7f0558ce --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/main/toolbar/i18n.properties @@ -0,0 +1,5 @@ +CategoriesStatisticsToolBar.from=From +CategoriesStatisticsToolBar.to=To + +TasksToolBar.filter=Only urgent tasks +TasksToolBar.filterTooltip=Show only tasks that are overdue or due today diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/main/toolbar/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/main/toolbar/i18n_cs.properties new file mode 100644 index 00000000..1a297249 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/main/toolbar/i18n_cs.properties @@ -0,0 +1,5 @@ +CategoriesStatisticsToolBar.from=Od +CategoriesStatisticsToolBar.to=Do + +TasksToolBar.filter=Jen urgentn\u00ED \u00FAlohy +TasksToolBar.filterTooltip=Zobraz\u00ED pouze ty \u00FAlohy, je\u017E maj\u00ED b\u00FDt hotov\u00E9 do dnes diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/main/view/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/main/view/i18n.properties new file mode 100644 index 00000000..6e771cf3 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/main/view/i18n.properties @@ -0,0 +1,14 @@ +CategoryAndStatisticsView.addActionDesc=Add a new category +CategoryAndStatisticsView.editActionDesc=Edit a selected category +CategoryAndStatisticsView.deleteActionDesc=Delete a selected category +CategoryAndStatisticsView.label=Categories + +TaskView.welcomeCard=Welcome +TaskView.taskCard=Task + +TaskView.addActionDesc=Add a new task +TaskView.editActionDesc=Edit a selected task +TaskView.deleteActionDesc=Delete a selected task + +TaskView.actionToggle=Toggle task completion +TaskView.label=Tasks diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/main/view/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/main/view/i18n_cs.properties new file mode 100644 index 00000000..a5c3b810 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/main/view/i18n_cs.properties @@ -0,0 +1,13 @@ +CategoryAndStatisticsView.addActionDesc=P\u0159idat novou kategorii +CategoryAndStatisticsView.editActionDesc=Upravit vybranou kategorii +CategoryAndStatisticsView.deleteActionDesc=Smazat vybranou kategorii +CategoryAndStatisticsView.label=Kategorie + +TaskView.welcomeCard=V\u00EDtejte +TaskView.taskCard=\u00DAloha +TaskView.addActionDesc=P\u0159idat novou \u00FAlohu +TaskView.editActionDesc=Upravit vybranou \u00FAlohu +TaskView.deleteActionDesc=Smazat vybranou \u00FAlohu + +TaskView.actionToggle=P\u0159epnout spln\u011Bn\u00ED \u00FAlohy +TaskView.label=\u00DAlohy diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/renderer/list/i18n.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/renderer/list/i18n.properties new file mode 100644 index 00000000..39ec632a --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/renderer/list/i18n.properties @@ -0,0 +1,2 @@ +TaskListRenderer.delimiter=\u2013 due +TaskListRenderer.timeFormat=Estimated %d hours diff --git a/src/main/resources/cz/muni/fi/pv168/project/ui/renderer/list/i18n_cs.properties b/src/main/resources/cz/muni/fi/pv168/project/ui/renderer/list/i18n_cs.properties new file mode 100644 index 00000000..cf885516 --- /dev/null +++ b/src/main/resources/cz/muni/fi/pv168/project/ui/renderer/list/i18n_cs.properties @@ -0,0 +1,2 @@ +TaskListRenderer.delimiter=\u2013 do +TaskListRenderer.timeFormat=Odhadov\u00E1no %d hodin -- GitLab