diff --git a/NovaPoshta/.gitignore b/NovaPoshta/.gitignore
index 24ff508..8513a80 100644
--- a/NovaPoshta/.gitignore
+++ b/NovaPoshta/.gitignore
@@ -35,6 +35,9 @@ build/
### App ###
*.properties
+!application.properties
+!lang*.properties
+.mvn
mvnw
mvnw.cmd
*.zip
diff --git a/NovaPoshta/pom.xml b/NovaPoshta/pom.xml
index 9d4a444..ffb216a 100644
--- a/NovaPoshta/pom.xml
+++ b/NovaPoshta/pom.xml
@@ -10,7 +10,7 @@
- 1.1
+ 1.2
17
1.3.0
2.17.0
diff --git a/NovaPoshta/run.sh b/NovaPoshta/run.sh
index 4463eb5..1660df4 100644
--- a/NovaPoshta/run.sh
+++ b/NovaPoshta/run.sh
@@ -1,3 +1,3 @@
#!/bin/bash
JFX_PATH=/full/path/to/jfx
-${JAVA_HOME}/bin/java ${JFX_PATH}/lib --add-modules javafx.controls,javafx.fxm -jar NovaPoshta.jar &
+${JAVA_HOME}/bin/java --module-path ${JFX_PATH}/lib --add-modules javafx.controls,javafx.fxm -jar NovaPoshta.jar &
diff --git a/NovaPoshta/src/main/resources/application.properties b/NovaPoshta/src/main/resources/application.properties
new file mode 100644
index 0000000..9590219
--- /dev/null
+++ b/NovaPoshta/src/main/resources/application.properties
@@ -0,0 +1,15 @@
+spring.main.banner-mode=off
+spring.application.name=Nova Poshta Tracker
+
+logging.level.das=off
+logging.file.name=logs/NP.log
+logging.logback.rollingpolicy.max-history=5
+logging.logback.rollingpolicy.max-file-size=10MB
+
+driverClassName=org.sqlite.JDBC
+url=jdbc:sqlite:DB/np.db
+spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect
+spring.datasource.initSQL=PRAGMA foreign_keys = ON
+#spring.datasource.username=your_username
+#spring.datasource.password=your_password
+app.transaction.timeout.seconds=10
diff --git a/NovaPoshta/src/main/resources/images/buttons/edit_16.png b/NovaPoshta/src/main/resources/images/buttons/edit_16.png
new file mode 100644
index 0000000..c3d8e27
Binary files /dev/null and b/NovaPoshta/src/main/resources/images/buttons/edit_16.png differ
diff --git a/NovaPoshta/src/main/resources/images/buttons/plus-green-16.png b/NovaPoshta/src/main/resources/images/buttons/plus-green-16.png
new file mode 100644
index 0000000..280cb16
Binary files /dev/null and b/NovaPoshta/src/main/resources/images/buttons/plus-green-16.png differ
diff --git a/NovaPoshta/src/main/resources/images/np_app_icon.png b/NovaPoshta/src/main/resources/images/np_app_icon.png
new file mode 100644
index 0000000..d567b4a
Binary files /dev/null and b/NovaPoshta/src/main/resources/images/np_app_icon.png differ
diff --git a/NovaPoshta/src/main/resources/images/number/group_24.png b/NovaPoshta/src/main/resources/images/number/group_24.png
new file mode 100644
index 0000000..1d48dab
Binary files /dev/null and b/NovaPoshta/src/main/resources/images/number/group_24.png differ
diff --git a/NovaPoshta/src/main/resources/languages/lang.properties b/NovaPoshta/src/main/resources/languages/lang.properties
new file mode 100644
index 0000000..25eefb1
--- /dev/null
+++ b/NovaPoshta/src/main/resources/languages/lang.properties
@@ -0,0 +1,306 @@
+# Default Language locale file
+# Application
+number.type.in=Inbound
+number.type.out=Outbound
+number.type.undef=Undefined
+number.status.new=New
+number.status.error=Error
+number.status.processing=Delivering
+number.status.waiting=Waiting
+number.status.complete=Completed
+# Number item
+item.tooltip.type=Cargo type: %s
+item.tooltip.status=Cargo status: %s
+item.tooltip.added.date=Added date
+item.tooltip.created.date=Created date
+item.tooltip.updated.date=Last updated date
+# Number info
+info.tooltip.comment=User added comment
+info.tooltip.descr=Cargo description
+info.label.group=Group:
+info.tooltip.group=Number's group
+info.label.status=Status:
+info.tooltip.status=Cargo status
+info.label.type=Type:
+info.tooltip.type=Cargo type
+info.label.cost=Cost:
+info.tooltip.cost=Cost of delivery, UAH
+info.label.seats=Seats:
+info.tooltip.seats=Seats amount
+info.label.price=Price:
+info.tooltip.price=Announced Price, UAH
+info.label.weight=Weight:
+info.tooltip.weight=Weight, kg
+info.label.created=Created:
+info.tooltip.created=Date created
+info.label.scheduled=Scheduled:
+info.tooltip.scheduled=Scheduled Delivery Date
+info.label.updated=Updated:
+info.tooltip.updated=Last updated date
+info.label.recipient.name=For:
+info.tooltip.recipient.name=Recipient Full Name
+info.label.recipient.city=in:
+info.tooltip.recipient.city=Recipient's city
+info.label.recipient.warehouse=at:
+info.tooltip.recipient.warehouse=Recipient's warehouse
+info.label.sender.name=From:
+info.tooltip.sender.name=Sender Full Name
+info.label.sender.phone=(%s)
+info.tooltip.sender.phone=Sender phone number
+info.label.sender.city=in:
+info.tooltip.sender.city=Sender's city
+info.label.sender.warehouse=at:
+info.tooltip.sender.warehouse=Sender's Warehouse
+info.tooltip.barcode=Number's Barcode
+info.button.tooltip.copy=Copy to clipboard
+info.button.message.copy=Copied to clipboard
+info.button.tooltip.open=Open in new window
+info.label.detailed=Detailed Info:
+info.field.detailed.name=Field Name
+info.field.detailed.value=Field Value
+info.field.menu.copy.name=Copy Field Name
+info.field.menu.copy.value=Copy Field value
+info.field.menu.copy.kv=Copy Key and Value as K=V
+info.field.menu.copy.kv1=Copy Key and Value as K->V
+info.field.menu.copy.all=Copy All Rows
+# Fields
+number.field.id=ID
+number.field.number=Number
+number.field.group=Group
+number.field.appStatus=Number Status
+number.field.numberType=Number Type
+number.field.comment=User Comment
+number.field.dateCreated=Date Created
+number.field.weight=Weight
+number.field.cost=Cost
+number.field.seatsAmount=Seats Amount
+number.field.description=Description
+number.field.cargoType=Type
+number.field.statusCode=Status Code
+number.field.announcedPrice=Announced Price
+number.field.scheduledDeliveryDate=Scheduled Delivery Date
+number.field.recipientFullName=Recipient Full Name
+number.field.cityRecipient=Recipient's City
+number.field.warehouseRecipient=Recipient's Warehouse
+number.field.warehouseRecipientNumber=Recipient Warehouse's Number
+number.field.phoneRecipient=Recipient's Phone
+number.field.recipientAddress=Recipient's Address
+number.field.citySender=Sender's City
+number.field.phoneSender=Sender's Phone
+number.field.warehouseSender=Sender's Warehouse
+number.field.senderAddress=Sender's Address
+number.field.fullData=Response Full Data
+number.field.created=Created Date
+number.field.updated=Last Updated Date
+number.field.groupName=Group name
+number.field.descr=Describe*
+number.field.autoUpdated=Auto Update
+# Config window
+config.title=Configuration:
+config.label.url=API URL:
+config.label.phone=Phone:
+config.label.language=Language:
+config.label.maxHistory=Search history records:
+config.tooltip.maxHistory=Search history maximum records: from %d to %d\nZero value means 'Do not save search history'
+config.label.maxLogRecords=LOG records:
+config.label.autoUpdate=Enable Auto Update
+config.alert.title=Error in config
+config.alert.message.wrongApiUrl=Field must contain valid NP's API endpoint value
+config.alert.message.wrongPhone=Field must contain valid phone number
+# Detailed Info window
+detail.title=Detailed info for %s
+# Add Number window
+add.title=Adding new number
+add.label.number=Number:
+add.label.type=Type:
+add.label.phone=Phone:
+add.label.update=Auto Update
+add.label.another=Add another
+add.label.comment=Comment:
+add.label.group=Group:
+add.edit.comment.prompt=Comment for new Cargo Number (could be empty)
+add.alert.title.error=Error
+add.alert.message.WrongNumber=Wrong number
+add.alert.message.NumberAlreadyAdded=Number '%s' already added
+add.alert.message.WrongPhone=Wrong phone
+add.tooltip.AddPhone=Add this phone into DB
+add.tooltip.EditPhones=Edit all phones
+add.message.PhoneAdded=The phone '%s' have been added into DB
+add.message.PhoneExists=The phone '%s' already exists in DB
+# Edit Phones window
+edit.phones.title=Edit all pones
+edit.phones.dialog.title=Editing Phones
+edit.phones.newPhone=New Phone number:
+edit.phones.alert.title=Wrong phone number '%s'
+edit.phones.alert.message=There was a wrong phone number entered.\nPlease correct and try again.
+edit.phones.confirm.title=Confirm deletion
+edit.phones.confirm.header=Confirm deletion of '%s'
+edit.phones.confirm.message=Are you sure to remove the phone?
+edit.phones.alert.phoneUsed.title=The '%s' phone is used in number(s)
+edit.phones.alert.phoneUsed.message=Phone used in number(s). So it couldn't be deleted
+# Edit Search Options window
+edit.options.action.moveUp=Move Up
+edit.options.action.moveDn=Move Down
+edit.options.action.add=Add item
+edit.options.action.edit=Edit item
+edit.options.action.apply=Apply changes
+edit.options.action.remove=Remove item
+edit.options.title=Edit all pones
+edit.options.confirm.title=Confirm deletion
+edit.options.confirm.header=Confirm deletion of '%s'
+edit.options.confirm.message=Are you sure to remove the Search Option?
+edit.options.alert.title=Wrong parameter
+edit.options.alert.message=The Search Options' name couldn't be empty.\nPlease correct and try again.
+edit.options.toast.message.applied=Changes have been applied
+edit.options.toast.message.noChanges=There were no changes
+edit.options.toast.message.removed=The option '%s' have been removed
+edit.options.name.newOption=New search options
+edit.options.label.name=Name:
+edit.options.label.text=Search text:
+# Edit Groups window
+edit.groups.title=Edit all groups
+edit.groups.dialog.title=Editing Groups
+edit.groups.newGroup=New Group name:
+edit.groups.alert.title=Group '%s' already exists
+edit.groups.alert.message=Group name you have been entered already exists.\nEnter new one please.
+edit.groups.confirm.title=Confirm deletion
+edit.groups.confirm.header=Confirm deletion of '%s'
+edit.groups.confirm.message=Are you sure to remove the Group?
+edit.groups.toast.message.removed=The Group '%s' have been removed
+edit.groups.alert.notEmpty.title=Group '%s' is not empty
+edit.groups.alert.notEmpty.message=The Group contains %d numbers.\nNot empty group couldn't be deleted.
+# Search window
+search.window.title=Search
+search.fields.tooltip=Selected fields:\n%s
+search.fields.tooltip.selectAll=Select all fields
+search.fields.tooltip.SelectNone=Clear selected fields
+search.label.what=Search for:
+search.edit.what.prompt=Enter search text
+search.label.searchOptions=Options:
+search.button=Search
+search.label.options=Search options
+search.button.save=Save search options
+search.button.restore=Restore search options
+search.label.results=Search Results
+search.button.plugins.tooltip=Send numbers list to Plugin
+search.button.simpleSearch=Simple search
+search.button.extSearch=in Extended search
+search.button.searchArchive=in Archive
+search.button.sendAllItems=Send all items
+search.button.sendAllItems.tooltip=Send all items to plugin (if checked) or selected items only
+search.alert.input.title=Search name
+search.alert.input.header=Enter new search name:
+search.alert.input.content=Name:
+search.alert.error.header=Error saving options
+search.alert.error.message.alreadyExists=Name '%s' already exists. Please enter new one.
+search.alert.select.title=Select option
+search.alert.select.header=Search option name selection
+search.alert.select.content=Select name:
+search.alert.info.results.header=Search Results
+search.alert.info.results.content=There are no results was found for your request
+search.log.numbersFound=For search query '%s' found %d number(s)
+search.log.numbersNotFound=For search query '%s' doesn't found any number(s)
+search.log.searchMethodChanged=Search results have been cleared due to search method was changed from 'Search in Archive' to 'Regular Search'
+# search options pane
+options.label.group=Group
+options.label.groupName=Group Name
+options.label.weight=Weight
+options.label.cost=Cost
+options.label.price=Announced Price
+options.label.seats=Seats Amount
+options.label.numberStatus=Number Status
+options.label.numberType=Number Type
+options.label.status=Status
+options.label.createDate=Create date
+options.label.scheduledDate=Scheduled delivery date
+# Main Menu
+menu.group.number=Numbers
+menu.number.add=Add number
+menu.number.update=Update number
+menu.number.updateUncompleted=Update Uncompleted numbers
+menu.number.moveToArchive=Move to archive
+menu.number.addToCustom=Add to custom view
+menu.number.restoreFromArchive=Restore from archive
+menu.number.exit=Exit
+menu.group.moveToGroup=Move to Group
+menu.group.edit=Edit
+menu.edit.newGroup=New Group
+menu.edit.editGroups=Edit Groups
+menu.edit.editPhones=Edit Phones
+menu.edit.editSearchOptions=Edit Search Options
+menu.edit.search=Search
+menu.edit.config=Configuration
+menu.group.view=View
+menu.group.viewMode=View Mode
+menu.group.filterMode=Filtering Mode
+menu.view.detail=Detailed view
+menu.view.showLog=Show Log
+menu.group.plugins=Plugins
+menu.plugins.loadPlugins=Load Plugins
+menu.group.windows=Windows
+menu.windows.customList=Custom numbers list
+menu.windows.archivedList=Archived numbers
+menu.windows.cascade=Show all as cascade
+menu.windows.closeAll=Close all windows
+menu.group.help=Help
+menu.help.about=About
+menu.log.copy=Copy LOG messages
+menu.log.clear=Clear LOG messages
+# Main window alerts
+alert.firstLaunch.title=First launch
+alert.firstLaunch.header=Welcome! There is a first launch of the Application.
+alert.firstLaunch.message=Please fill all necessary configuration fields.
+alert.NoNumber.title=No Uncompleted numbers
+alert.NoNumber.message=There is no Uncompleted numbers in list
+alert.log.NoNumber.message=Auto Update: There is no Uncompleted numbers in list
+alert.CouldNotExit.title=Couldn't exit
+alert.CouldNotExit.message=There is an opened windows potentially with unsaved data.\nClose it and try again
+alert.archive.moveTo.header.numberExists=Error moving number to archive
+alert.archive.moveTo.content.numberExists=The number '%s' already exists in archive.\nRemove it first and try again.
+alert.archive.restore.header.numberExists=Error restoring number from archive
+alert.archive.restore.content.numberExists=The number '%s' already exists in database.\nRestoring impossible
+alert.archive.restore.content.numberNotFoundInArchive=The number '%s' doesn't exist in archive
+alert.archive.title.confirmDelete=Confirm deletion
+alert.archive.header.confirmDelete=Are you sure to permanently remove number '%s'?\nThis is an irreversible operation, it will be impossible to restore number.
+alert.log.number.movedToArchive=The number '%s' moved to archive
+alert.log.number.restoredFromArchive=The number '%s' restored from archive
+alert.log.gettingResponse=Error getting response:
+alert.message.gettingResponse=There was error occurred while getting data from server
+# Main window view modes
+label.vm.tooltip=View mode
+vm.numbers=Numbers
+vm.groups=Groups
+vm.calendarUpdate=Calendar (Update)
+vm.calendarCreate=Calendar (Create)
+# Main window Filtering Mode
+label.fm.filter.tooltip=View filter
+fm.all=All
+fm.uncompleted=Uncompleted
+fm.inbound=Inbound
+fm.outbound=Outbound
+# Add Group window
+group.add.title=Adding new group
+group.add.label.name=Name:
+group.alert.exists.title=Group already exists
+group.alert.exists.message=Group '%s' already exists
+group.alert.EmptyName.title=Empty group name
+group.alert.EmptyName.message=Group name couldn't be empty
+group.message.newGroup=Added new group '%s'
+group.message.movedToGroup=Number '%s' moved to group '%s'
+group.alert.cantMove.header=Can not move number
+group.alert.cantMove.message=Can not move Number '%s'\nto Group it's already in
+# List window commons
+lw.menu.ctx.remove=Remove
+lw.menu.ctx.clear=Clear
+lw.alert.title=Deletion confirmation
+# Custom Number List window
+cnl.title=Custom Numbers List window
+cnl.label=Numbers List:
+cnl.alert.message=Are you sure to remove %d custom numbers from Custom List?
+# Archived Number List window
+anl.title=Archived Numbers List window
+anl.label=Numbers List:
+anl.alert.message=Are you sure to remove %d archived numbers?
+anl.alert.content=This operation couldn't be reverted!
+anl.log.numberRemoved=The number '%s' have been permanently removed
+anl.log.numbersCleared=There was permanently removed all archived numbers
\ No newline at end of file
diff --git a/NovaPoshta/src/main/resources/languages/lang_en.properties b/NovaPoshta/src/main/resources/languages/lang_en.properties
new file mode 100644
index 0000000..51d05d8
--- /dev/null
+++ b/NovaPoshta/src/main/resources/languages/lang_en.properties
@@ -0,0 +1,306 @@
+# English Language locale file
+# Application
+number.type.in=Inbound
+number.type.out=Outbound
+number.type.undef=Undefined
+number.status.new=New
+number.status.error=Error
+number.status.processing=Delivering
+number.status.waiting=Waiting
+number.status.complete=Completed
+# Number item
+item.tooltip.type=Cargo type: %s
+item.tooltip.status=Cargo status: %s
+item.tooltip.added.date=Added date
+item.tooltip.created.date=Created date
+item.tooltip.updated.date=Last updated date
+# Number info
+info.tooltip.comment=User added comment
+info.tooltip.descr=Cargo description
+info.label.group=Group:
+info.tooltip.group=Number's group
+info.label.status=Status:
+info.tooltip.status=Cargo status
+info.label.type=Type:
+info.tooltip.type=Cargo type
+info.label.cost=Cost:
+info.tooltip.cost=Cost of delivery, UAH
+info.label.seats=Seats:
+info.tooltip.seats=Seats amount
+info.label.price=Price:
+info.tooltip.price=Announced Price, UAH
+info.label.weight=Weight:
+info.tooltip.weight=Weight, kg
+info.label.created=Created:
+info.tooltip.created=Date created
+info.label.scheduled=Scheduled:
+info.tooltip.scheduled=Scheduled Delivery Date
+info.label.updated=Updated:
+info.tooltip.updated=Last updated date
+info.label.recipient.name=For:
+info.tooltip.recipient.name=Recipient Full Name
+info.label.recipient.city=in:
+info.tooltip.recipient.city=Recipient's city
+info.label.recipient.warehouse=at:
+info.tooltip.recipient.warehouse=Recipient's warehouse
+info.label.sender.name=From:
+info.tooltip.sender.name=Sender Full Name
+info.label.sender.phone=(%s)
+info.tooltip.sender.phone=Sender phone number
+info.label.sender.city=in:
+info.tooltip.sender.city=Sender's city
+info.label.sender.warehouse=at:
+info.tooltip.sender.warehouse=Sender's Warehouse
+info.tooltip.barcode=Number's Barcode
+info.button.tooltip.copy=Copy to clipboard
+info.button.message.copy=Copied to clipboard
+info.button.tooltip.open=Open in new window
+info.label.detailed=Detailed Info:
+info.field.detailed.name=Field Name
+info.field.detailed.value=Field Value
+info.field.menu.copy.name=Copy Field Name
+info.field.menu.copy.value=Copy Field value
+info.field.menu.copy.kv=Copy Key and Value as K=V
+info.field.menu.copy.kv1=Copy Key and Value as K->V
+info.field.menu.copy.all=Copy All Rows
+# Fields
+number.field.id=ID
+number.field.number=Number
+number.field.group=Group
+number.field.appStatus=Number Status
+number.field.numberType=Number Type
+number.field.comment=User Comment
+number.field.dateCreated=Date Created
+number.field.weight=Weight
+number.field.cost=Cost
+number.field.seatsAmount=Seats Amount
+number.field.description=Description
+number.field.cargoType=Type
+number.field.statusCode=Status Code
+number.field.announcedPrice=Announced Price
+number.field.scheduledDeliveryDate=Scheduled Delivery Date
+number.field.recipientFullName=Recipient Full Name
+number.field.cityRecipient=Recipient's City
+number.field.warehouseRecipient=Recipient's Warehouse
+number.field.warehouseRecipientNumber=Recipient Warehouse's Number
+number.field.phoneRecipient=Recipient's Phone
+number.field.recipientAddress=Recipient's Address
+number.field.citySender=Sender's City
+number.field.phoneSender=Sender's Phone
+number.field.warehouseSender=Sender's Warehouse
+number.field.senderAddress=Sender's Address
+number.field.fullData=Response Full Data
+number.field.created=Created Date
+number.field.updated=Last Updated Date
+number.field.groupName=Group name
+number.field.descr=Describe*
+number.field.autoUpdated=Auto Update
+# Config window
+config.title=Configuration:
+config.label.url=API URL:
+config.label.phone=Phone:
+config.label.language=Language:
+config.label.maxHistory=Search history records:
+config.tooltip.maxHistory=Search history maximum records: from %d to %d\nZero value means 'Do not save search history'
+config.label.maxLogRecords=LOG records:
+config.label.autoUpdate=Enable Auto Update
+config.alert.title=Error in config
+config.alert.message.wrongApiUrl=Field must contain valid NP's API endpoint value
+config.alert.message.wrongPhone=Field must contain valid phone number
+# Detailed Info window
+detail.title=Detailed info for %s
+# Add Number window
+add.title=Adding new number
+add.label.number=Number:
+add.label.type=Type:
+add.label.phone=Phone:
+add.label.update=Auto Update
+add.label.another=Add another
+add.label.comment=Comment:
+add.label.group=Group:
+add.edit.comment.prompt=Comment for new Cargo Number (could be empty)
+add.alert.title.error=Error
+add.alert.message.WrongNumber=Wrong number
+add.alert.message.NumberAlreadyAdded=Number '%s' already added
+add.alert.message.WrongPhone=Wrong phone
+add.tooltip.AddPhone=Add this phone into DB
+add.tooltip.EditPhones=Edit all phones
+add.message.PhoneAdded=The phone '%s' have been added into DB
+add.message.PhoneExists=The phone '%s' already exists in DB
+# Edit Phones window
+edit.phones.title=Edit all pones
+edit.phones.dialog.title=Editing Phones
+edit.phones.newPhone=New Phone number:
+edit.phones.alert.title=Wrong phone number '%s'
+edit.phones.alert.message=There was a wrong phone number entered.\nPlease correct and try again.
+edit.phones.confirm.title=Confirm deletion
+edit.phones.confirm.header=Confirm deletion of '%s'
+edit.phones.confirm.message=Are you sure to remove the phone?
+edit.phones.alert.phoneUsed.title=The '%s' phone is used in number(s)
+edit.phones.alert.phoneUsed.message=Phone used in number(s). So it couldn't be deleted
+# Edit Search Options window
+edit.options.action.moveUp=Move Up
+edit.options.action.moveDn=Move Down
+edit.options.action.add=Add item
+edit.options.action.edit=Edit item
+edit.options.action.apply=Apply changes
+edit.options.action.remove=Remove item
+edit.options.title=Edit all pones
+edit.options.confirm.title=Confirm deletion
+edit.options.confirm.header=Confirm deletion of '%s'
+edit.options.confirm.message=Are you sure to remove the Search Option?
+edit.options.alert.title=Wrong parameter
+edit.options.alert.message=The Search Options' name couldn't be empty.\nPlease correct and try again.
+edit.options.toast.message.applied=Changes have been applied
+edit.options.toast.message.noChanges=There were no changes
+edit.options.toast.message.removed=The option '%s' have been removed
+edit.options.name.newOption=New search options
+edit.options.label.name=Name:
+edit.options.label.text=Search text:
+# Edit Groups window
+edit.groups.title=Edit all groups
+edit.groups.dialog.title=Editing Groups
+edit.groups.newGroup=New Group name:
+edit.groups.alert.title=Group '%s' already exists
+edit.groups.alert.message=Group name you have been entered already exists.\nEnter new one please.
+edit.groups.confirm.title=Confirm deletion
+edit.groups.confirm.header=Confirm deletion of '%s'
+edit.groups.confirm.message=Are you sure to remove the Group?
+edit.groups.toast.message.removed=The Group '%s' have been removed
+edit.groups.alert.notEmpty.title=Group '%s' is not empty
+edit.groups.alert.notEmpty.message=The Group contains %d numbers.\nNot empty group couldn't be deleted.
+# Search window
+search.window.title=Search
+search.fields.tooltip=Selected fields:\n%s
+search.fields.tooltip.selectAll=Select all fields
+search.fields.tooltip.SelectNone=Clear selected fields
+search.label.what=Search for:
+search.edit.what.prompt=Enter search text
+search.label.searchOptions=Search in:
+search.button=Search
+search.label.options=Search options
+search.button.save=Save search options
+search.button.restore=Restore search options
+search.label.results=Search Results
+search.button.plugins.tooltip=Send numbers list to Plugin
+search.button.simpleSearch=Simple search
+search.button.extSearch=in Extended search
+search.button.searchArchive=in Archive
+search.button.sendAllItems=Send all items
+search.button.sendAllItems.tooltip=Send all items to plugin (if checked) or selected items only
+search.alert.input.title=Search name
+search.alert.input.header=Enter new search name:
+search.alert.input.content=Name:
+search.alert.error.header=Error saving options
+search.alert.error.message.alreadyExists=Name '%s' already exists. Please enter new one.
+search.alert.select.title=Select option
+search.alert.select.header=Search option name selection
+search.alert.select.content=Select name:
+search.alert.info.results.header=Search Results
+search.alert.info.results.content=There are no results was found for your request
+search.log.numbersFound=For search query '%s' found %d number(s)
+search.log.numbersNotFound=For search query '%s' doesn't found any number(s)
+search.log.searchMethodChanged=Search results have been cleared due to search method was changed from 'Search in Archive' to 'Regular Search'
+# search options pane
+options.label.group=Group
+options.label.groupName=Group Name
+options.label.weight=Weight
+options.label.cost=Cost
+options.label.price=Announced Price
+options.label.seats=Seats Amount
+options.label.numberStatus=Number Status
+options.label.numberType=Number Type
+options.label.status=Status
+options.label.createDate=Create date
+options.label.scheduledDate=Scheduled delivery date
+# Main Menu
+menu.group.number=Numbers
+menu.number.add=Add number
+menu.number.update=Update number
+menu.number.updateUncompleted=Update Uncompleted numbers
+menu.number.moveToArchive=Move to archive
+menu.number.addToCustom=Add to custom view
+menu.number.restoreFromArchive=Restore from archive
+menu.number.exit=Exit
+menu.group.moveToGroup=Move to Group
+menu.group.edit=Edit
+menu.edit.newGroup=New Group
+menu.edit.editGroups=Edit Groups
+menu.edit.editPhones=Edit Phones
+menu.edit.editSearchOptions=Edit Search Options
+menu.edit.search=Search
+menu.edit.config=Configuration
+menu.group.view=View
+menu.group.viewMode=View Mode
+menu.group.filterMode=Filtering Mode
+menu.view.detail=Detailed view
+menu.view.showLog=Show Log
+menu.group.plugins=Plugins
+menu.plugins.loadPlugins=Load Plugins
+menu.group.windows=Windows
+menu.windows.customList=Custom numbers list
+menu.windows.archivedList=Archived numbers
+menu.windows.cascade=Show all as cascade
+menu.windows.closeAll=Close all windows
+menu.group.help=Help
+menu.help.about=About
+menu.log.copy=Copy LOG messages
+menu.log.clear=Clear LOG messages
+# Main window alerts
+alert.firstLaunch.title=First launch
+alert.firstLaunch.header=Welcome! There is a first launch of the Application.
+alert.firstLaunch.message=Please fill all necessary configuration fields.
+alert.NoNumber.title=No Uncompleted numbers
+alert.NoNumber.message=There is no Uncompleted numbers in list
+alert.log.NoNumber.message=Auto Update: There is no Uncompleted numbers in list
+alert.CouldNotExit.title=Couldn't exit
+alert.CouldNotExit.message=There is an opened windows potentially with unsaved data.\nClose it and try again
+alert.archive.moveTo.header.numberExists=Error moving number to archive
+alert.archive.moveTo.content.numberExists=The number '%s' already exists in archive.\nRemove it first and try again.
+alert.archive.restore.header.numberExists=Error restoring number from archive
+alert.archive.restore.content.numberExists=The number '%s' already exists in database.\nRestoring impossible
+alert.archive.restore.content.numberNotFoundInArchive=The number '%s' doesn't exists in archive
+alert.archive.title.confirmDelete=Confirm deletion
+alert.archive.header.confirmDelete=Are you sure to permanently remove number '%s'?\nThis is an irreversible operation, it will be impossible to restore number.
+alert.log.number.movedToArchive=The number '%s' moved to archive
+alert.log.number.restoredFromArchive=The number '%s' restored from archive
+alert.log.gettingResponse=Error getting response:
+alert.message.gettingResponse=There was error occurred while getting data from server
+# Main window view modes
+label.vm.tooltip=View mode
+vm.numbers=Numbers
+vm.groups=Groups
+vm.calendarUpdate=Calendar (Update)
+vm.calendarCreate=Calendar (Create)
+# Main window Filtering Mode
+label.fm.filter.tooltip=View filter
+fm.all=All
+fm.uncompleted=Uncompleted
+fm.inbound=Inbound
+fm.outbound=Outbound
+# Add Group window
+group.add.title=Adding new group
+group.add.label.name=Name:
+group.alert.exists.title=Group already exists
+group.alert.exists.message=Group '%s' already exists
+group.alert.EmptyName.title=Empty group name
+group.alert.EmptyName.message=Group name couldn't be empty
+group.message.newGroup=Added new group '%s'
+group.message.movedToGroup=Number '%s' moved to group '%s'
+group.alert.cantMove.header=Can not move number
+group.alert.cantMove.message=Can not move Number '%s'\nto Group it's already in
+# List window commons
+lw.menu.ctx.remove=Remove
+lw.menu.ctx.clear=Clear
+lw.alert.title=Deletion confirmation
+# Custom Number List window
+cnl.title=Custom Numbers List window
+cnl.label=Numbers List:
+cnl.alert.message=Are you sure to remove %d custom numbers from Custom List?
+# Archived Number List window
+anl.title=Archived Numbers List window
+anl.label=Numbers List:
+anl.alert.message=Are you sure to remove %d archived numbers?
+anl.alert.content=This operation couldn't be reverted!
+anl.log.numberRemoved=The number '%s' have been permanently removed
+anl.log.numbersCleared=There was permanently removed all archived numbers
\ No newline at end of file
diff --git a/NovaPoshta/src/main/resources/languages/lang_uk.properties b/NovaPoshta/src/main/resources/languages/lang_uk.properties
new file mode 100644
index 0000000..bf764a6
--- /dev/null
+++ b/NovaPoshta/src/main/resources/languages/lang_uk.properties
@@ -0,0 +1,306 @@
+# Ukrainian Language locale file
+# Application
+number.type.in=Вхідний
+number.type.out=Вихідний
+number.type.undef=Не визначено
+number.status.new=Новий
+number.status.error=Помилка
+number.status.processing=Доставляється
+number.status.waiting=Очікує
+number.status.complete=Завершено
+# Number item
+item.tooltip.type=Тип вантажу: %s
+item.tooltip.status=Стан вантажу: %s
+item.tooltip.added.date=Дата додавання у БД
+item.tooltip.created.date=Дата створення у НП
+item.tooltip.updated.date=Дата останнього оновлення
+# Number info
+info.tooltip.comment=Коментар до вантажу, доданий користувачем
+info.tooltip.descr=Опис вантажу
+info.label.group=Група:
+info.tooltip.group=Група, до якої внесено номер
+info.label.status=Стан:
+info.tooltip.status=Стан вантажу
+info.label.type=Тип:
+info.tooltip.type=Тип вантажу
+info.label.cost=Вартість:
+info.tooltip.cost=Вартість доставки, грн
+info.label.seats=Місця:
+info.tooltip.seats=Кількість місць
+info.label.price=Ціна:
+info.tooltip.price=Оголошена ціна, грн
+info.label.weight=Вага:
+info.tooltip.weight=Вага вантажу, кг
+info.label.created=Створено:
+info.tooltip.created=Дата створення
+info.label.scheduled=Заплановано:
+info.tooltip.scheduled=Планова дата доставки
+info.label.updated=Оновлено:
+info.tooltip.updated=Дата останнього оновлення
+info.label.recipient.name=Для:
+info.tooltip.recipient.name=Повне ім'я отримувача
+info.label.recipient.city=у:
+info.tooltip.recipient.city=Місто отримувача
+info.label.recipient.warehouse=до:
+info.tooltip.recipient.warehouse=Склад отримувача
+info.label.sender.name=Від:
+info.tooltip.sender.name=Повне ім'я відправника
+info.label.sender.phone=(%s)
+info.tooltip.sender.phone=Номер телефону відправника
+info.label.sender.city=у:
+info.tooltip.sender.city=Місто відправника
+info.label.sender.warehouse=з:
+info.tooltip.sender.warehouse=Склад відправника
+info.tooltip.barcode=Штрих-код номера
+info.button.tooltip.copy=Скопіювати текст
+info.button.message.copy=Скопійовано
+info.button.tooltip.open=Відкрити у новому вікні
+info.label.detailed=Детальна інформація:
+info.field.detailed.name=Поле
+info.field.detailed.value=Значення
+info.field.menu.copy.name=Копіювати ім'я поля
+info.field.menu.copy.value=Копіювати значення поля
+info.field.menu.copy.kv=Копіювати поле як ім'я=значення
+info.field.menu.copy.kv1=Копіювати поле як ім'я->значення
+info.field.menu.copy.all=Копіювати все
+# Fields
+number.field.id=ID
+number.field.number=Номер
+number.field.group=Група
+number.field.appStatus=Статус номеру
+number.field.numberType=Тип номеру
+number.field.comment=Коментар користувача
+number.field.dateCreated=Дата створення
+number.field.weight=Вага
+number.field.cost=Вартість
+number.field.seatsAmount=Кількість місць
+number.field.description=Опис
+number.field.cargoType=Тип
+number.field.statusCode=Код стану
+number.field.announcedPrice=Оголошена вартість
+number.field.scheduledDeliveryDate=Запланована дата доставки
+number.field.recipientFullName=Повне ім'я Отримувача
+number.field.cityRecipient=Місто Отримувача
+number.field.warehouseRecipient=Відділення Отримувача
+number.field.warehouseRecipientNumber=Номер відділення Отримувача
+number.field.phoneRecipient=Номер телефону Отримувача
+number.field.recipientAddress=Адреса Отримувача
+number.field.citySender=Місто Відправника
+number.field.phoneSender=Номер телефону Відправника
+number.field.warehouseSender=Відділення Відправника
+number.field.senderAddress=Адреса Відправника
+number.field.fullData=Повні дані з сервера
+number.field.created=Створено
+number.field.updated=Оновлено
+number.field.groupName=Ім'я групи
+number.field.descr=Опис*
+number.field.autoUpdated=Автоматичне оновлення
+# Config window
+config.title=Конфігурація:
+config.label.url=API URL:
+config.label.phone=Телефон:
+config.label.language=Мова:
+config.label.maxHistory=Записів у історії пошуку:
+config.tooltip.maxHistory=Кількість записів у історії пошуку: від %d до %d\nНуль означає "Не зберігати історію"
+config.label.maxLogRecords=Записів у журналі:
+config.label.autoUpdate=Увімкнути автоматичне оновлення
+config.alert.title=Error in config
+config.alert.message.wrongApiUrl=У поле має бути правильний URL API НП
+config.alert.message.wrongPhone=У поле має бути правильний номер телефону
+# Detailed Info window
+detail.title=Детально про номер %s
+# Add Number window
+add.title=Додавання нового номеру
+add.label.number=Номер:
+add.label.type=Тип:
+add.label.phone=Телефон:
+add.label.update=Автоматичне оновлення
+add.label.another=Додати інший
+add.label.comment=Коментар:
+add.label.group=Група:
+add.edit.comment.prompt=Коментар для нового номера ТТН (може бути порожнім)
+add.alert.title.error=Помилка
+add.alert.message.WrongNumber=Невірно введений номер
+add.alert.message.NumberAlreadyAdded=Номер '%s' вже додано
+add.alert.message.WrongPhone=Неправильний номер телефону
+add.tooltip.AddPhone=Додати номер телефону до БД
+add.tooltip.EditPhones=Редагувати всі номери телефонів
+add.message.PhoneAdded=Телефон '%s' було додано до БД
+add.message.PhoneExists=Телефон '%s' вже додано до БД
+# Edit Phones window
+edit.phones.title=Редагувати номери телефонів
+edit.phones.dialog.title=Зміна номеру телефону
+edit.phones.newPhone=Новий номер:
+edit.phones.alert.title=Неправильний номер телефону '%s'
+edit.phones.alert.message=Введено неправильний номер телефону.\nВиправте та спробуйте ще раз.
+edit.phones.confirm.title=Підтвердження видалення
+edit.phones.confirm.header=Підтвердіть видалення номеру '%s'
+edit.phones.confirm.message=Ви дійсно хочете видалити вказаний номер?
+edit.phones.alert.phoneUsed.title=Номер телефону '%s' використовується в ТТН
+edit.phones.alert.phoneUsed.message=Номер телефону використовується в ТТН. Т.ч. його не можна видалити
+# Edit Search Options window
+edit.options.action.moveUp=Вгору
+edit.options.action.moveDn=Вниз
+edit.options.action.add=Додати
+edit.options.action.edit=Редагувати
+edit.options.action.apply=Підтвердити зміні
+edit.options.action.remove=Видалити
+edit.options.title=Редагувати налаштування пошуку
+edit.options.confirm.title=Підтвердження видалення
+edit.options.confirm.header=Підтвердіть видалення налаштувань пошуку '%s'
+edit.options.confirm.message=Ви дійсно хочете видалити вказані налаштуваня пошуку?
+edit.options.alert.title=Невірний параметр
+edit.options.alert.message=Ім'я параметрів пошуку не може бути порожнім.\nВиправте та спробуйте ще раз.
+edit.options.toast.message.applied=Зміни застосовано
+edit.options.toast.message.noChanges=Змін не було зроблено
+edit.options.toast.message.removed=Налаштування '%s' було видалено
+edit.options.name.newOption=Нові налаштування пошуку
+edit.options.label.name=Назва:
+edit.options.label.text=Текст для пошуку:
+# Edit Groups window
+edit.groups.title=Редагувати групи
+edit.groups.dialog.title=Редагування груп
+edit.groups.newGroup=Ім'я нової групи:
+edit.groups.alert.title=Група '%s' вже існує
+edit.groups.alert.message=Група з таким іменем вже є.\nВведіт, будь ласка, нове ім'я групи.
+edit.groups.confirm.title=Підтвердження видалення
+edit.groups.confirm.header=Підтвердіть видалення групи '%s'
+edit.groups.confirm.message==Ви дійсно хочете видалити вказану групу?
+edit.groups.toast.message.removed=Групу '%s' було видалено
+edit.groups.alert.notEmpty.title=Група '%s' не порожня
+edit.groups.alert.notEmpty.message=Група містить %d ТТН.\nНепорожню групу видалити неможна.
+# Search window
+search.window.title=Пошук
+search.fields.tooltip=Обрані для пошуку поля:\n%s
+search.fields.tooltip.selectAll=Обрати всі поля
+search.fields.tooltip.SelectNone=Очистити обрані поля
+search.label.what=Що шукати:
+search.edit.what.prompt=Введіть текст для пошуку
+search.label.searchOptions=Шукати у:
+search.button=Шукати
+search.button.options=Налаштування пошуку
+search.button.save=Зберегти налаштування пошуку
+search.button.restore=Відновити налаштування пошуку
+search.label.results=Результати пошуку
+search.button.plugins.tooltip=Надіслати список до плагіну
+search.button.simpleSearch=Простий пошук
+search.button.extSearch=Розширений пошук
+search.button.searchArchive=в архіві
+search.button.sendAllItems=Усі ТТН
+search.button.sendAllItems.tooltip=Надіслати до плагіну усі ТТН (якщо обрано) чи лише вибрані ТТН
+search.alert.input.title=Назва пошуку
+search.alert.input.header=Введіть нову назву для пошуку:
+search.alert.input.content=Назва:
+search.alert.error.header=Помилка зберігання налаштувань
+search.alert.error.message.alreadyExists=Назва '%s' вже збережено. Будь ласка введіть нове.
+search.alert.select.title=Вибір налаштувань
+search.alert.select.header=Вибір назви налаштувань пошуку
+search.alert.select.content=Виберіть назву:
+search.alert.info.results.header=Результати пошуку
+search.alert.info.results.content=За вашим запитом не знайдено жодного результату
+search.log.numbersFound=За запитом '%s' знайдено %d ТТН
+search.log.numbersNotFound=За запитом '%s' не знайдено жодного ТТН
+search.log.searchMethodChanged=Результати пошуку очищено т.я. метод пошуку змінено з 'Шукати в архіві' на 'Звичайний пошук'
+# search options pane
+options.label.group=Група
+options.label.groupName=Назва групи
+options.label.weight=Вага
+options.label.cost=Вартість
+options.label.price=Оголошена вартість
+options.label.seats=Кількість місць
+options.label.numberStatus=Стан накладної
+options.label.numberType=Тип накладної
+options.label.status=Статус
+options.label.createDate=Дата створення
+options.label.scheduledDate=Планова доставка
+# Main Menu
+menu.group.number=Номери
+menu.number.add=Додати номер
+menu.number.update=Оновити номер
+menu.number.updateUncompleted=Оновити незавершені номери
+menu.number.moveToArchive=Перемістити до архіву
+menu.number.addToCustom=Додати до обраних
+menu.number.restoreFromArchive=Відновити з архіву
+menu.number.exit=Вихід
+menu.group.moveToGroup=Перемістити до групи
+menu.group.edit=Змінити
+menu.edit.newGroup=Нова група
+menu.edit.editGroups=Змінити групи
+menu.edit.editPhones=Змінити телефони
+menu.edit.editSearchOptions=Змінити опції пошуку
+menu.edit.search=Пошук
+menu.edit.config=Конфігурація
+menu.group.view=Вигляд
+menu.group.viewMode=Перегляд
+menu.group.filterMode=Фільтр
+menu.view.detail=Детально
+menu.view.showLog=Показати журнал
+menu.group.plugins=Плагіни
+menu.plugins.loadPlugins=Завантажити плагіни
+menu.group.windows=Вікна
+menu.windows.customList=Обрані номери
+menu.windows.archivedList=Архівні номери
+menu.windows.cascade=Показати всі каскадом
+menu.windows.closeAll=Закрити всі
+menu.group.help=Допомога
+menu.help.about=Про додаток
+menu.log.copy=Копіювати
+menu.log.clear=Очистити
+# Main window alerts
+alert.firstLaunch.title=Перший запуск
+alert.firstLaunch.header=Ласкаво прошу! Це перший запуск додатка.
+alert.firstLaunch.message=Будь ласка, заповніть усі необхідні поля конфігурації.
+alert.NoNumber.title=Немає незавершених номерів
+alert.NoNumber.message=Жодного незавершеного номера у списку
+alert.log.NoNumber.message=Автоматичне оновлення: Жодного незавершеного номера у списку
+alert.CouldNotExit.title=Вихід неможливий
+alert.CouldNotExit.message=Є відкриті вікна потенційно з незбереженими даними.\nЗакрийте їх та спробуйте ще раз
+alert.archive.moveTo.header.numberExists=Помилка переміщення ТТН до архіву
+alert.archive.moveTo.content.numberExists=ТТН '%s' вже є в архіві.\nСпершу видаліть цей ТТН з архіву та спробуйте ще раз.
+alert.archive.restore.header.numberExists=Помилка відновлення номеру з архіву
+alert.archive.restore.content.numberExists=ТТН '%s' вже є в основній БД.\nВідновлення неможливе.
+alert.archive.restore.content.numberNotFoundInArchive=ТТН '%s' не знайдено в архіві
+alert.archive.title.confirmDelete=Підтвердження видалення
+alert.archive.header.confirmDelete=Ви впевнені, що ТТН '%s' потрібно видалити?\nЦе незворотня операція, відновити ТТН буде неможливо.
+alert.log.number.movedToArchive=ТТН '%s' переміщено до архіву
+alert.log.number.restoredFromArchive=ТТН '%s' відновлено з архіву
+alert.log.gettingResponse=Помилка отримання даних:
+alert.message.gettingResponse=Виникла помилка отримання даних з серверу
+# Main window view modes
+label.vm.tooltip=Перегляд
+vm.numbers=Номери
+vm.groups=Групи
+vm.calendarUpdate=Календар (Оновлено)
+vm.calendarCreate=Календар (Створено)
+# Main window Filtering Mode
+label.fm.filter.tooltip=Фільтр
+fm.all=Всі
+fm.uncompleted=Незавершені
+fm.inbound=Вхідні
+fm.outbound=Вихідні
+# Add Group window
+group.add.title=Додати нову групу
+group.add.label.name=Назва:
+group.alert.exists.title=Групу вже додано
+group.alert.exists.message=Група '%s' вже існує
+group.alert.EmptyName.title=Порожнє ім'я групи
+group.alert.EmptyName.message=Ім'я групи не може бути порожнім
+group.message.newGroup=Додано нову групу '%s'
+group.message.movedToGroup=ТТН '%s' переміщено до групи '%s'
+group.alert.cantMove.header=Неможливо перемістити ТТН
+group.alert.cantMove.message=Неможливо перемістити ТТН '%s'\nдо групи т.я. він вже у групі
+# List window commons
+lw.menu.ctx.remove=Видалити
+lw.menu.ctx.clear=Очистити
+lw.alert.title=Підтвердження видалення
+# Custom Number List window
+cnl.title=Вікно обраних ТТН
+cnl.label=Список номерів:
+cnl.alert.message=Ви впевнені, що потрібно видалити %d обраних номерів зі списку обраних?
+# Archived Number List window
+anl.title=Вікно архівних ТТН
+anl.label=Список номерів:
+anl.alert.message=Ви впевнеі, що потрібно видалити %d номерів з архіву?
+anl.alert.content=Цю операцію неможливо буде відмінити!
+anl.log.numberRemoved=ТТН '%s' було повністю видалено
+anl.log.numbersCleared=Було повністю видалено всі архівні ТТН
\ No newline at end of file