mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
200 lines
6.9 KiB
Lua
200 lines
6.9 KiB
Lua
--- **Core** - TEXTANDSOUND (MOOSE gettext) system
|
|
--
|
|
-- ## Main Features:
|
|
--
|
|
-- * A GetText for Moose
|
|
-- * Build a set of localized text entries, alongside their sounds and subtitles
|
|
-- * Aimed at class developers to offer localizable language support
|
|
--
|
|
-- ===
|
|
--
|
|
-- ## Example Missions:
|
|
--
|
|
-- Demo missions can be found on [github](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/develop/).
|
|
--
|
|
-- ===
|
|
--
|
|
-- ### Author: **applevangelist**
|
|
-- ## Date: April 2022
|
|
--
|
|
-- ===
|
|
-- @module Core.TEXTANDSOUND
|
|
-- @image MOOSE.JPG
|
|
|
|
--- Text and Sound class.
|
|
-- @type TEXTANDSOUND
|
|
-- @field #string ClassName Name of this class.
|
|
-- @field #string version Versioning.
|
|
-- @field #string lid LID for log entries.
|
|
-- @field #string locale Default locale of this object.
|
|
-- @field #table entries Table of entries.
|
|
-- @field #string textclass Name of the class the texts belong to.
|
|
-- @extends Core.Base#BASE
|
|
|
|
---
|
|
--
|
|
-- @field #TEXTANDSOUND
|
|
TEXTANDSOUND = {
|
|
ClassName = "TEXTANDSOUND",
|
|
version = "0.0.1",
|
|
lid = "",
|
|
locale = "en",
|
|
entries = {},
|
|
textclass = "",
|
|
}
|
|
|
|
--- Text and Sound entry.
|
|
-- @type TEXTANDSOUND.Entry
|
|
-- @field #string Classname Name of the class this entry is for.
|
|
-- @field #string Locale Locale of this entry, defaults to "en".
|
|
-- @field #table Data The list of entries.
|
|
|
|
--- Text and Sound data
|
|
-- @type TEXTANDSOUND.Data
|
|
-- @field #string ID ID of this entry for retrieval.
|
|
-- @field #string Text Text of this entry.
|
|
-- @field #string Soundfile (optional) Soundfile File name of the corresponding sound file.
|
|
-- @field #number Soundlength (optional) Length of the sound file in seconds.
|
|
-- @field #string Subtitle (optional) Subtitle for the sound file.
|
|
|
|
--- Instantiate a new object
|
|
-- @param #TEXTANDSOUND self
|
|
-- @param #string ClassName Name of the class this instance is providing texts for.
|
|
-- @param #string Defaultlocale (Optional) Default locale of this instance, defaults to "en".
|
|
-- @return #TEXTANDSOUND self
|
|
function TEXTANDSOUND:New(ClassName,Defaultlocale)
|
|
-- Inherit everything from BASE class.
|
|
local self=BASE:Inherit(self, BASE:New())
|
|
-- Set some string id for output to DCS.log file.
|
|
self.lid=string.format("%s (%s) | ", self.ClassName, self.version)
|
|
self.locale = Defaultlocale or (_SETTINGS:GetLocale() or "en")
|
|
self.textclass = ClassName or "none"
|
|
self.entries = {}
|
|
local initentry = {} -- #TEXTANDSOUND.Entry
|
|
initentry.Classname = ClassName
|
|
initentry.Data = {}
|
|
initentry.Locale = self.locale
|
|
self.entries[self.locale] = initentry
|
|
self:I(self.lid .. "Instatiated.")
|
|
self:T({self.entries[self.locale]})
|
|
return self
|
|
end
|
|
|
|
--- Add an entry
|
|
-- @param #TEXTANDSOUND self
|
|
-- @param #string Locale Locale to set for this entry, e.g. "de".
|
|
-- @param #string ID Unique(!) ID of this entry under this locale (i.e. use the same ID to get localized text for the entry in another language).
|
|
-- @param #string Text Text for this entry.
|
|
-- @param #string Soundfile (Optional) Sound file name for this entry.
|
|
-- @param #number Soundlength (Optional) Length of the sound file in seconds.
|
|
-- @param #string Subtitle (Optional) Subtitle to be used alongside the sound file.
|
|
-- @return #TEXTANDSOUND self
|
|
function TEXTANDSOUND:AddEntry(Locale,ID,Text,Soundfile,Soundlength,Subtitle)
|
|
self:T(self.lid .. "AddEntry")
|
|
local locale = Locale or self.locale
|
|
local dataentry = {} -- #TEXTANDSOUND.Data
|
|
dataentry.ID = ID or "1"
|
|
dataentry.Text = Text or "none"
|
|
dataentry.Soundfile = Soundfile
|
|
dataentry.Soundlength = Soundlength or 0
|
|
dataentry.Subtitle = Subtitle
|
|
if not self.entries[locale] then
|
|
local initentry = {} -- #TEXTANDSOUND.Entry
|
|
initentry.Classname = self.textclass -- class name entry
|
|
initentry.Data = {} -- data array
|
|
initentry.Locale = locale -- default locale
|
|
self.entries[locale] = initentry
|
|
end
|
|
self.entries[locale].Data[ID] = dataentry
|
|
self:T({self.entries[locale].Data})
|
|
return self
|
|
end
|
|
|
|
--- Get an entry
|
|
-- @param #TEXTANDSOUND self
|
|
-- @param #string ID The unique ID of the data to be retrieved.
|
|
-- @param #string Locale (Optional) The locale of the text to be retrieved - defauls to default locale set with `New()`.
|
|
-- @return #string Text Text or nil if not found and no fallback.
|
|
-- @return #string Soundfile Filename or nil if not found and no fallback.
|
|
-- @return #string Soundlength Length of the sound or 0 if not found and no fallback.
|
|
-- @return #string Subtitle Text for subtitle or nil if not found and no fallback.
|
|
function TEXTANDSOUND:GetEntry(ID,Locale)
|
|
self:T(self.lid .. "GetEntry")
|
|
local locale = Locale or self.locale
|
|
if not self.entries[locale] then
|
|
-- fall back to default "en"
|
|
locale = self.locale
|
|
end
|
|
local Text,Soundfile,Soundlength,Subtitle = nil, nil, 0, nil
|
|
if self.entries[locale] then
|
|
if self.entries[locale].Data then
|
|
local data = self.entries[locale].Data[ID] -- #TEXTANDSOUND.Data
|
|
if data then
|
|
Text = data.Text
|
|
Soundfile = data.Soundfile
|
|
Soundlength = data.Soundlength
|
|
Subtitle = data.Subtitle
|
|
elseif self.entries[self.locale].Data[ID] then
|
|
-- no matching entry, try default
|
|
local data = self.entries[self.locale].Data[ID]
|
|
Text = data.Text
|
|
Soundfile = data.Soundfile
|
|
Soundlength = data.Soundlength
|
|
Subtitle = data.Subtitle
|
|
end
|
|
end
|
|
else
|
|
return nil, nil, 0, nil
|
|
end
|
|
return Text,Soundfile,Soundlength,Subtitle
|
|
end
|
|
|
|
--- Get the default locale of this object
|
|
-- @param #TEXTANDSOUND self
|
|
-- @return #string locale
|
|
function TEXTANDSOUND:GetDefaultLocale()
|
|
self:T(self.lid .. "GetDefaultLocale")
|
|
return self.locale
|
|
end
|
|
|
|
--- Set default locale of this object
|
|
-- @param #TEXTANDSOUND self
|
|
-- @param #string locale
|
|
-- @return #TEXTANDSOUND self
|
|
function TEXTANDSOUND:SetDefaultLocale(locale)
|
|
self:T(self.lid .. "SetDefaultLocale")
|
|
self.locale = locale or "en"
|
|
return self
|
|
end
|
|
|
|
--- Check if a locale exists
|
|
-- @param #TEXTANDSOUND self
|
|
-- @return #boolean outcome
|
|
function TEXTANDSOUND:HasLocale(Locale)
|
|
self:T(self.lid .. "HasLocale")
|
|
return self.entries[Locale] and true or false
|
|
end
|
|
|
|
--- Flush all entries to the log
|
|
-- @param #TEXTANDSOUND self
|
|
-- @return #TEXTANDSOUND self
|
|
function TEXTANDSOUND:FlushToLog()
|
|
self:I(self.lid .. "Flushing entries:")
|
|
local text = string.format("Textclass: %s | Default Locale: %s",self.textclass, self.locale)
|
|
for _,_entry in pairs(self.entries) do
|
|
local entry = _entry -- #TEXTANDSOUND.Entry
|
|
local text = string.format("Textclassname: %s | Locale: %s",entry.Classname, entry.Locale)
|
|
self:I(text)
|
|
for _ID,_data in pairs(entry.Data) do
|
|
local data = _data -- #TEXTANDSOUND.Data
|
|
local text = string.format("ID: %s\nText: %s\nSoundfile: %s With length: %d\nSubtitle: %s",tostring(_ID), data.Text or "none",data.Soundfile or "none",data.Soundlength or 0,data.Subtitle or "none")
|
|
self:I(text)
|
|
end
|
|
end
|
|
return self
|
|
end
|
|
|
|
----------------------------------------------------------------
|
|
-- End TextAndSound
|
|
----------------------------------------------------------------
|