diff --git a/Moose Development/Moose/Ops/CTLD.lua b/Moose Development/Moose/Ops/CTLD.lua index 56653eefb..5c84706c1 100644 --- a/Moose Development/Moose/Ops/CTLD.lua +++ b/Moose Development/Moose/Ops/CTLD.lua @@ -202,7 +202,9 @@ do -- my_ctld.UseC130LoadAndUnload = false -- When set to true, forces the C-130 player to use the C-130J built system to load the cargo onboard and to unload. (Default is false) -- my_ctld.UseC130DynamicCargoAutoBuild = false -- When true (and UseC130LoadAndUnload is true), C-130 DynamicCargo unload completion is bridged to CTLD engineer-path auto-build. -- my_ctld.C130DynamicCargoAutoBuildMergeSeconds = 0 -- Merge window in seconds for C-130 auto-build handoff; set to 0 to disable batching (default). --- my_ctld.locale = "en" -- Language locale to use, available are "en" (default), "de", "fr", "es" and "ru" +-- my_ctld.locale = "en" -- Language locale to use. +-- -- Supported: "en" English (default), "de" German, "fr" French, "es" Spanish, +-- -- "pt-br" Brazilian Portuguese, "ru" Russian, "tr" Turkish, "zh-cn" Simplified Chinese (Mainland China), "zh-tw" Traditional Chinese (Taiwan). -- -- ## 2.1 CH-47 Chinook support -- @@ -1496,9 +1498,42 @@ function CTLD:_InitLocalization() return self end -function CTLD:_GetMenuPluralSuffix(Count, Kind) +--- [User] Set a resolver used to select a CTLD locale for group-specific menus and messages. +-- Supported locales: "en", "de", "fr", "es", "pt-br", "ru", "tr", "zh-cn", "zh-tw". +-- If unset, CTLD keeps using `self.locale` as before. +-- @param #CTLD self +-- @param #function Resolver Function called as `Resolver(self, Group)` and expected to return a locale string. +-- @return #CTLD self +function CTLD:SetGroupLocaleResolver(Resolver) + self.GroupLocaleResolver = Resolver + return self +end + +--- (Internal) Resolve the locale to use for a group-specific CTLD interaction. +-- @param #CTLD self +-- @param Wrapper.Group#GROUP Group Group object. +-- @return #string Locale string. +function CTLD:_GetLocaleForGroup(Group) + if self.GroupLocaleResolver then + local locale = self:GroupLocaleResolver(Group) + if locale and locale ~= "" then return string.lower(tostring(locale)) end + end + return string.lower(tostring(self.locale or "en")) +end + +--- (Internal) Resolve a localized text entry for a group-specific CTLD interaction. +-- @param #CTLD self +-- @param #string ID Translation entry ID. +-- @param Wrapper.Group#GROUP Group Group object. +-- @return #string Localized text entry. +function CTLD:_GetEntryForGroup(ID, Group) + return self.gettext:GetEntry(ID, self:_GetLocaleForGroup(Group)) +end + +function CTLD:_GetMenuPluralSuffix(Count, Kind, Group) local count = tonumber(Count) or 0 - if self.locale == "ru" then + local locale = Group and self:_GetLocaleForGroup(Group) or string.lower(tostring(self.locale or "en")) + if locale == "ru" then local n = math.abs(count) % 100 local d = n % 10 if n >= 11 and n <= 14 then return "ов" end @@ -1506,7 +1541,8 @@ function CTLD:_GetMenuPluralSuffix(Count, Kind) if d >= 2 and d <= 4 then return "а" end return "ов" end - if self.locale == "de" and Kind == "crate" then return count > 1 and "n" or "" end + if locale == "tr" then return "" end + if locale == "de" and Kind == "crate" then return count > 1 and "n" or "" end return count > 1 and "s" or "" end @@ -1630,6 +1666,42 @@ function CTLD:_GetCargoDisplayName(Cargo) return "Unknown" end +--- [User] Set a formatter used for CTLD cargo menu labels. +-- If unset, CTLD keeps using the resolved cargo display name as before. +-- @param #CTLD self +-- @param #function Formatter Function called as `Formatter(self, BaseText, Cargo, Group)` and expected to return display text. +-- @return #CTLD self +function CTLD:SetCargoDisplayFormatter(Formatter) + self.CargoDisplayFormatter = Formatter + return self +end + +--- (Internal) Format cargo display text for menus. +-- @param #CTLD self +-- @param #string BaseText Resolved default cargo display text. +-- @param #CTLD_CARGO Cargo Cargo object. +-- @param Wrapper.Group#GROUP Group Group object. +-- @return #string Cargo display text. +function CTLD:_FormatCargoDisplayText(BaseText, Cargo, Group) + local label = BaseText or self:_GetCargoDisplayName(Cargo) + if self.CargoDisplayFormatter then + local formatted = self:CargoDisplayFormatter(label, Cargo, Group) + if type(formatted) == "string" and formatted ~= "" then + return formatted + end + end + return label +end + +--- (Internal) Resolve and format cargo label for a group-specific CTLD interaction. +-- @param #CTLD self +-- @param #CTLD_CARGO Cargo Cargo object or cargo name. +-- @param Wrapper.Group#GROUP Group Group object. +-- @return #string Cargo display text. +function CTLD:_GetCargoDisplayNameForGroup(Cargo, Group) + return self:_FormatCargoDisplayText(self:_GetCargoDisplayName(Cargo), Cargo, Group) +end + --- (User) Function to allow transport via Combined Arms Trucks. -- @param #CTLD self -- @param #boolean OnOff Switch on (true) or off (false). @@ -2639,7 +2711,7 @@ function CTLD:_EventHandler(EventData) self.Loaded_Cargo[unitname] = nil self.Loaded_Cargo[unitname] = loaded local Group = client:GetGroup() - local msg = self.gettext:GetEntry("CRATE_LOADED_GROUNDCREW",self.locale) + local msg = self:_GetEntryForGroup("CRATE_LOADED_GROUNDCREW", Group) msg = string.format(msg,event.IniDynamicCargoName) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Crate %s loaded by ground crew!",event.IniDynamicCargoName), 10, false, Group) @@ -2695,7 +2767,7 @@ function CTLD:_EventHandler(EventData) end local Group = client:GetGroup() if not self:IsC130J(client, true) then - local msg = self.gettext:GetEntry("CRATE_UNLOADED_GROUNDCREW",self.locale) + local msg = self:_GetEntryForGroup("CRATE_UNLOADED_GROUNDCREW", Group) msg = string.format(msg,event.IniDynamicCargoName) self:_SendMessage(msg, 10, false, Group) end @@ -2861,7 +2933,7 @@ function CTLD:_PreloadCrates(Group, Unit, Cargo, NumberOfCrates) local cancrates = capabilities.crates -- #boolean local cratelimit = capabilities.cratelimit -- #number if not cancrates then - local msg = self.gettext:GetEntry("CHOPPER_CANNOT_CARRY",self.locale) + local msg = self:_GetEntryForGroup("CHOPPER_CANNOT_CARRY", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Sorry this chopper cannot carry crates!", 10, false, Group) return self @@ -2888,7 +2960,7 @@ function CTLD:_PreloadCrates(Group, Unit, Cargo, NumberOfCrates) crate:SetWasDropped(false) table.insert(loaded.Cargo, crate) crate.Positionable = nil - local msg = self.gettext:GetEntry("CRATE_LOADED_ID",self.locale) + local msg = self:_GetEntryForGroup("CRATE_LOADED_ID", Group) msg = string.format(msg,crate:GetID(),crate:GetName()) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Crate ID %d for %s loaded!",crate:GetID(),crate:GetName()), 10, false, Group) @@ -2956,7 +3028,7 @@ function CTLD:_LoadTroops(Group, Unit, Cargotype, Inject) local maxloadable = self:_GetMaxLoadableMass(Unit) if type(instock) == "number" and tonumber(instock) <= 0 and tonumber(instock) ~= -1 and not Inject then -- nothing left over - local msg = self.gettext:GetEntry("ALL_GONE",self.locale) + local msg = self:_GetEntryForGroup("ALL_GONE", Group) msg = string.format(msg,cgoname) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Sorry, all %s are gone!", cgoname), 10, false, Group) @@ -2972,17 +3044,17 @@ function CTLD:_LoadTroops(Group, Unit, Cargotype, Inject) end if not Inject then if not inzone then - local msg = self.gettext:GetEntry("NOT_CLOSE_ENOUGH_LOGISTICS",self.locale) + local msg = self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_LOGISTICS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You are not close enough to a logistics zone!", 10, false, Group) if not self.debug then return self end elseif not grounded and not hoverload then - local msg = self.gettext:GetEntry("NEED_TO_LAND_OR_HOVER_LOAD",self.locale) + local msg = self:_GetEntryForGroup("NEED_TO_LAND_OR_HOVER_LOAD", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to land or hover in position to load!", 10, false, Group) if not self.debug then return self end elseif self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_LOAD_TROOPS",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_LOAD_TROOPS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to load troops!", 10, false, Group) if not self.debug then return self end @@ -3013,12 +3085,12 @@ function CTLD:_LoadTroops(Group, Unit, Cargotype, Inject) loaded.Cargo = {} end if troopsize + numberonboard > trooplimit then - local msg = self.gettext:GetEntry("CRAMMED",self.locale) + local msg = self:_GetEntryForGroup("CRAMMED", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Sorry, we\'re crammed already!", 10, false, Group) return elseif maxloadable < cgonetmass then - local msg = self.gettext:GetEntry("TOO_HEAVY",self.locale) + local msg = self:_GetEntryForGroup("TOO_HEAVY", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Sorry, that\'s too heavy to load!", 10, false, Group) return @@ -3032,7 +3104,7 @@ function CTLD:_LoadTroops(Group, Unit, Cargotype, Inject) loaded.Troopsloaded = loaded.Troopsloaded + troopsize table.insert(loaded.Cargo,loadcargotype) self.Loaded_Cargo[unitname] = loaded - local msg = self.gettext:GetEntry("BOARDED",self.locale) + local msg = self:_GetEntryForGroup("BOARDED", Group) msg = string.format(msg,cgoname) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("%s boarded!", cgoname), 10, false, Group) @@ -3069,7 +3141,7 @@ function CTLD:_FindRepairNearby(Group, Unit, Repairtype) -- found one and matching distance? if nearestGroup == nil or nearestDistance > self.EngineerSearch then - local msg = self.gettext:GetEntry("NO_UNIT_TO_REPAIR",self.locale) + local msg = self:_GetEntryForGroup("NO_UNIT_TO_REPAIR", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("No unit close enough to repair!", 10, false, Group) return nil, nil @@ -3133,7 +3205,7 @@ function CTLD:_RepairObjectFromCrates(Group,Unit,Crates,Build,Number,Engineering if NearestGroup ~= nil then if self.repairtime < 2 then self.repairtime = 30 end -- noob catch if not Engineering then - local msg = self.gettext:GetEntry("REPAIR_STARTED",self.locale) + local msg = self:_GetEntryForGroup("REPAIR_STARTED", Group) msg = string.format(msg,build.Name, self.repairtime) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Repair started using %s taking %d secs", build.Name, self.repairtime), 10, false, Group) @@ -3158,7 +3230,7 @@ function CTLD:_RepairObjectFromCrates(Group,Unit,Crates,Build,Number,Engineering self:__CratesRepairStarted(1,Group,Unit) else if not Engineering then - local msg = self.gettext:GetEntry("CANT_REPAIR_WITH",self.locale) + local msg = self:_GetEntryForGroup("CANT_REPAIR_WITH", Group) msg = string.format(msg,build.Name) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Can't repair this unit with " .. build.Name, 10, false, Group) @@ -3181,13 +3253,13 @@ end local hassecondaries = false if not grounded and not hoverload then - local msg = self.gettext:GetEntry("NEED_TO_LAND_OR_HOVER_LOAD",self.locale) + local msg = self:_GetEntryForGroup("NEED_TO_LAND_OR_HOVER_LOAD", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to land or hover in position to load!", 10, false, Group) if not self.debug then return self end end if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_EXTRACT_TROOPS",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_EXTRACT_TROOPS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to extract troops!", 10, false, Group) if not self.debug then return self end @@ -3230,7 +3302,7 @@ end end if nearestGroup == nil or nearestDistance > extractdistance then - local msg = self.gettext:GetEntry("NO_UNITS_TO_EXTRACT",self.locale) + local msg = self:_GetEntryForGroup("NO_UNITS_TO_EXTRACT", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("No units close enough to extract!", 10, false, Group) return self @@ -3255,7 +3327,7 @@ end end end if Cargotype == nil then - local msg = self.gettext:GetEntry("CANT_ONBOARD",self.locale) + local msg = self:_GetEntryForGroup("CANT_ONBOARD", Group) msg = string.format(msg,groupType) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Can't onboard " .. groupType, 10, false, Group) @@ -3275,7 +3347,7 @@ end loaded.Cargo = {} end if troopsize + numberonboard > trooplimit then - local msg = self.gettext:GetEntry("CRAMMED",self.locale) + local msg = self:_GetEntryForGroup("CRAMMED", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Sorry, we\'re crammed already!", 10, false, Group) nearestGroup.ExtractTime = 0 @@ -3289,9 +3361,9 @@ end loaded.Troopsloaded = loaded.Troopsloaded + troopsize table.insert(loaded.Cargo,loadcargotype) self.Loaded_Cargo[unitname] = loaded - local boardedtext = self.gettext:GetEntry("BOARDED",self.locale) + local boardedtext = self:_GetEntryForGroup("BOARDED", Group) self:ScheduleOnce(running, self._SendMessage, self, string.format(boardedtext, Cargotype.Name), 10, false, Group) - local msg = self.gettext:GetEntry("BOARDING",self.locale) + local msg = self:_GetEntryForGroup("BOARDING", Group) msg = string.format(msg,Cargotype.Name) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("%s boarding!", Cargotype.Name), 10, false, Group) @@ -3361,17 +3433,17 @@ function CTLD:_LoadTroopsQuantity(Group, Unit, Cargo, quantity) end if not inzone then - local msg = self.gettext:GetEntry("NOT_CLOSE_ENOUGH_LOGISTICS",self.locale) + local msg = self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_LOGISTICS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You are not close enough to a logistics zone!", 10, false, Group) if not self.debug then return self end elseif not grounded and not hoverload then - local msg = self.gettext:GetEntry("NEED_TO_LAND_OR_HOVER_LOAD",self.locale) + local msg = self:_GetEntryForGroup("NEED_TO_LAND_OR_HOVER_LOAD", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to land or hover in position to load!", 10, false, Group) if not self.debug then return self end elseif self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_LOAD_TROOPS",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_LOAD_TROOPS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to load troops!", 10, false, Group) if not self.debug then return self end @@ -3387,7 +3459,7 @@ function CTLD:_LoadTroopsQuantity(Group, Unit, Cargo, quantity) timer.scheduleFunction(function() self.suppressmessages = prevSuppress local dname = Cargo:GetName() - local msg = self.gettext:GetEntry("LOADED_FULL",self.locale) + local msg = self:_GetEntryForGroup("LOADED_FULL", Group) msg = string.format(msg,n, dname) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Loaded %d %s.", n, dname), 10, false, Group) @@ -3417,8 +3489,8 @@ function CTLD:_AddTroopQuantityMenus(Group, Unit, parentMenu, cargoObj) if trooplimit > 0 then local space = trooplimit - onboard if space < troopsize then - local msg = self.gettext:GetEntry("MENU_TROOP_LIMIT",self.locale) - if type(stock) == "number" and stock == 0 then msg = self.gettext:GetEntry("MENU_OUT_OF_STOCK",self.locale) end + local msg = self:_GetEntryForGroup("MENU_TROOP_LIMIT", Group) + if type(stock) == "number" and stock == 0 then msg = self:_GetEntryForGroup("MENU_OUT_OF_STOCK", Group) end --local msg = "Troop limit reached" --if type(stock) == "number" and stock == 0 then msg = "Out of stock" end MENU_GROUP_COMMAND:New(Group, msg, parentMenu, function() end) @@ -3476,7 +3548,7 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum if type(stock) == "number" and stock >= 0 then availableSets = math.floor(stock) if availableSets <= 0 then - MENU_GROUP_COMMAND:New(Group, self.gettext:GetEntry("MENU_OUT_OF_STOCK",self.locale), parentMenu, function() end) + MENU_GROUP_COMMAND:New(Group, self:_GetEntryForGroup("MENU_OUT_OF_STOCK", Group), parentMenu, function() end) return self end if availableSets < maxQuantity then @@ -3561,10 +3633,10 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum else local msg if maxMassSets and (not capacitySets or capacitySets >= 1) and maxMassSets < 1 then - msg = self.gettext:GetEntry("WEIGHT_LIMIT",self.locale) + msg = self:_GetEntryForGroup("WEIGHT_LIMIT", Group) --msg = "Weight limit reached" else - msg = self.gettext:GetEntry("CRATE_LIMIT",self.locale) + msg = self:_GetEntryForGroup("CRATE_LIMIT", Group) --msg = "Crate limit reached" end MENU_GROUP_COMMAND:New(Group, msg, parentMenu, self._SendMessage, self, msg, 10, false, Group) @@ -3573,23 +3645,23 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum end if canLoad and not isHerc and not suppressGetAndLoad then - MENU_GROUP_COMMAND:New(Group, self.gettext:GetEntry("MENU_GET",self.locale), parentMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, 1) - MENU_GROUP_COMMAND:New(Group, self.gettext:GetEntry("MENU_GET_AND_LOAD",self.locale), parentMenu, self._GetAndLoad, self, Group, Unit, cargoObj, 1) + MENU_GROUP_COMMAND:New(Group, self:_GetEntryForGroup("MENU_GET", Group), parentMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, 1) + MENU_GROUP_COMMAND:New(Group, self:_GetEntryForGroup("MENU_GET_AND_LOAD", Group), parentMenu, self._GetAndLoad, self, Group, Unit, cargoObj, 1) else local msg if not isHerc and not suppressGetAndLoad then if maxMassSets and (not capacitySets or capacitySets >= 1) and maxMassSets < 1 then - msg = self.gettext:GetEntry("WEIGHT_LIMIT",self.locale) + msg = self:_GetEntryForGroup("WEIGHT_LIMIT", Group) --msg = "Weight limit reached" else - msg = self.gettext:GetEntry("CRATE_LIMIT",self.locale) + msg = self:_GetEntryForGroup("CRATE_LIMIT", Group) --msg = "Crate limit reached" end MENU_GROUP_COMMAND:New(Group, msg, parentMenu, self._SendMessage, self, msg, 10, false, Group) if canPartiallyLoad and (cgotype ~= CTLD_CARGO.Enum.STATIC) and (not suppressGetAndLoad) then - MENU_GROUP_COMMAND:New(Group, self.gettext:GetEntry("MENU_GET_ANYWAY",self.locale), parentMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, 1) + MENU_GROUP_COMMAND:New(Group, self:_GetEntryForGroup("MENU_GET_ANYWAY", Group), parentMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, 1) - MENU_GROUP_COMMAND:New(Group, self.gettext:GetEntry("MENU_PARTIALLY_LOAD",self.locale), parentMenu, self._GetAndLoad, self, Group, Unit, cargoObj, 1, true) + MENU_GROUP_COMMAND:New(Group, self:_GetEntryForGroup("MENU_PARTIALLY_LOAD", Group), parentMenu, self._GetAndLoad, self, Group, Unit, cargoObj, 1, true) end end end @@ -3608,8 +3680,8 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum if canLoad and not isHerc and not suppressGetAndLoad then local qMenu = MENU_GROUP:New(Group, label, parentMenu) - MENU_GROUP_COMMAND:New(Group, self.gettext:GetEntry("MENU_GET",self.locale), qMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, quantity) - MENU_GROUP_COMMAND:New(Group, self.gettext:GetEntry("MENU_GET_AND_LOAD",self.locale), qMenu, self._GetAndLoad, self, Group, Unit, cargoObj, quantity) + MENU_GROUP_COMMAND:New(Group, self:_GetEntryForGroup("MENU_GET", Group), qMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, quantity) + MENU_GROUP_COMMAND:New(Group, self:_GetEntryForGroup("MENU_GET_AND_LOAD", Group), qMenu, self._GetAndLoad, self, Group, Unit, cargoObj, quantity) else MENU_GROUP_COMMAND:New(Group, label, parentMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, quantity) end @@ -3645,7 +3717,7 @@ function CTLD:_C130GetUnits(Group, Unit, Name) end end if not cfg then - local msg = self.gettext:GetEntry("NO_UNIT_CONFIG",self.locale) + local msg = self:_GetEntryForGroup("NO_UNIT_CONFIG", Group) msg = string.format(msg,Name) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("No unit configuration found for "..tostring(Name),10,false,Group) @@ -3653,7 +3725,7 @@ function CTLD:_C130GetUnits(Group, Unit, Name) end local stock = cfg.Stock if type(stock) == "number" and stock ~= -1 and stock <= 0 then - local msg = self.gettext:GetEntry("ALL_GONE",self.locale) + local msg = self:_GetEntryForGroup("ALL_GONE", Group) msg = string.format(msg,cfg.Name or "units") self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Sorry, all %s are gone!",cfg.Name or "units"),10,false,Group) @@ -3661,7 +3733,7 @@ function CTLD:_C130GetUnits(Group, Unit, Name) end local inzone = self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD) if not inzone then - local msg = self.gettext:GetEntry("NOT_CLOSE_ENOUGH_LOGISTICS",self.locale) + local msg = self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_LOGISTICS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You are not close enough to a logistics zone!",10,false,Group) return self @@ -3703,7 +3775,7 @@ function CTLD:_C130GetUnits(Group, Unit, Name) if nearbyCount >= maxUnitsNearby then break end end if nearbyCount >= maxUnitsNearby then - local msg = self.gettext:GetEntry("TOO_MANY_UNITS_NEARBY",self.locale) + local msg = self:_GetEntryForGroup("TOO_MANY_UNITS_NEARBY", Group) msg = string.format(msg,maxUnitsNearby) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("You already have %d units nearby!",maxUnitsNearby),10,false,Group) @@ -3756,7 +3828,7 @@ function CTLD:_C130GetUnits(Group, Unit, Name) if type(stock) == "number" and stock ~= -1 then cfg.Stock = stock - 1 end - local msg = self.gettext:GetEntry("DEPLOYED_NEAR_YOU",self.locale) + local msg = self:_GetEntryForGroup("DEPLOYED_NEAR_YOU", Group) msg = string.format(msg,cfg.Name or "selection") self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("%s have been deployed near you!",cfg.Name or "selection"),10,false,Group) @@ -3807,7 +3879,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppress local cgoname = Cargo:GetName() local instock = Cargo:GetStock() if type(instock) == "number" and tonumber(instock) <= 0 and tonumber(instock) ~= -1 then - local msg = self.gettext:GetEntry("RAN_OUT_OF",self.locale) + local msg = self:_GetEntryForGroup("RAN_OUT_OF", Group) msg = string.format(msg,cgoname) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Sorry, we ran out of %s", cgoname), 10, false, Group) @@ -3839,7 +3911,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppress end if not inzone then - local msg = self.gettext:GetEntry("NOT_CLOSE_ENOUGH_LOGISTICS",self.locale) + local msg = self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_LOGISTICS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You are not close enough to a logistics zone!", 10, false, Group) if not self.debug then return self end @@ -3852,7 +3924,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppress if unitcoord then if not location:IsCoordinateInZone(unitcoord) then -- no we're not at the right spot - local msg = self.gettext:GetEntry("CARGO_NOT_AVAILABLE_ZONE",self.locale) + local msg = self:_GetEntryForGroup("CARGO_NOT_AVAILABLE_ZONE", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("The requested cargo is not available in this zone!", 10, false, Group) if not self.debug then return false end @@ -3866,7 +3938,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppress local loaddist = self.CrateDistance or 35 local nearcrates, numbernearby = self:_FindCratesNearby(Group, Unit, loaddist, true, true, true) if numbernearby >= canloadcratesno and (not drop) and (not pack) then - local msg = self.gettext:GetEntry("ENOUGH_CRATES_NEARBY",self.locale) + local msg = self:_GetEntryForGroup("ENOUGH_CRATES_NEARBY", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("There are enough crates nearby already! Take care of those first!", 10, false, Group) return false @@ -3884,7 +3956,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppress local number = requestNumber --#number local cratesneeded = cargotype:GetCratesNeeded() --#number local cratename = cargotype:GetName() - local cratedisplayname = self:_GetCargoDisplayName(cargotype) + local cratedisplayname = self:_GetCargoDisplayNameForGroup(cargotype, Group) local cratetemplate = "Container"-- #string local cgotype = cargotype:GetType() local cgomass = cargotype:GetMass() @@ -4162,10 +4234,10 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppress Cargo:RemoveStock(requestedSets) self:_RefreshCrateQuantityMenus(Group, Unit, Cargo) end - local text = string.format(self.gettext:GetEntry("CRATES_POSITIONED",self.locale), number, cratedisplayname) + local text = string.format(self:_GetEntryForGroup("CRATES_POSITIONED", Group), number, cratedisplayname) --local text = string.format("%d crates for %s have been positioned near you!", number, cratedisplayname) if drop then - text = string.format(self.gettext:GetEntry("CRATES_DROPPED",self.locale), number, cratedisplayname) + text = string.format(self:_GetEntryForGroup("CRATES_DROPPED", Group), number, cratedisplayname) --text = string.format("%d crates for %s have been dropped!", number, cratedisplayname) self:__CratesDropped(1, Group, Unit, droppedcargo) else @@ -4296,7 +4368,7 @@ function CTLD:_ListCratesNearby( _group, _unit) end self:_SendMessage(text:Text(), 30, true, _group,true) else - local msg = self.gettext:GetEntry("NO_CRATES_WITHIN",self.locale) + local msg = self:_GetEntryForGroup("NO_CRATES_WITHIN", _group) msg = string.format(msg,finddist) self:_SendMessage(msg, 10, false, _group,true) --self:_SendMessage(string.format("No (loadable) crates within %d meters!",finddist), 10, false, _group) @@ -4337,7 +4409,7 @@ function CTLD:_C130RemoveUnitsNearby(_group,_unit) local cname = cfg.Name or "Unit" table.insert(removedTable, { groupName = gr:GetName(), name = cname, template = tName, coordinate = gr:GetCoordinate() }) gr:Destroy(false) - local msg = self.gettext:GetEntry("UNITS_REMOVED",self.locale) + local msg = self:_GetEntryForGroup("UNITS_REMOVED", _group) msg = string.format(msg,cname) self:_SendMessage(msg, 10, false, _group) --self:_SendMessage(cname.." have been removed",10,false,_group) @@ -4352,7 +4424,7 @@ function CTLD:_C130RemoveUnitsNearby(_group,_unit) end end if not removedAny then - local msg = self.gettext:GetEntry("NOTHING_TO_REMOVE",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_TO_REMOVE", _group) self:_SendMessage(msg, 10, false, _group) --self:_SendMessage("Nothing to remove at this distance pilot!",10,false,_group) else @@ -4408,7 +4480,7 @@ function CTLD:_RemoveCratesNearby(_group, _unit) -- Trigger FSM event for removed crates. self:__RemoveCratesNearby(1, _group, _unit, crates) else - local msg = self.gettext:GetEntry("NO_CRATES_WITHIN",self.locale) + local msg = self:_GetEntryForGroup("NO_CRATES_WITHIN", _group) msg = string.format(msg,finddist) self:_SendMessage(msg, 10, false, _group,true) --self:_SendMessage(string.format("No (loadable) crates within %d meters!",finddist),10,false,_group) @@ -4533,7 +4605,7 @@ function CTLD:_LoadCratesNearby(Group, Unit) -- Door check if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to load cargo!", 10, false, Group) if not self.debug then return self end @@ -4545,15 +4617,15 @@ function CTLD:_LoadCratesNearby(Group, Unit) -- --> hover or land if not forcedhover ----------------------------------------- if not cancrates then - local msg = self.gettext:GetEntry("CHOPPER_CANNOT_CARRY",self.locale) + local msg = self:_GetEntryForGroup("CHOPPER_CANNOT_CARRY", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Sorry this chopper cannot carry crates!", 10, false, Group) elseif self.forcehoverload and not canhoverload then - local msg = self.gettext:GetEntry("HOVER_OVER_CRATES",self.locale) + local msg = self:_GetEntryForGroup("HOVER_OVER_CRATES", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Hover over the crates to pick them up!", 10, false, Group) elseif not grounded and not canhoverload then - local msg = self.gettext:GetEntry("LAND_OR_HOVER_OVER_CRATES",self.locale) + local msg = self:_GetEntryForGroup("LAND_OR_HOVER_OVER_CRATES", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Land or hover over the crates to pick them up!", 10, false, Group) else @@ -4578,12 +4650,12 @@ function CTLD:_LoadCratesNearby(Group, Unit) if number == 0 and self.hoverautoloading then return self elseif number == 0 then - local msg = self.gettext:GetEntry("NO_LOADABLE_CRATES",self.locale) + local msg = self:_GetEntryForGroup("NO_LOADABLE_CRATES", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Sorry, no loadable crates nearby or max cargo weight reached!", 10, false, Group) return self elseif numberonboard == cratelimit then - local msg = self.gettext:GetEntry("FULLY_LOADED",self.locale) + local msg = self:_GetEntryForGroup("FULLY_LOADED", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Sorry, we are fully loaded!", 10, false, Group) return self @@ -4632,24 +4704,24 @@ function CTLD:_LoadCratesNearby(Group, Unit) if needed > 1 then if fullSets > 0 and leftover == 0 then - local msg = self.gettext:GetEntry("LOADED_FULL",self.locale) - msg = string.format(msg,fullSets, cName) + local msg = self:_GetEntryForGroup("LOADED_FULL", Group) + msg = string.format(msg,fullSets, self:_GetCargoDisplayNameForGroup(cName, Group)) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Loaded %d %s.", fullSets, cName), 10, false, Group) elseif fullSets > 0 and leftover > 0 then - local msg = self.gettext:GetEntry("LOADED_SETS_LEFTOVER",self.locale) - msg = string.format(msg,fullSets, cName, leftover) + local msg = self:_GetEntryForGroup("LOADED_SETS_LEFTOVER", Group) + msg = string.format(msg,fullSets, self:_GetCargoDisplayNameForGroup(cName, Group), leftover) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Loaded %d %s(s), with %d leftover crate(s).", fullSets, cName, leftover), 10, false, Group) else - local msg = self.gettext:GetEntry("LOADED_PARTIAL",self.locale) - msg = string.format(msg,loadedHere, needed, cName) + local msg = self:_GetEntryForGroup("LOADED_PARTIAL", Group) + msg = string.format(msg,loadedHere, needed, self:_GetCargoDisplayNameForGroup(cName, Group)) self:_SendMessage(msg, 15, false, Group) --self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s.", loadedHere, needed, cName), 15, false, Group) end else - local msg = self.gettext:GetEntry("LOADED_SETS",self.locale) - msg = string.format(msg,loadedHere, cName) + local msg = self:_GetEntryForGroup("LOADED_SETS", Group) + msg = string.format(msg,loadedHere, self:_GetCargoDisplayNameForGroup(cName, Group)) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Loaded %d %s(s).", loadedHere, cName), 10, false, Group) end @@ -4856,7 +4928,7 @@ function CTLD:_ListCargo(Group, Unit) local text = report:Text() self:_SendMessage(text, 30, true, Group,true) else - local msg = self.gettext:GetEntry("NOTHING_LOADED",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_LOADED", Group) msg = string.format(msg,trooplimit, cratelimit, maxloadable) self:_SendMessage(msg, 10, false, Group,true) --self:_SendMessage(string.format("Nothing loaded!\nTroop limit: %d | Crate limit %d | Weight limit %d kgs", trooplimit, cratelimit, maxloadable), 10, false, Group) @@ -4952,7 +5024,7 @@ function CTLD:_ListInventory(Group, Unit) local text = report:Text() self:_SendMessage(text, 30, true, Group,true) else - local msg = self.gettext:GetEntry("NOTHING_IN_STOCK",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_IN_STOCK", Group) self:_SendMessage(msg, 10, false, Group,true) --self:_SendMessage(string.format("Nothing in stock!"), 10, false, Group) end @@ -5039,7 +5111,7 @@ function CTLD:_UnloadTroops(Group, Unit) local droppingatbase = false local canunload = true if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_UNLOAD_TROOPS",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_UNLOAD_TROOPS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to unload troops!", 10, false, Group) if not self.debug then return self end @@ -5138,20 +5210,22 @@ function CTLD:_UnloadTroops(Group, Unit) end -- if type end end -- cargotable loop local parts = {} + local troopLabel = self:_GetEntryForGroup("TROOPS_LABEL", Group) + local engineerLabel = self:_GetEntryForGroup("ENGINEERS_LABEL", Group) for nName,nCount in pairs(deployedTroopsByName) do - parts[#parts + 1] = tostring(nCount).."x Troops "..nName + parts[#parts + 1] = tostring(nCount).."x "..troopLabel.." "..nName end for nName,nCount in pairs(deployedEngineersByName) do - parts[#parts + 1] = tostring(nCount).."x Engineers "..nName + parts[#parts + 1] = tostring(nCount).."x "..engineerLabel.." "..nName end if #parts > 0 then - local msg = self.gettext:GetEntry("DROPPED_INTO_ACTION",self.locale) + local msg = self:_GetEntryForGroup("DROPPED_INTO_ACTION", Group) msg = string.format(msg,table.concat(parts, ", ")) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Dropped "..table.concat(parts, ", ").." into action!", 10, false, Group) end else -- droppingatbase - local msg = self.gettext:GetEntry("TROOPS_RETURNED",self.locale) + local msg = self:_GetEntryForGroup("TROOPS_RETURNED", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Troops have returned to base!", 10, false, Group) self:__TroopsRTB(1, Group, Unit, zonename, zone) @@ -5196,11 +5270,11 @@ function CTLD:_UnloadTroops(Group, Unit) self:_RefreshTroopQuantityMenus(Group, Unit, nil) else if IsHerc then - local msg = self.gettext:GetEntry("NOTHING_LOADED_AIRDROP",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_LOADED_AIRDROP", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Nothing loaded or not within airdrop parameters!", 10, false, Group) else - local msg = self.gettext:GetEntry("NOTHING_LOADED_HOVER",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_LOADED_HOVER", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Nothing loaded or not hovering within parameters!", 10, false, Group) end @@ -5218,7 +5292,7 @@ function CTLD:_UnloadCrates(Group, Unit) if not self.dropcratesanywhere then -- #1570 local inzone, zonename, zone, distance = self:IsUnitInZone(Unit,CTLD.CargoZoneType.DROP) if not inzone then - local msg = self.gettext:GetEntry("NOT_CLOSE_ENOUGH_DROP",self.locale) + local msg = self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_DROP", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You are not close enough to a drop zone!", 10, false, Group) if not self.debug then @@ -5227,7 +5301,7 @@ function CTLD:_UnloadCrates(Group, Unit) end end if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_DROP_CARGO",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_DROP_CARGO", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to drop cargo!", 10, false, Group) if not self.debug then return self end @@ -5265,24 +5339,24 @@ function CTLD:_UnloadCrates(Group, Unit) local full = math.floor(count/needed) local left = count % needed if full > 0 and left == 0 then - local msg = self.gettext:GetEntry("DROPPED_FULL",self.locale) - msg = string.format(msg,full,cname) + local msg = self:_GetEntryForGroup("DROPPED_FULL", Group) + msg = string.format(msg,full,self:_GetCargoDisplayNameForGroup(cname, Group)) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Dropped %d %s.",full,cname),10,false,Group) elseif full > 0 and left > 0 then - local msg = self.gettext:GetEntry("DROPPED_SETS_LEFTOVER",self.locale) - msg = string.format(msg,full,cname,left) + local msg = self:_GetEntryForGroup("DROPPED_SETS_LEFTOVER", Group) + msg = string.format(msg,full,self:_GetCargoDisplayNameForGroup(cname, Group),left) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Dropped %d %s(s), with %d leftover crate(s).",full,cname,left),10,false,Group) else - local msg = self.gettext:GetEntry("DROPPED_PARTIAL",self.locale) - msg = string.format(msg,count,needed,cname) + local msg = self:_GetEntryForGroup("DROPPED_PARTIAL", Group) + msg = string.format(msg,count,needed,self:_GetCargoDisplayNameForGroup(cname, Group)) self:_SendMessage(msg, 15, false, Group) --self:_SendMessage(string.format("Dropped %d/%d crate(s) of %s.",count,needed,cname),15,false,Group) end else - local msg = self.gettext:GetEntry("DROPPED_SETS",self.locale) - msg = string.format(msg,count,cname) + local msg = self:_GetEntryForGroup("DROPPED_SETS", Group) + msg = string.format(msg,count,self:_GetCargoDisplayNameForGroup(cname, Group)) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Dropped %d %s(s).",count,cname),10,false,Group) end @@ -5312,11 +5386,11 @@ function CTLD:_UnloadCrates(Group, Unit) self:_RefreshCrateQuantityMenus(Group, Unit, nil) else if IsHerc then - local msg = self.gettext:GetEntry("NOTHING_LOADED_AIRDROP",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_LOADED_AIRDROP", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Nothing loaded or not within airdrop parameters!", 10, false, Group) else - local msg = self.gettext:GetEntry("NOTHING_LOADED_HOVER",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_LOADED_HOVER", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Nothing loaded or not hovering within parameters!", 10, false, Group) end @@ -5352,7 +5426,7 @@ function CTLD:_BuildCrates(Group, Unit,Engineering,MultiDrop,NotifyGroup) if self:IsFixedWing(Unit) and self.enableFixedWing and not Engineering then local speed = Unit:GetVelocityKMH() if speed > 1 then - local msg = self.gettext:GetEntry("NEED_TO_LAND_BUILD",self.locale) + local msg = self:_GetEntryForGroup("NEED_TO_LAND_BUILD", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to land / stop to build something, Pilot!", 10, false, Group) return self @@ -5362,7 +5436,7 @@ function CTLD:_BuildCrates(Group, Unit,Engineering,MultiDrop,NotifyGroup) -- are we in a load zone? local inloadzone = self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD) if inloadzone then - local msg = self.gettext:GetEntry("CANNOT_BUILD_LOADING_AREA",self.locale) + local msg = self:_GetEntryForGroup("CANNOT_BUILD_LOADING_AREA", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You cannot build in a loading area, Pilot!", 10, false, Group) return self @@ -5512,7 +5586,7 @@ function CTLD:_BuildCrates(Group, Unit,Engineering,MultiDrop,NotifyGroup) self:_SendMessage(msg, 15, false, startMsgGroup) end else - local msg = self.gettext:GetEntry("BUILD_STARTED",self.locale) + local msg = self:_GetEntryForGroup("BUILD_STARTED", startMsgGroup) msg = string.format(msg,self.buildtime) if startMsgGroup then self:_SendMessage(msg, 15, false, startMsgGroup) @@ -5587,7 +5661,7 @@ function CTLD:_BuildCrates(Group, Unit,Engineering,MultiDrop,NotifyGroup) else if not Engineering then - local msg = self.gettext:GetEntry("NO_CRATES_WITHIN_PLAIN",self.locale) + local msg = self:_GetEntryForGroup("NO_CRATES_WITHIN_PLAIN", Group) msg = string.format(msg,finddist) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("No crates within %d meters!",finddist), 10, false, Group) @@ -5622,7 +5696,7 @@ function CTLD:_FindPackableGroupsNearby(Group, Unit) local generic = self:GetGenericCargoObjectFromGroupName(gr:GetName()) local cargo = generic and self:_FindCratesCargoObject(generic:GetName() or generic.Name) or nil if cargo then - local display = self:_GetCargoDisplayName(cargo) + local display = self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargo), cargo, Group) packable[#packable + 1] = { group = gr, groupName = gr:GetName(), @@ -5731,12 +5805,12 @@ function CTLD:_LoadPackedCratesByIds(Group, Unit, crateIds, cargoName) local grounded = not self:IsUnitInAir(Unit) local hover = self:CanHoverLoad(Unit) if not grounded and not hover then - local msg = self.gettext:GetEntry("MUST_LAND_OR_HOVER_CRATES",self.locale) + local msg = self:_GetEntryForGroup("MUST_LAND_OR_HOVER_CRATES", Group) self:_SendMessage(msg, 10, false, Group) return self end if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO", Group) self:_SendMessage(msg, 10, false, Group) return self end @@ -5762,7 +5836,7 @@ function CTLD:_LoadPackedCratesByIds(Group, Unit, crateIds, cargoName) end if #matchingCrates == 0 then - local msg = self.gettext:GetEntry("NO_NAMED_CRATES_IN_RANGE",self.locale) + local msg = self:_GetEntryForGroup("NO_NAMED_CRATES_IN_RANGE", Group) msg = string.format(msg, cargoName or "selection") self:_SendMessage(msg, 10, false, Group) self:_RefreshPackMenus(Group, Unit) @@ -5776,7 +5850,7 @@ function CTLD:_LoadPackedCratesByIds(Group, Unit, crateIds, cargoName) local capabilities = self:_GetUnitCapabilities(Unit) local capacity = capabilities.cratelimit or 0 if loadedData.Cratesloaded >= capacity then - local msg = self.gettext:GetEntry("NO_MORE_CAPACITY",self.locale) + local msg = self:_GetEntryForGroup("NO_MORE_CAPACITY", Group) self:_SendMessage(msg, 10, false, Group) self:_RefreshPackMenus(Group, Unit) return self @@ -5785,7 +5859,7 @@ function CTLD:_LoadPackedCratesByIds(Group, Unit, crateIds, cargoName) local spaceLeft = capacity - loadedData.Cratesloaded local toLoad = math.min(#matchingCrates, needed, spaceLeft) if toLoad < 1 then - local msg = self.gettext:GetEntry("CANNOT_LOAD_NONE_OR_FULL",self.locale) + local msg = self:_GetEntryForGroup("CANNOT_LOAD_NONE_OR_FULL", Group) self:_SendMessage(msg, 10, false, Group) self:_RefreshPackMenus(Group, Unit) return self @@ -5810,9 +5884,9 @@ function CTLD:_LoadPackedCratesByIds(Group, Unit, crateIds, cargoName) self:_CleanupTrackedCrates(crateIDsLoaded) local loadedHere = toLoad - local displayName = cargoName or (matchingCrates[1]:GetName() or "selection") + local displayName = self:_GetCargoDisplayNameForGroup(cargoName or (matchingCrates[1]:GetName() or "selection"), Group) if loadedHere < needed and loadedData.Cratesloaded >= capacity then - local msg = self.gettext:GetEntry("LOADED_PARTIAL_LIMIT",self.locale) + local msg = self:_GetEntryForGroup("LOADED_PARTIAL_LIMIT", Group) msg = string.format(msg, loadedHere, needed, displayName) self:_SendMessage(msg, 10, false, Group) else @@ -5820,20 +5894,20 @@ function CTLD:_LoadPackedCratesByIds(Group, Unit, crateIds, cargoName) local leftover = loadedHere % needed if needed > 1 then if fullSets > 0 and leftover == 0 then - local msg = self.gettext:GetEntry("LOADED_FULL",self.locale) + local msg = self:_GetEntryForGroup("LOADED_FULL", Group) msg = string.format(msg, fullSets, displayName) self:_SendMessage(msg, 10, false, Group) elseif fullSets > 0 and leftover > 0 then - local msg = self.gettext:GetEntry("LOADED_SETS_LEFTOVER",self.locale) + local msg = self:_GetEntryForGroup("LOADED_SETS_LEFTOVER", Group) msg = string.format(msg, fullSets, displayName, leftover) self:_SendMessage(msg, 10, false, Group) else - local msg = self.gettext:GetEntry("LOADED_PARTIAL",self.locale) + local msg = self:_GetEntryForGroup("LOADED_PARTIAL", Group) msg = string.format(msg, loadedHere, needed, displayName) self:_SendMessage(msg, 15, false, Group) end else - local msg = self.gettext:GetEntry("LOADED_SETS",self.locale) + local msg = self:_GetEntryForGroup("LOADED_SETS", Group) msg = string.format(msg, loadedHere, displayName) self:_SendMessage(msg, 10, false, Group) end @@ -5877,18 +5951,18 @@ function CTLD:_RemovePackedCratesByIds(Group, Unit, crateIds) end if #crates == 0 then - local msg = self.gettext:GetEntry("NOTHING_TO_REMOVE",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_TO_REMOVE", Group) self:_SendMessage(msg, 10, false, Group) self:_RefreshPackMenus(Group, Unit) return self end - local text = REPORT:New(self.gettext:GetEntry("REPORT_REMOVING_CRATES",self.locale)) + local text = REPORT:New(self:_GetEntryForGroup("REPORT_REMOVING_CRATES", Group)) text:Add("------------------------------------------------------------") local removedIDs = {} for _, entry in pairs(crates) do - local name = entry:GetName() or "none" - text:Add(string.format(self.gettext:GetEntry("REPORT_ROW_CRATE_REMOVED",self.locale), name, entry.PerCrateMass)) + local name = self:_GetCargoDisplayNameForGroup(entry:GetName() or "none", Group) + text:Add(string.format(self:_GetEntryForGroup("REPORT_ROW_CRATE_REMOVED", Group), name, entry.PerCrateMass)) local pos = entry:GetPositionable() if pos then entry.coordinate = pos:GetCoordinate() @@ -5927,7 +6001,7 @@ function CTLD:_PackSelectedGroupAction(Group, Unit, TargetGroupName, Mode) self:T(self.lid .. " _PackSelectedGroupAction") local targetGroup = GROUP:FindByName(TargetGroupName) if not targetGroup or not targetGroup:IsAlive() then - local msg = self.gettext:GetEntry("NOTHING_TO_PACK",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_TO_PACK", Group) self:_SendMessage(msg, 10, false, Group) self:_RefreshPackMenus(Group, Unit) return false @@ -5976,7 +6050,7 @@ function CTLD:_PackCratesNearby(Group, Unit, EmitPackedEvent) end if not packedAny then - local msg = self.gettext:GetEntry("NOTHING_TO_PACK",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_TO_PACK", Group) self:_SendMessage(msg, 10, false, Group) return false end @@ -6065,7 +6139,7 @@ function CTLD:_RepairCrates(Group, Unit, Engineering) end else if not Engineering then - local msg = self.gettext:GetEntry("NO_CRATES_WITHIN_PLAIN",self.locale) + local msg = self:_GetEntryForGroup("NO_CRATES_WITHIN_PLAIN", Group) msg = string.format(msg,finddist) self:_SendMessage(msg, 10, false, Group,true) --self:_SendMessage(string.format("No crates within %d meters!",finddist), 10, false, Group) @@ -6226,7 +6300,7 @@ end function CTLD:_DropAndBuild(Group,Unit) if self.nobuildinloadzones then if self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD) then - local msg = self.gettext:GetEntry("CANNOT_BUILD_LOADING_AREA",self.locale) + local msg = self:_GetEntryForGroup("CANNOT_BUILD_LOADING_AREA", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You cannot build in a loading area, Pilot!",10,false,Group) return self @@ -6243,7 +6317,7 @@ function CTLD:_DropAndBuild(Group,Unit) function CTLD:_DropSingleAndBuild(Group,Unit,setIndex) if self.nobuildinloadzones then if self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD) then - local msg = self.gettext:GetEntry("CANNOT_BUILD_LOADING_AREA",self.locale) + local msg = self:_GetEntryForGroup("CANNOT_BUILD_LOADING_AREA", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You cannot build in a loading area, Pilot!",10,false,Group) return self @@ -6258,7 +6332,7 @@ function CTLD:_DropAndBuild(Group,Unit) -- @param Wrapper.Unit#UNIT Unit The calling unit function CTLD:_PackAndLoad(Group,Unit) if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to load cargo!",10,false,Group) return self @@ -6288,7 +6362,7 @@ end -- @param #number quantity function CTLD:_GetAndLoad(Group, Unit, cargoObj, quantity, LoadAnyWay) if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to load cargo!", 10, false, Group) return self @@ -6306,7 +6380,7 @@ function CTLD:_GetAndLoad(Group, Unit, cargoObj, quantity, LoadAnyWay) local perSet = needed > 0 and needed or 1 capacitySets = math.floor(space / perSet) if capacitySets < 1 and not LoadAnyWay then - local msg = self.gettext:GetEntry("NO_CAPACITY_NOW",self.locale) + local msg = self:_GetEntryForGroup("NO_CAPACITY_NOW", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("No capacity to load more now!", 10, false, Group) return self @@ -6326,7 +6400,7 @@ function CTLD:_GetAndLoad(Group, Unit, cargoObj, quantity, LoadAnyWay) inzone, ship, zone, distance, width = self:IsUnitInZone(Unit,CTLD.CargoZoneType.SHIP) end if not inzone then - local msg = self.gettext:GetEntry("NOT_CLOSE_ENOUGH_LOGISTICS",self.locale) + local msg = self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_LOGISTICS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You are not close enough to a logistics zone!", 10, false, Group) return self @@ -6349,7 +6423,7 @@ end -- @param Wrapper.Unit#UNIT Unit The unit performing the pack-and-load function CTLD:_GetAllAndLoad(Group,Unit) if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to load cargo!",10,false,Group) return self @@ -6712,12 +6786,12 @@ function CTLD:_RefreshF10Menus() end local toptroops = nil local topcrates = nil - local topmenu = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_CTLD",self.locale), nil) + local topmenu = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_CTLD", _group), nil) _group.CTLDTopmenu = topmenu if cantroops then - local toptroops = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_MANAGE_TROOPS",self.locale), topmenu) - local troopsmenu = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_LOAD_TROOPS",self.locale), toptroops) + local toptroops = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_MANAGE_TROOPS", _group), topmenu) + local troopsmenu = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_LOAD_TROOPS", _group), toptroops) _group.MyTopTroopsMenu = toptroops _group.CTLD_TroopMenus = {} @@ -6737,7 +6811,7 @@ function CTLD:_RefreshF10Menus() end for _, cargoObj in pairs(self.Cargo_Troops) do if not cargoObj.DontShowInMenu then - local menutext = self:_GetCargoDisplayName(cargoObj) + local menutext = self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj), cargoObj, _group) local parent = troopsmenu if useTroopSubcats and cargoObj.Subcategory and subcatmenus[cargoObj.Subcategory] then parent = subcatmenus[cargoObj.Subcategory] @@ -6750,18 +6824,18 @@ function CTLD:_RefreshF10Menus() else for _, cargoObj in pairs(self.Cargo_Troops) do if not cargoObj.DontShowInMenu then - local menutext = self:_GetCargoDisplayName(cargoObj) + local menutext = self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj), cargoObj, _group) local mSet = MENU_GROUP:New(_group, menutext, troopsmenu) _group.CTLD_TroopMenus[cargoObj.Name] = mSet self:_AddTroopQuantityMenus(_group,_unit,mSet,cargoObj) end end end - local dropTroopsMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_DROP_TROOPS",self.locale),toptroops):Refresh() + local dropTroopsMenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_DROP_TROOPS", _group),toptroops):Refresh() if self.maxUnloadTroopsAllowed == -1 then - MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_DROP_ALL_TROOPS",self.locale),dropTroopsMenu,self._UnloadTroops,self,_group,_unit):Refresh() + MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_DROP_ALL_TROOPS", _group),dropTroopsMenu,self._UnloadTroops,self,_group,_unit):Refresh() end - MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_EXTRACT_TROOPS",self.locale),toptroops,self._ExtractTroops,self,_group,_unit):Refresh() + MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_EXTRACT_TROOPS", _group),toptroops,self._ExtractTroops,self,_group,_unit):Refresh() local uName=_unit:GetName() local loadedData=self.Loaded_Cargo[uName] @@ -6778,11 +6852,11 @@ function CTLD:_RefreshF10Menus() end end if cancrates then - local topcrates = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_MANAGE_CRATES",self.locale), topmenu) + local topcrates = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_MANAGE_CRATES", _group), topmenu) _group.MyTopCratesMenu = topcrates -- Build the “Get Crates” sub-menu items - local cratesmenu = MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_GET_CRATES",self.locale),topcrates) + local cratesmenu = MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_GET_CRATES", _group),topcrates) if self.onestepmenu then _group.CTLD_CrateMenus = {} @@ -6821,12 +6895,12 @@ function CTLD:_RefreshF10Menus() local needed = cargoObj:GetCratesNeeded() or 1 local txt - local cargoLabel = self:_GetCargoDisplayName(cargoObj) + local cargoLabel = self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj), cargoObj, _group) if needed > 1 then - local plural = self:_GetMenuPluralSuffix(needed, "crate") - txt = string.format(self.gettext:GetEntry("MENU_CRATES_NEEDED",self.locale),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0) + local plural = self:_GetMenuPluralSuffix(needed, "crate", _group) + txt = string.format(self:_GetEntryForGroup("MENU_CRATES_NEEDED", _group),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0) else - txt = string.format("%s (%dkg)",cargoLabel,cargoObj.PerCrateMass or 0) + txt = string.format(self:_GetEntryForGroup("MENU_CRATE_SINGLE", _group),cargoLabel,cargoObj.PerCrateMass or 0) end if cargoObj.Location then txt = txt.."[R]" end if self.showstockinmenuitems then @@ -6871,12 +6945,12 @@ function CTLD:_RefreshF10Menus() if not cargoObj.DontShowInMenu then local needed = cargoObj:GetCratesNeeded() or 1 local txt - local cargoLabel = self:_GetCargoDisplayName(cargoObj) + local cargoLabel = self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj), cargoObj, _group) if needed > 1 then - local plural = self:_GetMenuPluralSuffix(needed, "crate") - txt = string.format(self.gettext:GetEntry("MENU_CRATES_NEEDED",self.locale),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0) + local plural = self:_GetMenuPluralSuffix(needed, "crate", _group) + txt = string.format(self:_GetEntryForGroup("MENU_CRATES_NEEDED", _group),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0) else - txt = string.format("%s (%dkg)",cargoLabel,cargoObj.PerCrateMass or 0) + txt = string.format(self:_GetEntryForGroup("MENU_CRATE_SINGLE", _group),cargoLabel,cargoObj.PerCrateMass or 0) end if cargoObj.Location then txt = txt.."[R]" end local stock = cargoObj:GetStock() @@ -6888,12 +6962,12 @@ function CTLD:_RefreshF10Menus() if (not cargoObj.DontShowInMenu) and (not cargoObj.UnitCanCarry or cargoObj:UnitCanCarry(_unit)) then local needed = cargoObj:GetCratesNeeded() or 1 local txt - local cargoLabel = self:_GetCargoDisplayName(cargoObj) + local cargoLabel = self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj), cargoObj, _group) if needed > 1 then - local plural = self:_GetMenuPluralSuffix(needed, "crate") - txt = string.format(self.gettext:GetEntry("MENU_CRATES_NEEDED",self.locale),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0) + local plural = self:_GetMenuPluralSuffix(needed, "crate", _group) + txt = string.format(self:_GetEntryForGroup("MENU_CRATES_NEEDED", _group),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0) else - txt = string.format("%s (%dkg)",cargoLabel,cargoObj.PerCrateMass or 0) + txt = string.format(self:_GetEntryForGroup("MENU_CRATE_SINGLE", _group),cargoLabel,cargoObj.PerCrateMass or 0) end if cargoObj.Location then txt = txt.."[R]" end local stock = cargoObj:GetStock() @@ -6906,12 +6980,12 @@ function CTLD:_RefreshF10Menus() if not cargoObj.DontShowInMenu then local needed = cargoObj:GetCratesNeeded() or 1 local txt - local cargoLabel = self:_GetCargoDisplayName(cargoObj) + local cargoLabel = self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj), cargoObj, _group) if needed > 1 then - local plural = self:_GetMenuPluralSuffix(needed, "crate") - txt = string.format(self.gettext:GetEntry("MENU_CRATES_NEEDED",self.locale),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0) + local plural = self:_GetMenuPluralSuffix(needed, "crate", _group) + txt = string.format(self:_GetEntryForGroup("MENU_CRATES_NEEDED", _group),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0) else - txt = string.format("%s (%dkg)",cargoLabel,cargoObj.PerCrateMass or 0) + txt = string.format(self:_GetEntryForGroup("MENU_CRATE_SINGLE", _group),cargoLabel,cargoObj.PerCrateMass or 0) end if cargoObj.Location then txt = txt.."[R]" end local stock = cargoObj:GetStock() @@ -6923,12 +6997,12 @@ function CTLD:_RefreshF10Menus() if (not cargoObj.DontShowInMenu) and (not cargoObj.UnitCanCarry or cargoObj:UnitCanCarry(_unit)) then local needed = cargoObj:GetCratesNeeded() or 1 local txt - local cargoLabel = self:_GetCargoDisplayName(cargoObj) + local cargoLabel = self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj), cargoObj, _group) if needed > 1 then - local plural = self:_GetMenuPluralSuffix(needed, "crate") - txt = string.format(self.gettext:GetEntry("MENU_CRATES_NEEDED",self.locale),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0) + local plural = self:_GetMenuPluralSuffix(needed, "crate", _group) + txt = string.format(self:_GetEntryForGroup("MENU_CRATES_NEEDED", _group),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0) else - txt = string.format("%s (%dkg)",cargoLabel,cargoObj.PerCrateMass or 0) + txt = string.format(self:_GetEntryForGroup("MENU_CRATE_SINGLE", _group),cargoLabel,cargoObj.PerCrateMass or 0) end if cargoObj.Location then txt = txt.."[R]" end local stock = cargoObj:GetStock() @@ -6939,34 +7013,34 @@ function CTLD:_RefreshF10Menus() end end - local loadCratesMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_LOAD_CRATES",self.locale),topcrates) + local loadCratesMenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_LOAD_CRATES", _group),topcrates) _group.MyLoadCratesMenu=loadCratesMenu - MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_LOAD_ALL",self.locale),loadCratesMenu,self._LoadCratesNearby,self,_group,_unit) - MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_SHOW_LOADABLE_CRATES",self.locale),loadCratesMenu,self._RefreshLoadCratesMenu,self,_group,_unit) + MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_LOAD_ALL", _group),loadCratesMenu,self._LoadCratesNearby,self,_group,_unit) + MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_SHOW_LOADABLE_CRATES", _group),loadCratesMenu,self._RefreshLoadCratesMenu,self,_group,_unit) - local dropCratesMenu = MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_DROP_CRATES",self.locale),topcrates) + local dropCratesMenu = MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_DROP_CRATES", _group),topcrates) topcrates.DropCratesMenu = dropCratesMenu if not self.nobuildmenu then - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_BUILD_CRATES",self.locale), topcrates, self._BuildCrates, self, _group, _unit) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_REPAIR",self.locale), topcrates, self._RepairCrates, self, _group, _unit):Refresh() + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_BUILD_CRATES", _group), topcrates, self._BuildCrates, self, _group, _unit) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_REPAIR", _group), topcrates, self._RepairCrates, self, _group, _unit):Refresh() end - local removecratesmenu = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_REMOVE_CRATES",self.locale), topcrates) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_REMOVE_CRATES_NEARBY",self.locale), removecratesmenu, self._RemoveCratesNearby, self, _group, _unit) + local removecratesmenu = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_REMOVE_CRATES", _group), topcrates) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_REMOVE_CRATES_NEARBY", _group), removecratesmenu, self._RemoveCratesNearby, self, _group, _unit) if self.onestepmenu then - topcrates.PackRootMenu = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_PACK",self.locale), topcrates) - topcrates.PackMenu = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_PACK",self.locale), topcrates.PackRootMenu) + topcrates.PackRootMenu = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_PACK", _group), topcrates) + topcrates.PackMenu = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_PACK", _group), topcrates.PackRootMenu) local showPackAndLoad = not (self.UseC130LoadAndUnload and self:IsC130J(_unit)) if showPackAndLoad then - topcrates.PackAndLoadMenu = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_PACK_AND_LOAD",self.locale), topcrates.PackRootMenu) + topcrates.PackAndLoadMenu = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_PACK_AND_LOAD", _group), topcrates.PackRootMenu) end - topcrates.PackAndRemoveMenu = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_PACK_AND_REMOVE",self.locale), topcrates.PackRootMenu) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_LIST_CRATES_NEARBY",self.locale), topcrates, self._ListCratesNearby, self, _group, _unit) + topcrates.PackAndRemoveMenu = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_PACK_AND_REMOVE", _group), topcrates.PackRootMenu) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_LIST_CRATES_NEARBY", _group), topcrates, self._ListCratesNearby, self, _group, _unit) else - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_PACK_CRATES",self.locale), topcrates, self._PackCratesNearby, self, _group, _unit) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_LIST_CRATES_NEARBY",self.locale), topcrates, self._ListCratesNearby, self, _group, _unit) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_PACK_CRATES", _group), topcrates, self._PackCratesNearby, self, _group, _unit) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_LIST_CRATES_NEARBY", _group), topcrates, self._ListCratesNearby, self, _group, _unit) end local uName = _unit:GetName() @@ -6977,7 +7051,7 @@ function CTLD:_RefreshF10Menus() if cgo and (not cgo:WasDropped()) then local cname = cgo:GetName() local cneeded = cgo:GetCratesNeeded() - local cdisplay = self:_GetCargoDisplayName(cgo) + local cdisplay = self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cgo), cgo, _group) cargoByName[cname] = cargoByName[cname] or { count=0, needed=cneeded, display=cdisplay } cargoByName[cname].count = cargoByName[cname].count + 1 end @@ -6989,9 +7063,9 @@ function CTLD:_RefreshF10Menus() end end if self:IsC130J(_unit) then - local topunits = MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_MANAGE_UNITS",self.locale),topmenu) - local getunits = MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_GET_UNITS",self.locale),topunits) - MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_REMOVE_UNITS_NEARBY",self.locale),topunits,self._C130RemoveUnitsNearby,self,_group,_unit) + local topunits = MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_MANAGE_UNITS", _group),topmenu) + local getunits = MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_GET_UNITS", _group),topunits) + MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_REMOVE_UNITS_NEARBY", _group),topunits,self._C130RemoveUnitsNearby,self,_group,_unit) local unitentries = self.C130GetUnits or {} local unittype = _unit:GetTypeName() or "none" @@ -7019,7 +7093,7 @@ function CTLD:_RefreshF10Menus() end parent = sub end - local menutext = self:_GetCargoDisplayName(cargoObj) + local menutext = self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj), cargoObj, _group) if type(cargoObj.Stock) == "number" and cargoObj.Stock >= 0 and self.showstockinmenuitems then menutext = menutext.."["..cargoObj.Stock.."]" end @@ -7031,27 +7105,27 @@ function CTLD:_RefreshF10Menus() ----------------------------------------------------- -- Misc sub‐menus ----------------------------------------------------- - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_LIST_BOARDED_CARGO",self.locale), topmenu, self._ListCargo, self, _group, _unit) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_INVENTORY",self.locale), topmenu, self._ListInventory, self, _group, _unit) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_LIST_ZONE_BEACONS",self.locale), topmenu, self._ListRadioBeacons, self, _group, _unit) - - local smoketopmenu = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_SMOKES_FLARES_BEACONS",self.locale), topmenu) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_SMOKE_ZONES_NEARBY",self.locale), smoketopmenu, self.SmokeZoneNearBy, self, _unit, false) - local smokeself = MENU_GROUP:New(_group, self.gettext:GetEntry("MENU_DROP_SMOKE_NOW",self.locale), smoketopmenu) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_RED_SMOKE",self.locale), smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Red) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_BLUE_SMOKE",self.locale), smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Blue) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_GREEN_SMOKE",self.locale), smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Green) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_ORANGE_SMOKE",self.locale), smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Orange) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_WHITE_SMOKE",self.locale), smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.White) - - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_FLARE_ZONES_NEARBY",self.locale), smoketopmenu, self.SmokeZoneNearBy, self, _unit, true) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_FIRE_FLARE_NOW",self.locale), smoketopmenu, self.SmokePositionNow, self, _unit, true) - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_DROP_BEACON_NOW",self.locale), smoketopmenu, self.DropBeaconNow, self, _unit):Refresh() + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_LIST_BOARDED_CARGO", _group), topmenu, self._ListCargo, self, _group, _unit) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_INVENTORY", _group), topmenu, self._ListInventory, self, _group, _unit) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_LIST_ZONE_BEACONS", _group), topmenu, self._ListRadioBeacons, self, _group, _unit) + + local smoketopmenu = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_SMOKES_FLARES_BEACONS", _group), topmenu) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_SMOKE_ZONES_NEARBY", _group), smoketopmenu, self.SmokeZoneNearBy, self, _unit, false) + local smokeself = MENU_GROUP:New(_group, self:_GetEntryForGroup("MENU_DROP_SMOKE_NOW", _group), smoketopmenu) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_RED_SMOKE", _group), smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Red) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_BLUE_SMOKE", _group), smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Blue) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_GREEN_SMOKE", _group), smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Green) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_ORANGE_SMOKE", _group), smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Orange) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_WHITE_SMOKE", _group), smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.White) + + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_FLARE_ZONES_NEARBY", _group), smoketopmenu, self.SmokeZoneNearBy, self, _unit, true) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_FIRE_FLARE_NOW", _group), smoketopmenu, self.SmokePositionNow, self, _unit, true) + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_DROP_BEACON_NOW", _group), smoketopmenu, self.DropBeaconNow, self, _unit):Refresh() if self:IsFixedWing(_unit) then - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_SHOW_FLIGHT_PARAMS",self.locale), topmenu, self._ShowFlightParams, self, _group, _unit):Refresh() + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_SHOW_FLIGHT_PARAMS", _group), topmenu, self._ShowFlightParams, self, _group, _unit):Refresh() else - MENU_GROUP_COMMAND:New(_group, self.gettext:GetEntry("MENU_SHOW_HOVER_PARAMS",self.locale), topmenu, self._ShowHoverParams, self, _group, _unit):Refresh() + MENU_GROUP_COMMAND:New(_group, self:_GetEntryForGroup("MENU_SHOW_HOVER_PARAMS", _group), topmenu, self._ShowHoverParams, self, _group, _unit):Refresh() end -- Mark we built the menu @@ -7079,16 +7153,16 @@ function CTLD:_RefreshLoadCratesMenu(Group,Unit) if not Group.MyLoadCratesMenu then return end Group.MyLoadCratesMenu:RemoveSubMenus() if self:IsC130J(Unit) then - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_USE_C130_LOAD",self.locale),Group.MyLoadCratesMenu,function() end) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_USE_C130_LOAD", Group),Group.MyLoadCratesMenu,function() end) return end local d=self.CrateDistance or 35 local nearby,n=self:_FindCratesNearby(Group,Unit,d,true,true) if n==0 then - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_NO_CRATES_FOUND_RESCAN",self.locale),Group.MyLoadCratesMenu,function() self:_RefreshLoadCratesMenu(Group,Unit) end) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_NO_CRATES_FOUND_RESCAN", Group),Group.MyLoadCratesMenu,function() self:_RefreshLoadCratesMenu(Group,Unit) end) return end - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_LOAD_ALL",self.locale),Group.MyLoadCratesMenu,self._LoadCratesNearby,self,Group,Unit) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_LOAD_ALL", Group),Group.MyLoadCratesMenu,self._LoadCratesNearby,self,Group,Unit) local cargoByName={} for _,crate in pairs(nearby) do @@ -7105,7 +7179,7 @@ function CTLD:_RefreshLoadCratesMenu(Group,Unit) while i<=#list do local left=#list-i+1 local label - local loadkey = self.gettext:GetEntry("MENU_LOAD_SINGLE",self.locale) + local loadkey = self:_GetEntryForGroup("MENU_LOAD_SINGLE", Group) if left>=needed then label=string.format("%d. %s %s",lineIndex,loadkey,cName) i=i+needed @@ -7144,8 +7218,8 @@ function CTLD:_RefreshPackMenus(Group,Unit) end end - MENU_GROUP_COMMAND:New(Group, self.gettext:GetEntry(allKey,self.locale), menu, bulkFunc, self, Group, Unit) - MENU_GROUP_COMMAND:New(Group, self.gettext:GetEntry("MENU_SCAN_PACKABLE_UNITS",self.locale), menu, self._RefreshPackMenus, self, Group, Unit) + MENU_GROUP_COMMAND:New(Group, self:_GetEntryForGroup(allKey, Group), menu, bulkFunc, self, Group, Unit) + MENU_GROUP_COMMAND:New(Group, self:_GetEntryForGroup("MENU_SCAN_PACKABLE_UNITS", Group), menu, self._RefreshPackMenus, self, Group, Unit) end refreshPackMenu(topCrates.PackMenu, "pack", "MENU_PACK_ALL", self._PackCratesNearby) @@ -7170,7 +7244,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName, details) local grounded = not self:IsUnitInAir(Unit) local hover = self:CanHoverLoad(Unit) if not grounded and not hover then - local msg = self.gettext:GetEntry("MUST_LAND_OR_HOVER_CRATES",self.locale) + local msg = self:_GetEntryForGroup("MUST_LAND_OR_HOVER_CRATES", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You must land or hover to load crates!", 10, false, Group) return self @@ -7178,7 +7252,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName, details) -- 2) Check door if required if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to load cargo!", 10, false, Group) return self @@ -7188,7 +7262,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName, details) local finddist = self.CrateDistance or 35 local cratesNearby, number = self:_FindCratesNearby(Group, Unit, finddist, false, false) if number == 0 then - local msg = self.gettext:GetEntry("NO_CRATES_IN_RANGE",self.locale) + local msg = self:_GetEntryForGroup("NO_CRATES_IN_RANGE", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("No crates found in range!", 10, false, Group) return self @@ -7203,8 +7277,8 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName, details) end end if not needed then - local msg = self.gettext:GetEntry("NO_NAMED_CRATES_IN_RANGE",self.locale) - msg = string.format(msg,cargoName) + local msg = self:_GetEntryForGroup("NO_NAMED_CRATES_IN_RANGE", Group) + msg = string.format(msg,self:_GetCargoDisplayNameForGroup(cargoName, Group)) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("No \"%s\" crates found in range!", cargoName), 10, false, Group) return self @@ -7221,7 +7295,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName, details) local capabilities = self:_GetUnitCapabilities(Unit) local capacity = capabilities.cratelimit or 0 if loadedData.Cratesloaded >= capacity then - local msg = self.gettext:GetEntry("NO_MORE_CAPACITY",self.locale) + local msg = self:_GetEntryForGroup("NO_MORE_CAPACITY", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("No more capacity to load crates!", 10, false, Group) self.suppressmessages = prevSuppress @@ -7232,7 +7306,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName, details) local spaceLeft = capacity - loadedData.Cratesloaded local toLoad = math.min(found, needed, spaceLeft) if toLoad < 1 then - local msg = self.gettext:GetEntry("CANNOT_LOAD_NONE_OR_FULL",self.locale) + local msg = self:_GetEntryForGroup("CANNOT_LOAD_NONE_OR_FULL", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Cannot load crates: either none found or no capacity left.", 10, false, Group) self.suppressmessages = prevSuppress @@ -7276,8 +7350,8 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName, details) local loadedHere = toLoad if details or (not batch) then if loadedHere < needed and loadedData.Cratesloaded >= capacity then - local msg = self.gettext:GetEntry("LOADED_PARTIAL_LIMIT",self.locale) - msg = string.format(msg,loadedHere, needed, cargoName) + local msg = self:_GetEntryForGroup("LOADED_PARTIAL_LIMIT", Group) + msg = string.format(msg,loadedHere, needed, self:_GetCargoDisplayNameForGroup(cargoName, Group)) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s. Cargo limit is now reached!", loadedHere, needed, cargoName), 10, false, Group) else @@ -7285,24 +7359,24 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName, details) local leftover = loadedHere % needed if needed > 1 then if fullSets > 0 and leftover == 0 then - local msg = self.gettext:GetEntry("LOADED_FULL",self.locale) - msg = string.format(msg,fullSets, cargoName) + local msg = self:_GetEntryForGroup("LOADED_FULL", Group) + msg = string.format(msg,fullSets, self:_GetCargoDisplayNameForGroup(cargoName, Group)) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Loaded %d %s.", fullSets, cargoName), 10, false, Group) elseif fullSets > 0 and leftover > 0 then - local msg = self.gettext:GetEntry("LOADED_SETS_LEFTOVER",self.locale) - msg = string.format(msg,fullSets, cargoName, leftover) + local msg = self:_GetEntryForGroup("LOADED_SETS_LEFTOVER", Group) + msg = string.format(msg,fullSets, self:_GetCargoDisplayNameForGroup(cargoName, Group), leftover) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Loaded %d %s(s), with %d leftover crate(s).", fullSets, cargoName, leftover), 10, false, Group) else - local msg = self.gettext:GetEntry("LOADED_PARTIAL",self.locale) - msg = string.format(msg,loadedHere, needed, cargoName) + local msg = self:_GetEntryForGroup("LOADED_PARTIAL", Group) + msg = string.format(msg,loadedHere, needed, self:_GetCargoDisplayNameForGroup(cargoName, Group)) self:_SendMessage(msg, 15, false, Group) --self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s.", loadedHere, needed, cargoName), 15, false, Group) end else - local msg = self.gettext:GetEntry("LOADED_SETS",self.locale) - msg = string.format(msg,loadedHere, cargoName) + local msg = self:_GetEntryForGroup("LOADED_SETS", Group) + msg = string.format(msg,loadedHere, self:_GetCargoDisplayNameForGroup(cargoName, Group)) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Loaded %d %s(s).", loadedHere, cargoName), 10, false, Group) end @@ -7322,10 +7396,10 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName, details) if batch.remaining <= 0 then self.suppressmessages = prevSuppress if not details then - local txt = string.format(self.gettext:GetEntry("LOADED_BATCH",self.locale), batch.loaded, cargoName) + local txt = string.format(self:_GetEntryForGroup("LOADED_BATCH", batch.group), batch.loaded, self:_GetCargoDisplayNameForGroup(cargoName, batch.group)) --local txt = string.format("Loaded %d %s.", batch.loaded, cargoName) if batch.partials and batch.partials > 0 then - txt = txt .. " " .. self.gettext:GetEntry("LOADED_BATCH_PARTIAL",self.locale) + txt = txt .. " " .. self:_GetEntryForGroup("LOADED_BATCH_PARTIAL", batch.group) --txt = txt .. " Some sets could not be fully loaded." end self:_SendMessage(txt, 10, false, batch.group) @@ -7352,7 +7426,7 @@ function CTLD:_UnloadSingleCrateSet(Group, Unit, setIndex) if not self.dropcratesanywhere then local inzone, zoneName, zone, distance = self:IsUnitInZone(Unit, CTLD.CargoZoneType.DROP) if not inzone then - local msg = self.gettext:GetEntry("NOT_CLOSE_ENOUGH_DROP",self.locale) + local msg = self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_DROP", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You are not close enough to a drop zone!", 10, false, Group) if not self.debug then @@ -7363,7 +7437,7 @@ function CTLD:_UnloadSingleCrateSet(Group, Unit, setIndex) -- Check if doors must be open if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_DROP_CARGO",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_DROP_CARGO", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to drop cargo!", 10, false, Group) if not self.debug then return self end @@ -7372,7 +7446,7 @@ function CTLD:_UnloadSingleCrateSet(Group, Unit, setIndex) -- Check if the crate grouping data is available local unitName = Unit:GetName() if not self.CrateGroupList or not self.CrateGroupList[unitName] then - local msg = self.gettext:GetEntry("NO_CRATE_GROUPS",self.locale) + local msg = self:_GetEntryForGroup("NO_CRATE_GROUPS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("No crate groups found for this unit!", 10, false, Group) if not self.debug then return self end @@ -7382,7 +7456,7 @@ function CTLD:_UnloadSingleCrateSet(Group, Unit, setIndex) -- Find the selected chunk/set by index local chunk = self.CrateGroupList[unitName][setIndex] if not chunk then - local msg = self.gettext:GetEntry("NO_CRATE_SET",self.locale) + local msg = self:_GetEntryForGroup("NO_CRATE_SET", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("No crate set found or index invalid!", 10, false, Group) if not self.debug then return self end @@ -7391,7 +7465,7 @@ function CTLD:_UnloadSingleCrateSet(Group, Unit, setIndex) -- Check if the chunk is empty if #chunk == 0 then - local msg = self.gettext:GetEntry("NO_CRATE_IN_SET",self.locale) + local msg = self:_GetEntryForGroup("NO_CRATE_IN_SET", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("No crate found in that set!", 10, false, Group) if not self.debug then return self end @@ -7408,11 +7482,11 @@ function CTLD:_UnloadSingleCrateSet(Group, Unit, setIndex) end if not grounded and not hoverunload then if isHerc then - local msg = self.gettext:GetEntry("NOTHING_LOADED_AIRDROP",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_LOADED_AIRDROP", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Nothing loaded or not within airdrop parameters!", 10, false, Group) else - local msg = self.gettext:GetEntry("NOTHING_LOADED_HOVER",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_LOADED_HOVER", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Nothing loaded or not hovering within parameters!", 10, false, Group) end @@ -7423,7 +7497,7 @@ function CTLD:_UnloadSingleCrateSet(Group, Unit, setIndex) -- Get the first crate from this set local crateObj = chunk[1] if not crateObj then - local msg = self.gettext:GetEntry("NO_CRATE_IN_SET",self.locale) + local msg = self:_GetEntryForGroup("NO_CRATE_IN_SET", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("No crate found in that set!", 10, false, Group) if not self.debug then return self end @@ -7443,19 +7517,19 @@ local cname = crateObj:GetName() or "Unknown" local count = #chunk if needed > 1 then if count == needed then - local msg = self.gettext:GetEntry("DROPPED_FULL",self.locale) - msg = string.format(msg,1, cname) + local msg = self:_GetEntryForGroup("DROPPED_FULL", Group) + msg = string.format(msg,1, self:_GetCargoDisplayNameForGroup(cname, Group)) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Dropped %d %s.", 1, cname), 10, false, Group) else - local msg = self.gettext:GetEntry("DROPPED_PARTIAL",self.locale) - msg = string.format(msg,count, needed, cname) + local msg = self:_GetEntryForGroup("DROPPED_PARTIAL", Group) + msg = string.format(msg,count, needed, self:_GetCargoDisplayNameForGroup(cname, Group)) self:_SendMessage(msg, 15, false, Group) --self:_SendMessage(string.format("Dropped %d/%d crate(s) of %s.", count, needed, cname), 15, false, Group) end else -local msg = self.gettext:GetEntry("DROPPED_SETS",self.locale) -msg = string.format(msg,count, cname) +local msg = self:_GetEntryForGroup("DROPPED_SETS", Group) +msg = string.format(msg,count, self:_GetCargoDisplayNameForGroup(cname, Group)) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Dropped %d %s(s).", count, cname), 10, false, Group) end @@ -7500,13 +7574,13 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) if topCrates.DropCratesMenu then topCrates.DropCratesMenu:RemoveSubMenus() else - topCrates.DropCratesMenu = MENU_GROUP:New(Group, self.gettext:GetEntry("MENU_DROP_CRATES",self.locale), topCrates) + topCrates.DropCratesMenu = MENU_GROUP:New(Group, self:_GetEntryForGroup("MENU_DROP_CRATES", Group), topCrates) end local dropCratesMenu = topCrates.DropCratesMenu local loadedData = self.Loaded_Cargo[Unit:GetName()] if not loadedData or not loadedData.Cargo then - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_NO_CRATES_TO_DROP",self.locale),dropCratesMenu,function() end) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_NO_CRATES_TO_DROP", Group),dropCratesMenu,function() end) return end @@ -7525,7 +7599,7 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) end if dropableCrates==0 then - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_NO_CRATES_TO_DROP",self.locale),dropCratesMenu,function() end) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_NO_CRATES_TO_DROP", Group),dropCratesMenu,function() end) return end @@ -7536,7 +7610,7 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) -------------------------------------------------------------------- -- classic menu -------------------------------------------------------------------- - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP_ALL_CRATES",self.locale),dropCratesMenu,self._UnloadCrates,self,Group,Unit) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP_ALL_CRATES", Group),dropCratesMenu,self._UnloadCrates,self,Group,Unit) self.CrateGroupList=self.CrateGroupList or{} self.CrateGroupList[Unit:GetName()]={} @@ -7557,7 +7631,7 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) i=i+needed end if sets==1 then - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP",self.locale),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP", Group),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) local uName=UnitArg:GetName() for k=1,qty do local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] @@ -7574,9 +7648,9 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) end,self,Group,Unit,cName,needed,1) else for q=1,sets do - local qm=MENU_GROUP:New(Group,string.format(self.gettext:GetEntry("MENU_DROP_N_SETS",self.locale),q,self:_GetMenuPluralSuffix(q, "set")),parentMenu) + local qm=MENU_GROUP:New(Group,string.format(self:_GetEntryForGroup("MENU_DROP_N_SETS", Group),q,self:_GetMenuPluralSuffix(q, "set", Group)),parentMenu) --local qm=MENU_GROUP:New(Group,string.format("Drop %d Set%s",q,q>1 and "s" or ""),parentMenu) - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP",self.locale),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP", Group),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) local uName=UnitArg:GetName() for k=1,qty do local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] @@ -7611,10 +7685,10 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) -------------------------------------------------------------------- -- one-step (enhanced) menu -------------------------------------------------------------------- - local mAll=MENU_GROUP:New(Group,self.gettext:GetEntry("MENU_DROP_ALL_CRATES",self.locale),dropCratesMenu) - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP",self.locale),mAll,self._UnloadCrates,self,Group,Unit) + local mAll=MENU_GROUP:New(Group,self:_GetEntryForGroup("MENU_DROP_ALL_CRATES", Group),dropCratesMenu) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP", Group),mAll,self._UnloadCrates,self,Group,Unit) if not ( self:IsUnitInAir(Unit) and self:IsFixedWing(Unit) ) then - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP_AND_BUILD",self.locale),mAll,self._DropAndBuild,self,Group,Unit) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP_AND_BUILD", Group),mAll,self._DropAndBuild,self,Group,Unit) end self.CrateGroupList=self.CrateGroupList or{} @@ -7636,7 +7710,7 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) i=i+needed end if sets==1 then - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP",self.locale),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP", Group),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) local uName=UnitArg:GetName() for k=1,qty do local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] @@ -7652,7 +7726,7 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) end end,self,Group,Unit,cName,needed,1) if not ( self:IsUnitInAir(Unit) and self:IsFixedWing(Unit) ) then - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP_AND_BUILD",self.locale),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP_AND_BUILD", Group),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) local uName=UnitArg:GetName() for k=1,qty do local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] @@ -7671,9 +7745,9 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) end else for q=1,sets do - local qm=MENU_GROUP:New(Group,string.format(self.gettext:GetEntry("MENU_DROP_N_SETS",self.locale),q,self:_GetMenuPluralSuffix(q, "set")),parentMenu) + local qm=MENU_GROUP:New(Group,string.format(self:_GetEntryForGroup("MENU_DROP_N_SETS", Group),q,self:_GetMenuPluralSuffix(q, "set", Group)),parentMenu) --local qm=MENU_GROUP:New(Group,string.format("Drop %d Set%s",q,q>1 and "s" or ""),parentMenu) - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP",self.locale),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP", Group),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) local uName=UnitArg:GetName() for k=1,qty do local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] @@ -7689,7 +7763,7 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) end end,self,Group,Unit,cName,needed,q) if not ( self:IsUnitInAir(Unit) and self:IsFixedWing(Unit) ) then - MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP_AND_BUILD",self.locale),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP_AND_BUILD", Group),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) local uName=UnitArg:GetName() for k=1,qty do local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] @@ -7759,7 +7833,7 @@ function CTLD:_UnloadSingleTroopByID(Group, Unit, chunkID, qty) end if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - local msg = self.gettext:GetEntry("OPEN_DOORS_UNLOAD_TROOPS",self.locale) + local msg = self:_GetEntryForGroup("OPEN_DOORS_UNLOAD_TROOPS", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("You need to open the door(s) to unload troops!", 10, false, Group) if not self.debug then return self end @@ -7782,7 +7856,7 @@ function CTLD:_UnloadSingleTroopByID(Group, Unit, chunkID, qty) end if not droppingatbase or self.debug then if not self.TroopsIDToChunk or not self.TroopsIDToChunk[chunkID] then - local msg = self.gettext:GetEntry("NO_TROOP_CHUNK",self.locale) + local msg = self:_GetEntryForGroup("NO_TROOP_CHUNK", Group) msg = string.format(msg,chunkID) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("No troop cargo chunk found for ID %d!", chunkID), 10, false, Group) @@ -7792,7 +7866,7 @@ function CTLD:_UnloadSingleTroopByID(Group, Unit, chunkID, qty) local chunk = self.TroopsIDToChunk[chunkID] if not chunk or #chunk == 0 then - local msg = self.gettext:GetEntry("TROOP_CHUNK_EMPTY",self.locale) + local msg = self:_GetEntryForGroup("TROOP_CHUNK_EMPTY", Group) msg = string.format(msg,chunkID) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Troop chunk is empty for ID %d!", chunkID), 10, false, Group) @@ -7877,21 +7951,23 @@ function CTLD:_UnloadSingleTroopByID(Group, Unit, chunkID, qty) end local parts = {} + local troopLabel = self:_GetEntryForGroup("TROOPS_LABEL", Group) + local engineerLabel = self:_GetEntryForGroup("ENGINEERS_LABEL", Group) for nName,nCount in pairs(deployedTroopsByName) do - parts[#parts + 1] = tostring(nCount).."x Troops "..nName + parts[#parts + 1] = tostring(nCount).."x "..troopLabel.." "..nName end for nName,nCount in pairs(deployedEngineersByName) do - parts[#parts + 1] = tostring(nCount).."x Engineers "..nName + parts[#parts + 1] = tostring(nCount).."x "..engineerLabel.." "..nName end if #parts > 0 then - local msg = self.gettext:GetEntry("DROPPED_INTO_ACTION",self.locale) + local msg = self:_GetEntryForGroup("DROPPED_INTO_ACTION", Group) msg = string.format(msg,table.concat(parts, ", ")) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Dropped "..table.concat(parts, ", ").." into action!", 10, false, Group) end else -- Return to base logic, remove ONLY the first cargo - local msg = self.gettext:GetEntry("TROOPS_RETURNED",self.locale) + local msg = self:_GetEntryForGroup("TROOPS_RETURNED", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Troops have returned to base!", 10, false, Group) self:__TroopsRTB(1, Group, Unit, zonename, zone) @@ -7944,11 +8020,11 @@ function CTLD:_UnloadSingleTroopByID(Group, Unit, chunkID, qty) else local isHerc = self:IsFixedWing(Unit) if isHerc then - local msg = self.gettext:GetEntry("NOTHING_LOADED_AIRDROP",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_LOADED_AIRDROP", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Nothing loaded or not within airdrop parameters!", 10, false, Group) else - local msg = self.gettext:GetEntry("NOTHING_LOADED_HOVER",self.locale) + local msg = self:_GetEntryForGroup("NOTHING_LOADED_HOVER", Group) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage("Nothing loaded or not hovering within parameters!", 10, false, Group) end @@ -7971,11 +8047,11 @@ function CTLD:_RefreshDropTroopsMenu(Group, Unit) if dropTroopsMenu then dropTroopsMenu:RemoveSubMenus() else - dropTroopsMenu = MENU_GROUP:New(theGroup, self.gettext:GetEntry("MENU_DROP_TROOPS",self.locale), topTroops) + dropTroopsMenu = MENU_GROUP:New(theGroup, self:_GetEntryForGroup("MENU_DROP_TROOPS", theGroup), topTroops) topTroops.DropTroopsMenu = dropTroopsMenu end if self.maxUnloadTroopsAllowed == -1 then - MENU_GROUP_COMMAND:New(theGroup, self.gettext:GetEntry("MENU_DROP_ALL_TROOPS",self.locale), dropTroopsMenu, self._UnloadTroops, self, theGroup, theUnit) + MENU_GROUP_COMMAND:New(theGroup, self:_GetEntryForGroup("MENU_DROP_ALL_TROOPS", theGroup), dropTroopsMenu, self._UnloadTroops, self, theGroup, theUnit) end local loadedData = self.Loaded_Cargo[theUnit:GetName()] @@ -8003,14 +8079,14 @@ function CTLD:_RefreshDropTroopsMenu(Group, Unit) local chunkID = objList[1]:GetID() self.TroopsIDToChunk[chunkID] = objList - local label = string.format(self.gettext:GetEntry("MENU_DROP_N_TROOPS",self.locale), count, tName) + local label = string.format(self:_GetEntryForGroup("MENU_DROP_N_TROOPS", theGroup), count, tName) if count == 1 then MENU_GROUP_COMMAND:New(theGroup, label, dropTroopsMenu, self._UnloadSingleTroopByID, self, theGroup, theUnit, chunkID, 1) else local parentMenu = MENU_GROUP:New(theGroup, label, dropTroopsMenu) for q = 1, count do if q > self.maxUnloadTroopsAllowed and self.maxUnloadTroopsAllowed > -1 then break end - MENU_GROUP_COMMAND:New(theGroup, string.format(self.gettext:GetEntry("MENU_DROP_N_TROOPS",self.locale), q, tName), parentMenu, self._UnloadSingleTroopByID, self, theGroup, theUnit, chunkID, q) + MENU_GROUP_COMMAND:New(theGroup, string.format(self:_GetEntryForGroup("MENU_DROP_N_TROOPS", theGroup), q, tName), parentMenu, self._UnloadSingleTroopByID, self, theGroup, theUnit, chunkID, q) --MENU_GROUP_COMMAND:New(theGroup, string.format("Drop (%d) %s", q, tName), parentMenu, self._UnloadSingleTroopByID, self, theGroup, theUnit, chunkID, q) end end @@ -8717,7 +8793,7 @@ function CTLD:DropBeaconNow(Unit) local FM = FMbeacon.frequency -- MHz local VHF = VHFbeacon.frequency * 1000 -- KHz local UHF = UHFbeacon.frequency -- MHz - local text = string.format(self.gettext:GetEntry("DROPPED_BEACON",self.locale), Name, FM, VHF, UHF) + local text = string.format(self:_GetEntryForGroup("DROPPED_BEACON", Unit:GetGroup()), Name, FM, VHF, UHF) --local text = string.format("Dropped %s | FM %s Mhz | VHF %s KHz | UHF %s Mhz ", Name, FM, VHF, UHF) self:_SendMessage(text,15,false,Unit:GetGroup()) @@ -9055,7 +9131,7 @@ function CTLD:SmokeZoneNearBy(Unit, Flare) end local txt = "smoking" if Flare then txt = "flaring" end - local msg = self.gettext:GetEntry("ROGER_ZONE",self.locale) + local msg = self:_GetEntryForGroup("ROGER_ZONE", Group) msg = string.format(msg,txt, zonename) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Roger, %s zone %s!",txt, zonename), 10, false, Group) @@ -9066,7 +9142,7 @@ function CTLD:SmokeZoneNearBy(Unit, Flare) end if not smoked then local distance = UTILS.MetersToNM(self.smokedistance) - local msg = self.gettext:GetEntry("NOT_CLOSE_ENOUGH_ZONE_NM",self.locale) + local msg = self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_ZONE_NM", Group) msg = string.format(msg,distance) self:_SendMessage(msg, 10, false, Group) --self:_SendMessage(string.format("Negative, need to be closer than %dnm to a zone!",distance), 10, false, Group) @@ -9213,12 +9289,12 @@ end if not inhover then htxt = "false" end local text = "" if _SETTINGS:IsMetric() then - text = string.format(self.gettext:GetEntry("HOVER_PARAMS_METRIC",self.locale), self.minimumHoverHeight, self.maximumHoverHeight, htxt) + text = string.format(self:_GetEntryForGroup("HOVER_PARAMS_METRIC", Group), self.minimumHoverHeight, self.maximumHoverHeight, htxt) --text = string.format("Hover parameters (autoload/drop):\n - Min height %dm \n - Max height %dm \n - Max speed 2mps \n - In parameter: %s", self.minimumHoverHeight, self.maximumHoverHeight, htxt) else local minheight = UTILS.MetersToFeet(self.minimumHoverHeight) local maxheight = UTILS.MetersToFeet(self.maximumHoverHeight) - text = string.format(self.gettext:GetEntry("HOVER_PARAMS_IMPERIAL",self.locale), minheight, maxheight, htxt) + text = string.format(self:_GetEntryForGroup("HOVER_PARAMS_IMPERIAL", Group), minheight, maxheight, htxt) --text = string.format("Hover parameters (autoload/drop):\n - Min height %dft \n - Max height %dft \n - Max speed 6ftps \n - In parameter: %s", minheight, maxheight, htxt) end self:_SendMessage(text, 10, false, Group) @@ -9237,12 +9313,12 @@ end if _SETTINGS:IsImperial() then local minheight = UTILS.MetersToFeet(self.FixedMinAngels) local maxheight = UTILS.MetersToFeet(self.FixedMaxAngels) - text = string.format(self.gettext:GetEntry("FLIGHT_PARAMS_IMPERIAL",self.locale), minheight, maxheight, htxt) + text = string.format(self:_GetEntryForGroup("FLIGHT_PARAMS_IMPERIAL", Group), minheight, maxheight, htxt) --text = string.format("Flight parameters (airdrop):\n - Min height %dft \n - Max height %dft \n - In parameter: %s", minheight, maxheight, htxt) else local minheight = self.FixedMinAngels local maxheight = self.FixedMaxAngels - text = string.format(self.gettext:GetEntry("FLIGHT_PARAMS_METRIC",self.locale), minheight, maxheight, htxt) + text = string.format(self:_GetEntryForGroup("FLIGHT_PARAMS_METRIC", Group), minheight, maxheight, htxt) --text = string.format("Flight parameters (airdrop):\n - Min height %dm \n - Max height %dm \n - In parameter: %s", minheight, maxheight, htxt) end self:_SendMessage(text, 10, false, Group) diff --git a/Moose Development/Moose/Ops/CTLD_Localization.lua b/Moose Development/Moose/Ops/CTLD_Localization.lua index f9e41087e..8c0803602 100644 --- a/Moose Development/Moose/Ops/CTLD_Localization.lua +++ b/Moose Development/Moose/Ops/CTLD_Localization.lua @@ -32,6 +32,8 @@ CTLD.Messages = { BOARDED = "%s boarded!", BOARDING = "%s boarding!", TROOPS_RETURNED = "Troops have returned to base!", + TROOPS_LABEL = "Troops", + ENGINEERS_LABEL = "Engineers", -- ============================================================ -- Deployment -- ============================================================ @@ -221,6 +223,7 @@ CTLD.Messages = { MENU_REMOVE_CRATES_NEARBY = "Remove crates nearby", MENU_LIST_CRATES_NEARBY = "List crates nearby", MENU_CRATES_NEEDED = "%d crate%s %s (%dkg)", + MENU_CRATE_SINGLE = "%s (%dkg)", -- ============================================================ -- Menu labels - Units (C-130) -- ============================================================ @@ -287,6 +290,8 @@ CTLD.Messages = { BOARDED = "%s eingestiegen!", BOARDING = "%s steigt ein!", TROOPS_RETURNED = "Truppen zur Basis zurückgekehrt!", + TROOPS_LABEL = "Truppen", + ENGINEERS_LABEL = "Pioniere", -- ============================================================ -- Einsatz -- ============================================================ @@ -476,6 +481,7 @@ CTLD.Messages = { MENU_REMOVE_CRATES_NEARBY = "Nahe Kisten entfernen", MENU_LIST_CRATES_NEARBY = "Nahe Kisten auflisten", MENU_CRATES_NEEDED = "%d Kiste%s %s (%dkg)", + MENU_CRATE_SINGLE = "%s (%dkg)", -- ============================================================ -- Menübezeichnungen - Einheiten (C-130) -- ============================================================ @@ -542,6 +548,8 @@ FR = { BOARDED = "%s embarqué(s) !", BOARDING = "%s en cours d'embarquement !", TROOPS_RETURNED = "Les troupes sont retournées à la base !", + TROOPS_LABEL = "troupes", + ENGINEERS_LABEL = "sapeurs", -- ============================================================ -- Déploiement -- ============================================================ @@ -731,6 +739,7 @@ FR = { MENU_REMOVE_CRATES_NEARBY = "Retirer caisses proches", MENU_LIST_CRATES_NEARBY = "Lister caisses proches", MENU_CRATES_NEEDED = "%d caisse%s %s (%dkg)", + MENU_CRATE_SINGLE = "%s (%dkg)", -- ============================================================ -- Libellés de menu - Unités (C-130) -- ============================================================ @@ -788,6 +797,8 @@ FR = { BOARDED="¡%s a bordo!", BOARDING="¡%s entrando!", TROOPS_RETURNED="¡Las tropas han vuelto a la base!", + TROOPS_LABEL="tropas", + ENGINEERS_LABEL="ingenieros", DEPLOYED_NEAR_YOU="%s han sido servidas cerca de tí.", UNITS_REMOVED="%s ha sido eliminado", BUILD_STARTED="Construcción comenzada, listo en %d segundos.", @@ -920,6 +931,7 @@ FR = { MENU_REMOVE_CRATES_NEARBY="Eliminar cargas cercanas", MENU_LIST_CRATES_NEARBY="Listar cargas cercanas", MENU_CRATES_NEEDED="%d contenedor%s %s (%dkg)", + MENU_CRATE_SINGLE="%s (%dkg)", MENU_GET_UNITS="Obtener unidades", MENU_REMOVE_UNITS_NEARBY="Eliminar unidades cercanas", MENU_LIST_BOARDED_CARGO="Lista de cargas a bordo", @@ -943,6 +955,522 @@ FR = { BUILD_YES="SI", BUILD_NO="NO", }, + ["PT-BR"] = { + -- ============================================================ + -- Carregamento de caixa / carga + -- ============================================================ + CRATE_LOADED_GROUNDCREW = "Caixa %s carregada pela equipe de solo!", + CRATE_UNLOADED_GROUNDCREW = "Caixa %s descarregada pela equipe de solo!", + CRATE_LOADED_ID = "Caixa ID %d para %s carregada!", + LOADED_FULL = "%d %s carregado.", + LOADED_SETS_LEFTOVER = "%d %s carregado(s), com %d caixa(s) sobrando.", + LOADED_SETS = "%d %s carregado(s).", + LOADED_PARTIAL = "Carregado apenas %d/%d caixa(s) de %s.", + LOADED_PARTIAL_LIMIT = "Carregado apenas %d/%d caixa(s) de %s. O limite de carga foi atingido!", + LOADED_BATCH = "%d %s carregado.", + LOADED_BATCH_PARTIAL = "Alguns conjuntos não puderam ser carregados completamente.", + -- ============================================================ + -- Soltar / descarregar + -- ============================================================ + DROPPED_FULL = "%d %s solto.", + DROPPED_SETS_LEFTOVER = "%d %s solto(s), com %d caixa(s) sobrando.", + DROPPED_SETS = "%d %s solto(s).", + DROPPED_PARTIAL = "%d/%d caixa(s) de %s solta(s).", + DROPPED_INTO_ACTION = "Unidades desembarcadas para a ação: %s!", + DROPPED_BEACON = "Baliza %s posicionada | FM %s Mhz | VHF %s KHz | UHF %s Mhz ", + CRATES_POSITIONED = "%d caixas para %s foram posicionadas perto de você!", + CRATES_DROPPED = "%d caixas para %s foram soltas!", + -- ============================================================ + -- Tropas + -- ============================================================ + BOARDED = "%s embarcou!", + BOARDING = "%s embarcando!", + TROOPS_RETURNED = "As tropas retornaram à base!", + TROOPS_LABEL = "tropas", + ENGINEERS_LABEL = "engenheiros", + -- ============================================================ + -- Implantação + -- ============================================================ + DEPLOYED_NEAR_YOU = "%s foram posicionados perto de você!", + UNITS_REMOVED = "%s foram removidos", + -- ============================================================ + -- Construir / reparar + -- ============================================================ + BUILD_STARTED = "Construção iniciada, pronta em %d segundos!", + REPAIR_STARTED = "Reparo iniciado usando %s, levando %d segundos", + NO_UNIT_TO_REPAIR = "Nenhuma unidade perto o suficiente para reparar!", + CANT_REPAIR_WITH = "Não é possível reparar esta unidade com %s", + CRATES_MOVE_BEFORE_BUILD = "*** As caixas precisam ser movidas antes da construção!", + -- ============================================================ + -- Erros - Helicóptero / peso / capacidade + -- ============================================================ + CHOPPER_CANNOT_CARRY = "Desculpe, este helicóptero não pode carregar caixas!", + TOO_HEAVY = "Desculpe, isso é pesado demais para carregar!", + FULLY_LOADED = "Desculpe, estamos totalmente carregados!", + CRAMMED = "Desculpe, já estamos lotados!", + NO_CAPACITY_NOW = "Sem capacidade para carregar mais agora!", + NO_MORE_CAPACITY = "Não há mais capacidade para carregar caixas!", + CANNOT_LOAD_NONE_OR_FULL = "Não é possível carregar caixas: nenhuma encontrada ou sem capacidade restante.", + -- ============================================================ + -- Erros - posição + -- ============================================================ + NEED_TO_LAND_OR_HOVER_LOAD = "Você precisa pousar ou pairar na posição para carregar!", + HOVER_OVER_CRATES = "Paire sobre as caixas para pegá-las!", + LAND_OR_HOVER_OVER_CRATES = "Pouse ou paire sobre as caixas para pegá-las!", + MUST_LAND_OR_HOVER_CRATES = "Você deve pousar ou pairar para carregar caixas!", + NEED_TO_LAND_BUILD = "Você precisa pousar / parar para construir algo, piloto!", + NOT_CLOSE_ENOUGH_LOGISTICS = "Você não está perto o suficiente de uma zona logística!", + NOT_CLOSE_ENOUGH_DROP = "Você não está perto o suficiente de uma zona de lançamento!", + NOT_CLOSE_ENOUGH_ZONE_NM = "Negativo, precisa estar a menos de %d nm de uma zona!", + CANNOT_BUILD_LOADING_AREA = "Você não pode construir em uma área de carregamento, piloto!", + -- ============================================================ + -- Erros - portas + -- ============================================================ + OPEN_DOORS_LOAD_CARGO = "Você precisa abrir a(s) porta(s) para carregar carga!", + OPEN_DOORS_LOAD_TROOPS = "Você precisa abrir a(s) porta(s) para carregar tropas!", + OPEN_DOORS_EXTRACT_TROOPS = "Você precisa abrir a(s) porta(s) para extrair tropas!", + OPEN_DOORS_UNLOAD_TROOPS = "Você precisa abrir a(s) porta(s) para descarregar tropas!", + OPEN_DOORS_DROP_CARGO = "Você precisa abrir a(s) porta(s) para soltar carga!", + -- ============================================================ + -- Erros - estoque / disponibilidade + -- ============================================================ + ALL_GONE = "Desculpe, todos os %s acabaram!", + RAN_OUT_OF = "Desculpe, ficamos sem %s", + CARGO_NOT_AVAILABLE_ZONE = "A carga solicitada não está disponível nesta zona!", + ENOUGH_CRATES_NEARBY = "Já há caixas suficientes por perto! Cuide delas primeiro!", + NO_CRATES_WITHIN = "Nenhuma caixa carregável em um raio de %d metros!", + NO_CRATES_WITHIN_PLAIN = "Nenhuma caixa em um raio de %d metros!", + NO_CRATES_IN_RANGE = "Nenhuma caixa encontrada no alcance!", + NO_NAMED_CRATES_IN_RANGE = "Nenhuma caixa \"%s\" encontrada no alcance!", + NO_LOADABLE_CRATES = "Desculpe, nenhuma caixa carregável por perto ou peso máximo de carga atingido!", + NO_UNITS_TO_EXTRACT = "Nenhuma unidade perto o suficiente para extrair!", + NO_UNIT_CONFIG = "Nenhuma configuração de unidade encontrada para %s", + CANT_ONBOARD = "Não é possível embarcar %s", + TOO_MANY_UNITS_NEARBY = "Você já tem %d unidades por perto!", + NO_CRATE_GROUPS = "Nenhum grupo de caixas encontrado para esta unidade!", + NO_CRATE_SET = "Nenhum conjunto de caixas encontrado ou índice inválido!", + NO_CRATE_IN_SET = "Nenhuma caixa encontrada nesse conjunto!", + NO_TROOP_CHUNK = "Nenhum bloco de carga de tropas encontrado para ID %d!", + TROOP_CHUNK_EMPTY = "O bloco de tropas está vazio para ID %d!", + -- ============================================================ + -- Nada carregado / em estoque + -- ============================================================ + NOTHING_LOADED = "Nada carregado!\nLimite de tropas: %d | Limite de caixas %d | Limite de peso %d kg", + NOTHING_LOADED_AIRDROP = "Nada carregado ou fora dos parâmetros de lançamento aéreo!", + NOTHING_LOADED_HOVER = "Nada carregado ou fora dos parâmetros de pairado!", + NOTHING_IN_STOCK = "Nada em estoque!", + NOTHING_TO_PACK = "Nada para empacotar nesta distância, piloto!", + NOTHING_TO_REMOVE = "Nada para remover nesta distância, piloto!", + -- ============================================================ + -- Zona / informações + -- ============================================================ + ROGER_ZONE = "Entendido, zona %s %s!", + -- ============================================================ + -- Relatório: parâmetros de pairado / voo + -- ============================================================ + HOVER_PARAMS_METRIC = "Parâmetros de pairado (carregamento automático/soltar):\n - Altura mínima %dm \n - Altura máxima %dm \n - Velocidade máxima 2mps \n - Dentro dos parâmetros: %s", + HOVER_PARAMS_IMPERIAL = "Parâmetros de pairado (carregamento automático/soltar):\n - Altura mínima %dft \n - Altura máxima %dft \n - Velocidade máxima 6ftps \n - Dentro dos parâmetros: %s", + FLIGHT_PARAMS_IMPERIAL = "Parâmetros de voo (lançamento aéreo):\n - Altura mínima %dft \n - Altura máxima %dft \n - Dentro dos parâmetros: %s", + FLIGHT_PARAMS_METRIC = "Parâmetros de voo (lançamento aéreo):\n - Altura mínima %dm \n - Altura máxima %dm \n - Dentro dos parâmetros: %s", + -- ============================================================ + -- Títulos de relatório (REPORT:New()) + -- ============================================================ + REPORT_CRATES_FOUND = "Caixas encontradas por perto:", + REPORT_REMOVING_CRATES = "Removendo caixas encontradas por perto:", + REPORT_TRANSPORT_CHECKOUT = "Ficha de verificação de transporte", + REPORT_INVENTORY = "Ficha de inventário", + REPORT_BUILD_CHECKLIST = "Checklist de caixas construíveis", + REPORT_REPAIR_CHECKLIST = "Checklist de reparos", + REPORT_BEACONS = "Balizas de zona ativas", + -- ============================================================ + -- Cabeçalhos de seção do relatório (report:Add()) + -- ============================================================ + REPORT_SECTION_TROOPS = " -- TROPAS --", + REPORT_SECTION_CRATES = " -- CAIXAS --", + REPORT_SECTION_CRATES_GC = " -- CAIXAS carregadas pela equipe de solo --", + REPORT_SECTION_NONE = " N E N H U M", + REPORT_SECTION_NONE_ALT = " --- Nada encontrado! ---", + REPORT_SECTION_NONE_REPAIR = " --- Nada encontrado ---", + REPORT_GC_LOADABLE_HINT = "Provavelmente carregável pela equipe de solo (F8)", + REPORT_TOTAL_MASS = "Massa total: %s kg. Carregável: %s kg.", + REPORT_TROOPS_CRATES_COUNT = "Tropas: %d(%d), Caixas: %d(%d)", + REPORT_TROOPS_CRATETYPES_COUNT = "Tropas: %d, Tipos de caixas: %d", + -- ============================================================ + -- Modelos de linha do relatório (linhas por item) + -- ============================================================ + REPORT_ROW_TROOP = "Tropa: %s tamanho %d", + REPORT_ROW_CRATE = "Caixa: %s %d/%d", + REPORT_ROW_CRATE_SIZE1 = "Caixa: %s tamanho 1", + REPORT_ROW_GC_CRATE = "Caixa carregada pela equipe de solo: %s tamanho 1", + REPORT_ROW_DROPPED_CRATE = "Caixa solta para %s, %dkg", + REPORT_ROW_CRATE_KG = "Caixa para %s, %dkg", + REPORT_ROW_CRATE_REMOVED = "Caixa para %s, %dkg removida", + REPORT_ROW_UNIT_STOCK = "Unidade: %s | Soldados: %d | Estoque: %s", + REPORT_ROW_TYPE_CRATE_STOCK = "Tipo: %s | Caixas por conjunto: %d | Estoque: %s", + REPORT_ROW_TYPE_STOCK = "Tipo: %s | Estoque: %s", + REPORT_ROW_BUILD_CHECK = "Tipo: %s | Necessário %d | Encontrado %d | Pode construir %s", + REPORT_ROW_REPAIR_CHECK = "Tipo: %s | Necessário %d | Encontrado %d | Pode reparar %s", + REPORT_ROW_BEACON = " %s | FM %s Mhz | VHF %s KHz | UHF %s Mhz ", + -- ============================================================ + -- Tokens de limite de peso / caixas + -- ============================================================ + WEIGHT_LIMIT = "Limite de peso atingido", + CRATE_LIMIT = "Limite de caixas atingido", + -- ============================================================ + -- Rótulos de menu - nível superior + -- ============================================================ + MENU_CTLD = "CTLD", + MENU_MANAGE_TROOPS = "Gerenciar tropas", + MENU_MANAGE_CRATES = "Gerenciar caixas", + MENU_MANAGE_UNITS = "Gerenciar unidades", + -- ============================================================ + -- Rótulos de menu - tropas + -- ============================================================ + MENU_LOAD_TROOPS = "Carregar tropas", + MENU_DROP_TROOPS = "Desembarcar tropas", + MENU_DROP_ALL_TROOPS = "Desembarcar TODAS as tropas", + MENU_EXTRACT_TROOPS = "Extrair tropas", + MENU_DROP_N_TROOPS = "Desembarcar (%d) %s", + -- ============================================================ + -- Rótulos de menu - caixas: obter + -- ============================================================ + MENU_GET_CRATES = "Solicitar caixas", + MENU_GET = "Solicitar", + MENU_GET_AND_LOAD = "Solicitar e carregar", + MENU_GET_ANYWAY = "Solicitar mesmo assim", + MENU_PARTIALLY_LOAD = "Carregar parcialmente", + MENU_OUT_OF_STOCK = "Sem estoque", + MENU_TROOP_LIMIT = "Limite de tropas atingido", + -- ============================================================ + -- Rótulos de menu - caixas: carregar + -- ============================================================ + MENU_LOAD_CRATES = "Carregar caixas", + MENU_LOAD_ALL = "Carregar TUDO", + MENU_SHOW_LOADABLE_CRATES = "Mostrar caixas carregáveis", + MENU_NO_CRATES_FOUND_RESCAN = "Nenhuma caixa encontrada! Procurar novamente?", + MENU_USE_C130_LOAD = "Usar sistema de carga do C-130", + MENU_LOAD_SINGLE = "Carregar", + -- ============================================================ + -- Rótulos de menu - caixas: soltar + -- ============================================================ + MENU_DROP_CRATES = "Soltar caixas", + MENU_DROP_ALL_CRATES = "Soltar TODAS as caixas", + MENU_DROP = "Soltar", + MENU_DROP_AND_BUILD = "Soltar e construir", + MENU_DROP_N_SETS = "Soltar %d conjunto%s", + MENU_NO_CRATES_TO_DROP = "Nenhuma caixa para soltar!", + -- ============================================================ + -- Rótulos de menu - caixas: construir / reparar / empacotar / remover + -- ============================================================ + MENU_BUILD_CRATES = "Construir caixas", + MENU_REPAIR = "Reparar", + MENU_PACK_CRATES = "Empacotar caixas", + MENU_PACK = "Empacotar", + MENU_SCAN_PACKABLE_UNITS = "Procurar unidades empacotáveis por perto", + MENU_NO_PACKABLE_UNITS_FOUND_RESCAN = "Nenhuma unidade empacotável encontrada! Procurar novamente?", + MENU_PACK_ALL = "Empacotar próximas", + MENU_PACK_AND_LOAD = "Empacotar e carregar", + MENU_PACK_AND_LOAD_ALL = "Empacotar e carregar próximas", + MENU_PACK_AND_REMOVE = "Empacotar e remover", + MENU_PACK_AND_REMOVE_ALL = "Empacotar e remover próximas", + MENU_REMOVE_CRATES = "Remover caixas", + MENU_REMOVE_CRATES_NEARBY = "Remover caixas próximas", + MENU_LIST_CRATES_NEARBY = "Listar caixas próximas", + MENU_CRATES_NEEDED = "%d caixa%s %s (%dkg)", + MENU_CRATE_SINGLE = "%s (%dkg)", + -- ============================================================ + -- Rótulos de menu - unidades (C-130) + -- ============================================================ + MENU_GET_UNITS = "Solicitar unidades", + MENU_REMOVE_UNITS_NEARBY = "Remover unidades próximas", + -- ============================================================ + -- Rótulos de menu - informações / carga + -- ============================================================ + MENU_LIST_BOARDED_CARGO = "Listar carga embarcada", + MENU_INVENTORY = "Inventário", + MENU_LIST_ZONE_BEACONS = "Listar balizas de zona ativas", + -- ============================================================ + -- Rótulos de menu - fumaças / sinalizadores / beacons + -- ============================================================ + MENU_SMOKES_FLARES_BEACONS = "Fumaças, sinalizadores, balizas", + MENU_SMOKE_ZONES_NEARBY = "Fumaça em zonas próximas", + MENU_DROP_SMOKE_NOW = "Lançar fumaça agora", + MENU_RED_SMOKE = "Fumaça vermelha", + MENU_BLUE_SMOKE = "Fumaça azul", + MENU_GREEN_SMOKE = "Fumaça verde", + MENU_ORANGE_SMOKE = "Fumaça laranja", + MENU_WHITE_SMOKE = "Fumaça branca", + MENU_FLARE_ZONES_NEARBY = "Sinalizadores em zonas próximas", + MENU_FIRE_FLARE_NOW = "Disparar sinalizador agora", + MENU_DROP_BEACON_NOW = "Posicionar baliza agora", + -- ============================================================ + -- Rótulos de menu - parâmetros + -- ============================================================ + MENU_SHOW_FLIGHT_PARAMS = "Mostrar parâmetros de voo", + MENU_SHOW_HOVER_PARAMS = "Mostrar parâmetros de pairado", + STOCK_NONE = "nenhum", + STOCK_UNLIMITED = "ilimitado", + BUILD_YES = "SIM", + BUILD_NO = "NÃO", + }, + TR = { + -- ============================================================ + -- Sandık / kargo yükleme + -- ============================================================ + CRATE_LOADED_GROUNDCREW = "%s sandığı yer ekibi tarafından yüklendi!", + CRATE_UNLOADED_GROUNDCREW = "%s sandığı yer ekibi tarafından boşaltıldı!", + CRATE_LOADED_ID = "Sandık ID %d %s için yüklendi!", + LOADED_FULL = "%d %s yüklendi.", + LOADED_SETS_LEFTOVER = "%d %s yüklendi, %d sandık kaldı.", + LOADED_SETS = "%d %s yüklendi.", + LOADED_PARTIAL = "Yalnızca %d/%d sandık %s için yüklendi.", + LOADED_PARTIAL_LIMIT = "Yalnızca %d/%d sandık %s için yüklendi. Kargo limiti artık doldu!", + LOADED_BATCH = "%d %s yüklendi.", + LOADED_BATCH_PARTIAL = "Bazı setler tamamen yüklenemedi.", + -- ============================================================ + -- Bırakma / boşaltma + -- ============================================================ + DROPPED_FULL = "%d %s bırakıldı.", + DROPPED_SETS_LEFTOVER = "%d %s bırakıldı, %d sandık kaldı.", + DROPPED_SETS = "%d %s bırakıldı.", + DROPPED_PARTIAL = "%d/%d sandık %s için bırakıldı.", + DROPPED_INTO_ACTION = "Çatışma alanına konuşlandırılanlar: %s!", + DROPPED_BEACON = "Radyo işaretçisi %s bırakıldı | FM %s Mhz | VHF %s KHz | UHF %s Mhz ", + CRATES_POSITIONED = "%d sandık %s için yakınınıza yerleştirildi!", + CRATES_DROPPED = "%d sandık %s için bırakıldı!", + -- ============================================================ + -- Birlikler + -- ============================================================ + BOARDED = "%s bindirildi!", + BOARDING = "%s biniyor!", + TROOPS_RETURNED = "Birlikler üsse döndü!", + TROOPS_LABEL = "birlik", + ENGINEERS_LABEL = "mühendis", + -- ============================================================ + -- Konuşlandırma + -- ============================================================ + DEPLOYED_NEAR_YOU = "%s yakınınıza konuşlandırıldı!", + UNITS_REMOVED = "%s kaldırıldı", + -- ============================================================ + -- İnşa / onarım + -- ============================================================ + BUILD_STARTED = "İnşa başladı, %d saniye içinde hazır!", + REPAIR_STARTED = "%s kullanılarak onarım başladı, %d saniye sürecek", + NO_UNIT_TO_REPAIR = "Onarmak için yeterince yakın bir birim yok!", + CANT_REPAIR_WITH = "Bu birim %s ile onarılamaz", + CRATES_MOVE_BEFORE_BUILD = "*** İnşa etmeden önce sandıkların taşınması gerekiyor!", + -- ============================================================ + -- Hatalar - helikopter / ağırlık / kapasite + -- ============================================================ + CHOPPER_CANNOT_CARRY = "Üzgünüm, bu helikopter sandık taşıyamaz!", + TOO_HEAVY = "Üzgünüm, bu yük çok ağır!", + FULLY_LOADED = "Üzgünüm, tamamen doluyuz!", + CRAMMED = "Üzgünüm, zaten tıka basa doluyuz!", + NO_CAPACITY_NOW = "Şu anda daha fazla yüklemek için kapasite yok!", + NO_MORE_CAPACITY = "Sandık yüklemek için daha fazla kapasite yok!", + CANNOT_LOAD_NONE_OR_FULL = "Sandıklar yüklenemiyor: ya hiç bulunamadı ya da kapasite kalmadı.", + -- ============================================================ + -- Hatalar - konum + -- ============================================================ + NEED_TO_LAND_OR_HOVER_LOAD = "Yüklemek için inmen veya pozisyonda asılı kalman gerekiyor!", + HOVER_OVER_CRATES = "Sandıkları almak için üzerlerinde asılı kal!", + LAND_OR_HOVER_OVER_CRATES = "Sandıkları almak için in veya üzerlerinde asılı kal!", + MUST_LAND_OR_HOVER_CRATES = "Sandık yüklemek için inmen veya asılı kalman gerekiyor!", + NEED_TO_LAND_BUILD = "Bir şey inşa etmek için inmen / durman gerekiyor, pilot!", + NOT_CLOSE_ENOUGH_LOGISTICS = "Lojistik bölgesine yeterince yakın değilsin!", + NOT_CLOSE_ENOUGH_DROP = "Bırakma bölgesine yeterince yakın değilsin!", + NOT_CLOSE_ENOUGH_ZONE_NM = "Negatif, bir bölgeye %d nm'den daha yakın olmalısın!", + CANNOT_BUILD_LOADING_AREA = "Yükleme alanında inşa yapamazsın, pilot!", + -- ============================================================ + -- Hatalar - kapılar + -- ============================================================ + OPEN_DOORS_LOAD_CARGO = "Kargo yüklemek için kapı(ları) açman gerekiyor!", + OPEN_DOORS_LOAD_TROOPS = "Birlik yüklemek için kapı(ları) açman gerekiyor!", + OPEN_DOORS_EXTRACT_TROOPS = "Birlik tahliye etmek için kapı(ları) açman gerekiyor!", + OPEN_DOORS_UNLOAD_TROOPS = "Birlik boşaltmak için kapı(ları) açman gerekiyor!", + OPEN_DOORS_DROP_CARGO = "Kargo bırakmak için kapı(ları) açman gerekiyor!", + -- ============================================================ + -- Hatalar - stok / kullanılabilirlik + -- ============================================================ + ALL_GONE = "Üzgünüm, tüm %s bitti!", + RAN_OUT_OF = "Üzgünüm, %s tükendi", + CARGO_NOT_AVAILABLE_ZONE = "İstenen kargo bu bölgede mevcut değil!", + ENOUGH_CRATES_NEARBY = "Yakında zaten yeterince sandık var! Önce onlarla ilgilen!", + NO_CRATES_WITHIN = "%d metre içinde yüklenebilir sandık yok!", + NO_CRATES_WITHIN_PLAIN = "%d metre içinde sandık yok!", + NO_CRATES_IN_RANGE = "Menzilde sandık bulunamadı!", + NO_NAMED_CRATES_IN_RANGE = "Menzilde \"%s\" sandığı bulunamadı!", + NO_LOADABLE_CRATES = "Üzgünüm, yakında yüklenebilir sandık yok veya maksimum kargo ağırlığına ulaşıldı!", + NO_UNITS_TO_EXTRACT = "Tahliye etmek için yeterince yakın birim yok!", + NO_UNIT_CONFIG = "%s için birim yapılandırması bulunamadı", + CANT_ONBOARD = "%s bindirilemiyor", + TOO_MANY_UNITS_NEARBY = "Yakında zaten %d birimin var!", + NO_CRATE_GROUPS = "Bu birim için sandık grubu bulunamadı!", + NO_CRATE_SET = "Sandık seti bulunamadı veya indeks geçersiz!", + NO_CRATE_IN_SET = "Bu sette sandık bulunamadı!", + NO_TROOP_CHUNK = "ID %d için birlik kargo parçası bulunamadı!", + TROOP_CHUNK_EMPTY = "ID %d için birlik parçası boş!", + -- ============================================================ + -- Yüklü bir şey yok / stokta yok + -- ============================================================ + NOTHING_LOADED = "Hiçbir şey yüklü değil!\nBirlik limiti: %d | Sandık limiti %d | Ağırlık limiti %d kg", + NOTHING_LOADED_AIRDROP = "Hiçbir şey yüklü değil veya havadan bırakma parametreleri dahilinde değil!", + NOTHING_LOADED_HOVER = "Hiçbir şey yüklü değil veya asılı kalma parametreleri dahilinde değil!", + NOTHING_IN_STOCK = "Stokta hiçbir şey yok!", + NOTHING_TO_PACK = "Bu mesafede paketlenecek bir şey yok, pilot!", + NOTHING_TO_REMOVE = "Bu mesafede kaldırılacak bir şey yok, pilot!", + -- ============================================================ + -- Bölge / bilgi + -- ============================================================ + ROGER_ZONE = "Anlaşıldı, %s bölgesi %s!", + -- ============================================================ + -- Rapor: asılı kalma / uçuş parametreleri + -- ============================================================ + HOVER_PARAMS_METRIC = "Asılı kalma parametreleri (otomatik yükleme/bırakma):\n - Minimum irtifa %dm \n - Maksimum irtifa %dm \n - Maksimum hız 2mps \n - Parametreler dahilinde: %s", + HOVER_PARAMS_IMPERIAL = "Asılı kalma parametreleri (otomatik yükleme/bırakma):\n - Minimum irtifa %dft \n - Maksimum irtifa %dft \n - Maksimum hız 6ftps \n - Parametreler dahilinde: %s", + FLIGHT_PARAMS_IMPERIAL = "Uçuş parametreleri (havadan bırakma):\n - Minimum irtifa %dft \n - Maksimum irtifa %dft \n - Parametreler dahilinde: %s", + FLIGHT_PARAMS_METRIC = "Uçuş parametreleri (havadan bırakma):\n - Minimum irtifa %dm \n - Maksimum irtifa %dm \n - Parametreler dahilinde: %s", + -- ============================================================ + -- Rapor başlıkları (REPORT:New()) + -- ============================================================ + REPORT_CRATES_FOUND = "Yakında bulunan sandıklar:", + REPORT_REMOVING_CRATES = "Yakında bulunan sandıklar kaldırılıyor:", + REPORT_TRANSPORT_CHECKOUT = "Taşıma kontrol formu", + REPORT_INVENTORY = "Envanter formu", + REPORT_BUILD_CHECKLIST = "İnşa edilebilir sandık kontrol listesi", + REPORT_REPAIR_CHECKLIST = "Onarım kontrol listesi", + REPORT_BEACONS = "Aktif bölge radyo işaretçileri", + -- ============================================================ + -- Rapor bölüm başlıkları (report:Add()) + -- ============================================================ + REPORT_SECTION_TROOPS = " -- BİRLİKLER --", + REPORT_SECTION_CRATES = " -- SANDIKLAR --", + REPORT_SECTION_CRATES_GC = " -- Yer ekibiyle yüklenen SANDIKLAR --", + REPORT_SECTION_NONE = " Y O K", + REPORT_SECTION_NONE_ALT = " --- Hiçbir şey bulunamadı! ---", + REPORT_SECTION_NONE_REPAIR = " --- Hiçbir şey bulunamadı ---", + REPORT_GC_LOADABLE_HINT = "Muhtemelen yer ekibiyle yüklenebilir (F8)", + REPORT_TOTAL_MASS = "Toplam kütle: %s kg. Yüklenebilir: %s kg.", + REPORT_TROOPS_CRATES_COUNT = "Birlikler: %d(%d), Sandıklar: %d(%d)", + REPORT_TROOPS_CRATETYPES_COUNT = "Birlikler: %d, Sandık tipleri: %d", + -- ============================================================ + -- Rapor satır şablonları (öğe başına satırlar) + -- ============================================================ + REPORT_ROW_TROOP = "Birlik: %s boyut %d", + REPORT_ROW_CRATE = "Sandık: %s %d/%d", + REPORT_ROW_CRATE_SIZE1 = "Sandık: %s boyut 1", + REPORT_ROW_GC_CRATE = "Yer ekibiyle yüklenen sandık: %s boyut 1", + REPORT_ROW_DROPPED_CRATE = "%s için bırakılan sandık, %dkg", + REPORT_ROW_CRATE_KG = "%s için sandık, %dkg", + REPORT_ROW_CRATE_REMOVED = "%s için sandık, %dkg kaldırıldı", + REPORT_ROW_UNIT_STOCK = "Birim: %s | Askerler: %d | Stok: %s", + REPORT_ROW_TYPE_CRATE_STOCK = "Tip: %s | Set başına sandık: %d | Stok: %s", + REPORT_ROW_TYPE_STOCK = "Tip: %s | Stok: %s", + REPORT_ROW_BUILD_CHECK = "Tip: %s | Gerekli %d | Bulunan %d | İnşa edilebilir %s", + REPORT_ROW_REPAIR_CHECK = "Tip: %s | Gerekli %d | Bulunan %d | Onarılabilir %s", + REPORT_ROW_BEACON = " %s | FM %s Mhz | VHF %s KHz | UHF %s Mhz ", + -- ============================================================ + -- Ağırlık / sandık limiti belirteçleri + -- ============================================================ + WEIGHT_LIMIT = "Ağırlık limitine ulaşıldı", + CRATE_LIMIT = "Sandık limitine ulaşıldı", + -- ============================================================ + -- Menü etiketleri - üst seviye + -- ============================================================ + MENU_CTLD = "CTLD", + MENU_MANAGE_TROOPS = "Birlikleri yönet", + MENU_MANAGE_CRATES = "Sandıkları yönet", + MENU_MANAGE_UNITS = "Birimleri yönet", + -- ============================================================ + -- Menü etiketleri - birlikler + -- ============================================================ + MENU_LOAD_TROOPS = "Birlik yükle", + MENU_DROP_TROOPS = "Birlik indir", + MENU_DROP_ALL_TROOPS = "TÜM birlikleri indir", + MENU_EXTRACT_TROOPS = "Birlik tahliye et", + MENU_DROP_N_TROOPS = "(%d) %s indir", + -- ============================================================ + -- Menü etiketleri - sandıklar: al + -- ============================================================ + MENU_GET_CRATES = "Sandık talep et", + MENU_GET = "Talep et", + MENU_GET_AND_LOAD = "Talep et ve yükle", + MENU_GET_ANYWAY = "Yine de talep et", + MENU_PARTIALLY_LOAD = "Kısmen yükle", + MENU_OUT_OF_STOCK = "Stokta yok", + MENU_TROOP_LIMIT = "Birlik limitine ulaşıldı", + -- ============================================================ + -- Menü etiketleri - sandıklar: yükle + -- ============================================================ + MENU_LOAD_CRATES = "Sandık yükle", + MENU_LOAD_ALL = "TÜMÜNÜ yükle", + MENU_SHOW_LOADABLE_CRATES = "Yüklenebilir sandıkları göster", + MENU_NO_CRATES_FOUND_RESCAN = "Sandık bulunamadı! Tekrar tara?", + MENU_USE_C130_LOAD = "C-130 yükleme sistemini kullan", + MENU_LOAD_SINGLE = "Yükle", + -- ============================================================ + -- Menü etiketleri - sandıklar: bırak + -- ============================================================ + MENU_DROP_CRATES = "Sandık bırak", + MENU_DROP_ALL_CRATES = "TÜM sandıkları bırak", + MENU_DROP = "Bırak", + MENU_DROP_AND_BUILD = "Bırak ve inşa et", + MENU_DROP_N_SETS = "%d set%.0s bırak", + MENU_NO_CRATES_TO_DROP = "Bırakılacak sandık yok!", + -- ============================================================ + -- Menü etiketleri - sandıklar: inşa / onar / paketle / kaldır + -- ============================================================ + MENU_BUILD_CRATES = "Sandıkları inşa et", + MENU_REPAIR = "Onar", + MENU_PACK_CRATES = "Sandıkları paketle", + MENU_PACK = "Paketle", + MENU_SCAN_PACKABLE_UNITS = "Yakındaki paketlenebilir birimleri tara", + MENU_NO_PACKABLE_UNITS_FOUND_RESCAN = "Paketlenebilir birim bulunamadı! Tekrar tara?", + MENU_PACK_ALL = "Yakındakileri paketle", + MENU_PACK_AND_LOAD = "Paketle ve yükle", + MENU_PACK_AND_LOAD_ALL = "Yakındakileri paketle ve yükle", + MENU_PACK_AND_REMOVE = "Paketle ve kaldır", + MENU_PACK_AND_REMOVE_ALL = "Yakındakileri paketle ve kaldır", + MENU_REMOVE_CRATES = "Sandıkları kaldır", + MENU_REMOVE_CRATES_NEARBY = "Yakındaki sandıkları kaldır", + MENU_LIST_CRATES_NEARBY = "Yakındaki sandıkları listele", + MENU_CRATES_NEEDED = "%d sandık%.0s %s (%dkg)", + MENU_CRATE_SINGLE = "%s (%dkg)", + -- ============================================================ + -- Menü etiketleri - birimler (C-130) + -- ============================================================ + MENU_GET_UNITS = "Birim talep et", + MENU_REMOVE_UNITS_NEARBY = "Yakındaki birimleri kaldır", + -- ============================================================ + -- Menü etiketleri - bilgi / kargo + -- ============================================================ + MENU_LIST_BOARDED_CARGO = "Bindirilmiş kargoyu listele", + MENU_INVENTORY = "Envanter", + MENU_LIST_ZONE_BEACONS = "Aktif bölge radyo işaretçilerini listele", + -- ============================================================ + -- Menü etiketleri - dumanlar / işaret fişekleri / beaconlar + -- ============================================================ + MENU_SMOKES_FLARES_BEACONS = "Dumanlar, işaret fişekleri, radyo işaretçileri", + MENU_SMOKE_ZONES_NEARBY = "Yakındaki bölgelerde duman", + MENU_DROP_SMOKE_NOW = "Şimdi duman işareti bırak", + MENU_RED_SMOKE = "Kırmızı duman", + MENU_BLUE_SMOKE = "Mavi duman", + MENU_GREEN_SMOKE = "Yeşil duman", + MENU_ORANGE_SMOKE = "Turuncu duman", + MENU_WHITE_SMOKE = "Beyaz duman", + MENU_FLARE_ZONES_NEARBY = "Yakındaki bölgelerde işaret fişekleri", + MENU_FIRE_FLARE_NOW = "Şimdi işaret fişeği ateşle", + MENU_DROP_BEACON_NOW = "Şimdi radyo işaretçisi bırak", + -- ============================================================ + -- Menü etiketleri - parametreler + -- ============================================================ + MENU_SHOW_FLIGHT_PARAMS = "Uçuş parametrelerini göster", + MENU_SHOW_HOVER_PARAMS = "Asılı kalma parametrelerini göster", + STOCK_NONE = "yok", + STOCK_UNLIMITED = "sınırsız", + BUILD_YES = "EVET", + BUILD_NO = "HAYIR", + }, RU = { -- ============================================================ -- Crate / Cargo Loading @@ -974,6 +1502,8 @@ FR = { BOARDED = "%s на борту!", BOARDING = "%s грузится!", TROOPS_RETURNED = "Войска вернулись на базу!", + TROOPS_LABEL = "войска", + ENGINEERS_LABEL = "инженеры", -- ============================================================ -- Deployment -- ============================================================ @@ -1163,6 +1693,7 @@ FR = { MENU_REMOVE_CRATES_NEARBY = "Удалить ящики поблизости", MENU_LIST_CRATES_NEARBY = "Список ящиков поблизости", MENU_CRATES_NEEDED = "%d ящик%s %s (%dкг)", + MENU_CRATE_SINGLE = "%s (%dкг)", -- ============================================================ -- Menu labels - Units (C-130) -- ============================================================ @@ -1198,4 +1729,530 @@ FR = { BUILD_YES = "ДА", BUILD_NO = "НЕТ", }, - } + ["zh-TW"] = { + -- ============================================================ + -- Crate / Cargo Loading + -- ============================================================ + CRATE_LOADED_GROUNDCREW = "地勤已裝載貨箱 %s!", + CRATE_UNLOADED_GROUNDCREW = "地勤已卸載貨箱 %s!", + CRATE_LOADED_ID = "貨箱 ID %d(%s)已裝載!", + LOADED_FULL = "已裝載 %d 個 %s。", + LOADED_SETS_LEFTOVER = "已裝載 %d 組 %s,剩餘 %d 個貨箱。", + LOADED_SETS = "已裝載 %d 組 %s。", + LOADED_PARTIAL = "僅裝載 %d/%d 個 %s 的貨箱。", + LOADED_PARTIAL_LIMIT = "僅裝載 %d/%d 個 %s 的貨箱,已達載運上限!", + LOADED_BATCH = "已裝載 %d 個 %s。", + LOADED_BATCH_PARTIAL = "部分組合無法完全裝載。", + -- ============================================================ + -- Dropping / Unloading + -- ============================================================ + DROPPED_FULL = "已投放 %d 個 %s。", + DROPPED_SETS_LEFTOVER = "已投放 %d 組 %s,剩餘 %d 個貨箱。", + DROPPED_SETS = "已投放 %d 組 %s。", + DROPPED_PARTIAL = "已投放 %d/%d 個 %s 的貨箱。", + DROPPED_INTO_ACTION = "已將 %s 投入作戰!", + DROPPED_BEACON = "已投放 %s | FM %s MHz | VHF %s KHz | UHF %s MHz ", + CRATES_POSITIONED = "已在你附近部署 %d 個 %s 貨箱!", + CRATES_DROPPED = "已投放 %d 個 %s 貨箱!", + -- ============================================================ + -- Troops + -- ============================================================ + BOARDED = "%s 已登機!", + BOARDING = "%s 正在登機!", + TROOPS_RETURNED = "部隊已返回基地!", + TROOPS_LABEL = "部隊", + ENGINEERS_LABEL = "工程兵", + -- ============================================================ + -- Deployment + -- ============================================================ + DEPLOYED_NEAR_YOU = "%s 已在你附近部署!", + UNITS_REMOVED = "%s 已移除", + -- ============================================================ + -- Build / Repair + -- ============================================================ + BUILD_STARTED = "建設開始,將於%d 秒後完成!", + REPAIR_STARTED = "使用 %s 開始維修,需時 %d 秒", + NO_UNIT_TO_REPAIR = "附近沒有可維修單位!", + CANT_REPAIR_WITH = "無法使用 %s 維修此單位", + CRATES_MOVE_BEFORE_BUILD = "*** 建設前需先移動貨箱!", + -- ============================================================ + -- Errors - Chopper / Weight / Capacity + -- ============================================================ + CHOPPER_CANNOT_CARRY = "此直升機無法運載貨箱!", + TOO_HEAVY = "重量過重,無法裝載!", + FULLY_LOADED = "已達滿載!", + CRAMMED = "空間已滿!", + NO_CAPACITY_NOW = "目前無法再裝載!", + NO_MORE_CAPACITY = "已無空間裝載貨箱!", + CANNOT_LOAD_NONE_OR_FULL = "無法裝載貨箱:未找到或已無容量。", + -- ============================================================ + -- Errors - Position + -- ============================================================ + NEED_TO_LAND_OR_HOVER_LOAD = "需降落或穩定懸停才能裝載!", + HOVER_OVER_CRATES = "請懸停於貨箱上方進行拾取!", + LAND_OR_HOVER_OVER_CRATES = "請降落或懸停於貨箱上方進行拾取!", + MUST_LAND_OR_HOVER_CRATES = "必須降落或懸停才能裝載貨箱!", + NEED_TO_LAND_BUILD = "飛行員,需降落或停止才能建設!", + NOT_CLOSE_ENOUGH_LOGISTICS = "距離後勤區域過遠!", + NOT_CLOSE_ENOUGH_DROP = "距離投放區域過遠!", + NOT_CLOSE_ENOUGH_ZONE_NM = "距離區域需小於 %d 海浬!", + CANNOT_BUILD_LOADING_AREA = "無法在裝載區域進行建設!", + -- ============================================================ + -- Errors - Doors + -- ============================================================ + OPEN_DOORS_LOAD_CARGO = "需開啟艙門才能裝載貨物!", + OPEN_DOORS_LOAD_TROOPS = "需開啟艙門才能裝載部隊!", + OPEN_DOORS_EXTRACT_TROOPS = "需開啟艙門才能撤離部隊!", + OPEN_DOORS_UNLOAD_TROOPS = "需開啟艙門才能卸載部隊!", + OPEN_DOORS_DROP_CARGO = "需開啟艙門才能投放貨物!", + -- ============================================================ + -- Errors - Stock / Availability + -- ============================================================ + ALL_GONE = "%s 已全部耗盡!", + RAN_OUT_OF = "%s 已用盡", + CARGO_NOT_AVAILABLE_ZONE = "此區域無法取得該貨物!", + ENOUGH_CRATES_NEARBY = "附近已有足夠貨箱,請先處理現有貨箱!", + NO_CRATES_WITHIN = "%d 公尺內沒有可裝載貨箱!", + NO_CRATES_WITHIN_PLAIN = "%d 公尺內沒有貨箱!", + NO_CRATES_IN_RANGE = "範圍內未發現貨箱!", + NO_NAMED_CRATES_IN_RANGE = "範圍內未發現「%s」貨箱!", + NO_LOADABLE_CRATES = "附近沒有可裝載貨箱或已達重量上限!", + NO_UNITS_TO_EXTRACT = "附近沒有可撤離單位!", + NO_UNIT_CONFIG = "未找到 %s 的單位設定", + CANT_ONBOARD = "無法登載 %s", + TOO_MANY_UNITS_NEARBY = "附近已有 %d 個單位!", + NO_CRATE_GROUPS = "未找到此單位的貨箱群組!", + NO_CRATE_SET = "未找到貨箱組或索引無效!", + NO_CRATE_IN_SET = "該組中沒有貨箱!", + NO_TROOP_CHUNK = "未找到 ID %d 的部隊資料!", + TROOP_CHUNK_EMPTY = "ID %d 的部隊資料為空!", + -- ============================================================ + -- Nothing loaded / in stock + -- ============================================================ + NOTHING_LOADED = "未裝載任何內容!\n部隊上限:%d | 貨箱上限 %d | 重量上限 %d 公斤", + NOTHING_LOADED_AIRDROP = "未裝載或不符合空投條件!", + NOTHING_LOADED_HOVER = "未裝載或未達懸停條件!", + NOTHING_IN_STOCK = "庫存為空!", + NOTHING_TO_PACK = "此距離內無可打包目標!", + NOTHING_TO_REMOVE = "此距離內無可移除目標!", + -- ============================================================ + -- Zone / Info + -- ============================================================ + ROGER_ZONE = "收到,%s 區域 %s!", + -- ============================================================ + -- Report: Hover / Flight Parameters + -- ============================================================ + HOVER_PARAMS_METRIC = "懸停參數(自動裝載/投放):\n - 最低高度 %d 公尺 \n - 最高高度 %d 公尺 \n - 最大速度 2 公尺/秒 \n - 是否符合:%s", + HOVER_PARAMS_IMPERIAL = "懸停參數(自動裝載/投放):\n - 最低高度 %d 英尺 \n - 最高高度 %d 英尺 \n - 最大速度 6 英尺/秒 \n - 是否符合:%s", + FLIGHT_PARAMS_IMPERIAL = "飛行參數(空投):\n - 最低高度 %d 英尺 \n - 最高高度 %d 英尺 \n - 是否符合:%s", + FLIGHT_PARAMS_METRIC = "飛行參數(空投):\n - 最低高度 %d 公尺 \n - 最高高度 %d 公尺 \n - 是否符合:%s", + -- ============================================================ + -- Report Titles (REPORT:New()) + -- ============================================================ + REPORT_CRATES_FOUND = "附近發現貨箱:", + REPORT_REMOVING_CRATES = "移除附近貨箱:", + REPORT_TRANSPORT_CHECKOUT = "運輸檢查表", + REPORT_INVENTORY = "庫存報表", + REPORT_BUILD_CHECKLIST = "建設檢查清單", + REPORT_REPAIR_CHECKLIST = "維修檢查清單", + REPORT_BEACONS = "區域信標狀態", + -- ============================================================ + -- Report Section Headers (report:Add()) + -- ============================================================ + REPORT_SECTION_TROOPS = " -- 部隊 --", + REPORT_SECTION_CRATES = " -- 貨箱 --", + REPORT_SECTION_CRATES_GC = " -- 地勤裝載貨箱 --", + REPORT_SECTION_NONE = " 無", + REPORT_SECTION_NONE_ALT = " --- 未發現 ---", + REPORT_SECTION_NONE_REPAIR = " --- 未發現 ---", + REPORT_GC_LOADABLE_HINT = "可能可由地勤裝載(F8)", + REPORT_TOTAL_MASS = "總重量:%s 公斤,可裝載:%s 公斤", + REPORT_TROOPS_CRATES_COUNT = "部隊:%d(%d),貨箱:%d(%d)", + REPORT_TROOPS_CRATETYPES_COUNT = "部隊:%d,貨箱種類:%d", + -- ============================================================ + -- Report Row Templates (per-item lines in reports) + -- ============================================================ + REPORT_ROW_TROOP = "部隊:%s 人數 %d", + REPORT_ROW_CRATE = "貨箱:%s %d/%d", + REPORT_ROW_CRATE_SIZE1 = "貨箱:%s 尺寸 1", + REPORT_ROW_GC_CRATE = "地勤裝載貨箱:%s 尺寸 1", + REPORT_ROW_DROPPED_CRATE = "已投放 %s 貨箱,%d 公斤", + REPORT_ROW_CRATE_KG = "%s 貨箱,%d 公斤", + REPORT_ROW_CRATE_REMOVED = "%s 貨箱,%d 公斤 已移除", + REPORT_ROW_UNIT_STOCK = "單位:%s | 士兵:%d | 庫存:%s", + REPORT_ROW_TYPE_CRATE_STOCK = "類型:%s | 每組貨箱:%d | 庫存:%s", + REPORT_ROW_TYPE_STOCK = "類型:%s | 庫存:%s", + REPORT_ROW_BUILD_CHECK = "類型:%s | 需求 %d | 已有 %d | 可建設 %s", + REPORT_ROW_REPAIR_CHECK = "類型:%s | 需求 %d | 已有 %d | 可維修 %s", + REPORT_ROW_BEACON = " %s | FM %s MHz | VHF %s KHz | UHF %s MHz ", + -- ============================================================ + -- Weight / Crate limit tokens + -- ============================================================ + WEIGHT_LIMIT = "已達重量上限", + CRATE_LIMIT = "已達貨箱上限", + -- ============================================================ + -- Menu labels - Top level + -- ============================================================ + MENU_CTLD = "後勤管理(CTLD)", + MENU_MANAGE_TROOPS = "部隊管理", + MENU_MANAGE_CRATES = "貨箱管理", + MENU_MANAGE_UNITS = "單位管理", + -- ============================================================ + -- Menu labels - Troops + -- ============================================================ + MENU_LOAD_TROOPS = "裝載部隊", + MENU_DROP_TROOPS = "投放部隊", + MENU_DROP_ALL_TROOPS = "投放全部部隊", + MENU_EXTRACT_TROOPS = "撤離部隊", + MENU_DROP_N_TROOPS = "投放 (%d) %s", + -- ============================================================ + -- Menu labels - Crates: Get + -- ============================================================ + MENU_GET_CRATES = "取得貨箱", + MENU_GET = "取得", + MENU_GET_AND_LOAD = "取得並裝載", + MENU_GET_ANYWAY = "強制取得", + MENU_PARTIALLY_LOAD = "部分裝載", + MENU_OUT_OF_STOCK = "無庫存", + MENU_TROOP_LIMIT = "已達部隊上限", + -- ============================================================ + -- Menu labels - Crates: Load + -- ============================================================ + MENU_LOAD_CRATES = "裝載貨箱", + MENU_LOAD_ALL = "全部裝載", + MENU_SHOW_LOADABLE_CRATES = "顯示可裝載貨箱", + MENU_NO_CRATES_FOUND_RESCAN = "未發現貨箱,重新掃描?", + MENU_USE_C130_LOAD = "使用 C-130 裝載系統", + MENU_LOAD_SINGLE = "裝載", + -- ============================================================ + -- Menu labels - Crates: Drop + -- ============================================================ + MENU_DROP_CRATES = "投放貨箱", + MENU_DROP_ALL_CRATES = "投放全部貨箱", + MENU_DROP = "投放", + MENU_DROP_AND_BUILD = "投放並建設", + MENU_DROP_N_SETS = "投放 %d 組%s", + MENU_NO_CRATES_TO_DROP = "沒有可投放貨箱", + -- ============================================================ + -- Menu labels - Crates: Build / Repair / Pack / Remove + -- ============================================================ + MENU_BUILD_CRATES = "建設貨箱", + MENU_REPAIR = "維修", + MENU_PACK_CRATES = "打包貨箱", + MENU_PACK = "打包", + MENU_SCAN_PACKABLE_UNITS = "掃描可打包單位", + MENU_NO_PACKABLE_UNITS_FOUND_RESCAN = "未發現可打包單位,重新掃描?", + MENU_PACK_ALL = "打包附近", + MENU_PACK_AND_LOAD = "打包並裝載", + MENU_PACK_AND_LOAD_ALL = "打包並裝載附近", + MENU_PACK_AND_REMOVE = "打包並移除", + MENU_PACK_AND_REMOVE_ALL = "打包並移除附近", + MENU_REMOVE_CRATES = "移除貨箱", + MENU_REMOVE_CRATES_NEARBY = "移除附近貨箱", + MENU_LIST_CRATES_NEARBY = "列出附近貨箱", + MENU_CRATES_NEEDED = "%d 個貨箱%s %s(%d 公斤)", + MENU_CRATE_SINGLE = "%s(%d 公斤)", + -- ============================================================ + -- Menu labels - Units (C-130) + -- ============================================================ + MENU_GET_UNITS = "取得單位", + MENU_REMOVE_UNITS_NEARBY = "移除附近單位", + -- ============================================================ + -- Menu labels - Info / Cargo + -- ============================================================ + MENU_LIST_BOARDED_CARGO = "查看已裝載貨物", + MENU_INVENTORY = "庫存", + MENU_LIST_ZONE_BEACONS = "列出區域信標", + -- ============================================================ + -- Menu labels - Smokes / Flares / Beacons + -- ============================================================ + MENU_SMOKES_FLARES_BEACONS = "煙霧、照明彈、信標", + MENU_SMOKE_ZONES_NEARBY = "標記附近區域", + MENU_DROP_SMOKE_NOW = "立即投放煙霧", + MENU_RED_SMOKE = "紅色煙霧", + MENU_BLUE_SMOKE = "藍色煙霧", + MENU_GREEN_SMOKE = "綠色煙霧", + MENU_ORANGE_SMOKE = "橙色煙霧", + MENU_WHITE_SMOKE = "白色煙霧", + MENU_FLARE_ZONES_NEARBY = "標記附近區域(照明彈)", + MENU_FIRE_FLARE_NOW = "立即發射照明彈", + MENU_DROP_BEACON_NOW = "立即投放信標", + -- ============================================================ + -- Menu labels - Parameters + -- ============================================================ + MENU_SHOW_FLIGHT_PARAMS = "顯示飛行參數", + MENU_SHOW_HOVER_PARAMS = "顯示懸停參數", + STOCK_NONE = "無", + STOCK_UNLIMITED = "無限制", + BUILD_YES = "是", + BUILD_NO = "否", + }, + ["zh-CN"] = { + -- ============================================================ + -- Crate / Cargo Loading + -- ============================================================ + CRATE_LOADED_GROUNDCREW = "地勤已装载货箱 %s!", + CRATE_UNLOADED_GROUNDCREW = "地勤已卸载货箱 %s!", + CRATE_LOADED_ID = "货箱 ID %d(%s)已装载!", + LOADED_FULL = "已装载 %d 个 %s。", + LOADED_SETS_LEFTOVER = "已装载 %d 组 %s,剩余 %d 个货箱。", + LOADED_SETS = "已装载 %d 组 %s。", + LOADED_PARTIAL = "仅装载 %d/%d 个 %s 的货箱。", + LOADED_PARTIAL_LIMIT = "仅装载 %d/%d 个 %s 的货箱,已达到载重上限!", + LOADED_BATCH = "已装载 %d 个 %s。", + LOADED_BATCH_PARTIAL = "部分组合未能完整装载。", + + -- ============================================================ + -- Dropping / Unloading + -- ============================================================ + DROPPED_FULL = "已投放 %d 个 %s。", + DROPPED_SETS_LEFTOVER = "已投放 %d 组 %s,剩余 %d 个货箱。", + DROPPED_SETS = "已投放 %d 组 %s。", + DROPPED_PARTIAL = "已投放 %d/%d 个 %s 的货箱。", + DROPPED_INTO_ACTION = "已将 %s 投入作战!", + DROPPED_BEACON = "已投放 %s | FM %s MHz | VHF %s KHz | UHF %s MHz ", + CRATES_POSITIONED = "已在你附近部署 %d 个 %s 货箱!", + CRATES_DROPPED = "已投放 %d 个 %s 货箱!", + + -- ============================================================ + -- Troops + -- ============================================================ + BOARDED = "%s 已登机!", + BOARDING = "%s 正在登机!", + TROOPS_RETURNED = "部队已返回基地!", + TROOPS_LABEL = "部队", + ENGINEERS_LABEL = "工兵", + + -- ============================================================ + -- Deployment + -- ============================================================ + DEPLOYED_NEAR_YOU = "%s 已在你附近部署!", + UNITS_REMOVED = "%s 已移除", + + -- ============================================================ + -- Build / Repair + -- ============================================================ + BUILD_STARTED = "开始建造,%d 秒后完成!", + REPAIR_STARTED = "使用 %s 开始维修,耗时 %d 秒", + NO_UNIT_TO_REPAIR = "附近没有可维修单位!", + CANT_REPAIR_WITH = "无法使用 %s 修复该单位", + CRATES_MOVE_BEFORE_BUILD = "*** 建造前请先移动货箱!", + + -- ============================================================ + -- Errors - Chopper / Weight / Capacity + -- ============================================================ + CHOPPER_CANNOT_CARRY = "该直升机无法运输货箱!", + TOO_HEAVY = "重量超限,无法装载!", + FULLY_LOADED = "已满载!", + CRAMMED = "空间已满!", + NO_CAPACITY_NOW = "当前无法继续装载!", + NO_MORE_CAPACITY = "没有剩余空间可装载货箱!", + CANNOT_LOAD_NONE_OR_FULL = "无法装载货箱:未找到或已满载。", + + -- ============================================================ + -- Errors - Position + -- ============================================================ + NEED_TO_LAND_OR_HOVER_LOAD = "需要降落或稳定悬停才能装载!", + HOVER_OVER_CRATES = "请在货箱上方悬停进行拾取!", + LAND_OR_HOVER_OVER_CRATES = "请降落或在货箱上方悬停进行拾取!", + MUST_LAND_OR_HOVER_CRATES = "必须降落或悬停才能装载货箱!", + NEED_TO_LAND_BUILD = "飞行员,请降落或停止后再建造!", + NOT_CLOSE_ENOUGH_LOGISTICS = "距离后勤区域过远!", + NOT_CLOSE_ENOUGH_DROP = "距离投放区域过远!", + NOT_CLOSE_ENOUGH_ZONE_NM = "距离区域必须小于 %d 海里!", + CANNOT_BUILD_LOADING_AREA = "无法在装载区域建造!", + + -- ============================================================ + -- Errors - Doors + -- ============================================================ + OPEN_DOORS_LOAD_CARGO = "需要打开舱门才能装载货物!", + OPEN_DOORS_LOAD_TROOPS = "需要打开舱门才能装载部队!", + OPEN_DOORS_EXTRACT_TROOPS = "需要打开舱门才能撤离部队!", + OPEN_DOORS_UNLOAD_TROOPS = "需要打开舱门才能卸载部队!", + OPEN_DOORS_DROP_CARGO = "需要打开舱门才能投放货物!", + + -- ============================================================ + -- Errors - Stock / Availability + -- ============================================================ + ALL_GONE = "%s 已全部耗尽!", + RAN_OUT_OF = "%s 已用完", + CARGO_NOT_AVAILABLE_ZONE = "该区域无法获取此类货物!", + ENOUGH_CRATES_NEARBY = "附近已有足够货箱,请先处理现有货箱!", + NO_CRATES_WITHIN = "%d 米内没有可装载货箱!", + NO_CRATES_WITHIN_PLAIN = "%d 米内没有货箱!", + NO_CRATES_IN_RANGE = "范围内未发现货箱!", + NO_NAMED_CRATES_IN_RANGE = "范围内未发现“%s”货箱!", + NO_LOADABLE_CRATES = "附近没有可装载货箱或已超重!", + NO_UNITS_TO_EXTRACT = "附近没有可撤离单位!", + NO_UNIT_CONFIG = "未找到 %s 的单位配置", + CANT_ONBOARD = "无法装载 %s", + TOO_MANY_UNITS_NEARBY = "附近已有 %d 个单位!", + NO_CRATE_GROUPS = "未找到该单位对应的货箱组!", + NO_CRATE_SET = "未找到货箱组或索引无效!", + NO_CRATE_IN_SET = "该组中没有货箱!", + NO_TROOP_CHUNK = "未找到 ID %d 的部队数据!", + TROOP_CHUNK_EMPTY = "ID %d 的部队数据为空!", + + -- ============================================================ + -- Nothing loaded / in stock + -- ============================================================ + NOTHING_LOADED = "未装载任何内容!\n部队上限:%d | 货箱上限 %d | 重量上限 %d 公斤", + NOTHING_LOADED_AIRDROP = "未装载或不满足空投条件!", + NOTHING_LOADED_HOVER = "未装载或未满足悬停条件!", + NOTHING_IN_STOCK = "库存为空!", + NOTHING_TO_PACK = "该范围内没有可打包目标!", + NOTHING_TO_REMOVE = "该范围内没有可移除目标!", + + -- ============================================================ + -- Zone / Info + -- ============================================================ + ROGER_ZONE = "收到,%s 区域 %s!", + -- ============================================================ + -- Report: Hover / Flight Parameters + -- ============================================================ + HOVER_PARAMS_METRIC = "悬停参数(自动装载/投放):\n - 最低高度 %d 米 \n - 最高高度 %d 米 \n - 最大速度 2 米/秒 \n - 是否符合条件:%s", + HOVER_PARAMS_IMPERIAL = "悬停参数(自动装载/投放):\n - 最低高度 %d 英尺 \n - 最高高度 %d 英尺 \n - 最大速度 6 英尺/秒 \n - 是否符合条件:%s", + FLIGHT_PARAMS_IMPERIAL = "飞行参数(空投):\n - 最低高度 %d 英尺 \n - 最高高度 %d 英尺 \n - 是否符合条件:%s", + FLIGHT_PARAMS_METRIC = "飞行参数(空投):\n - 最低高度 %d 米 \n - 最高高度 %d 米 \n - 是否符合条件:%s", + -- ============================================================ + -- Report Titles (REPORT:New()) + -- ============================================================ + REPORT_CRATES_FOUND = "附近发现货箱:", + REPORT_REMOVING_CRATES = "删除附近货箱:", + REPORT_TRANSPORT_CHECKOUT = "运输检查表", + REPORT_INVENTORY = "库存报表", + REPORT_BUILD_CHECKLIST = "建造检查清单", + REPORT_REPAIR_CHECKLIST = "维修检查清单", + REPORT_BEACONS = "区域信标状态", + -- ============================================================ + -- Report Section Headers (report:Add()) + -- ============================================================ + REPORT_SECTION_TROOPS = " -- 部队 --", + REPORT_SECTION_CRATES = " -- 货箱 --", + REPORT_SECTION_CRATES_GC = " -- 地勤装载货箱 --", + REPORT_SECTION_NONE = " 无", + REPORT_SECTION_NONE_ALT = " --- 未发现 ---", + REPORT_SECTION_NONE_REPAIR = " --- 未发现 ---", + REPORT_GC_LOADABLE_HINT = "可能可由地勤装载(F8)", + REPORT_TOTAL_MASS = "总重量:%s 公斤,可装载:%s 公斤", + REPORT_TROOPS_CRATES_COUNT = "部队:%d(%d),货箱:%d(%d)", + REPORT_TROOPS_CRATETYPES_COUNT = "部队:%d,货箱种类:%d", + -- ============================================================ + -- Report Row Templates (per-item lines in reports) + -- ============================================================ + REPORT_ROW_TROOP = "部队:%s 人数 %d", + REPORT_ROW_CRATE = "货箱:%s %d/%d", + REPORT_ROW_CRATE_SIZE1 = "货箱:%s 尺寸 1", + REPORT_ROW_GC_CRATE = "地勤装载货箱:%s 尺寸 1", + REPORT_ROW_DROPPED_CRATE = "已投放 %s 货箱,%d 公斤", + REPORT_ROW_CRATE_KG = "%s 货箱,%d 公斤", + REPORT_ROW_CRATE_REMOVED = "%s 货箱,%d 公斤 已移除", + REPORT_ROW_UNIT_STOCK = "单位:%s | 士兵:%d | 库存:%s", + REPORT_ROW_TYPE_CRATE_STOCK = "类型:%s | 每组货箱:%d | 库存:%s", + REPORT_ROW_TYPE_STOCK = "类型:%s | 库存:%s", + REPORT_ROW_BUILD_CHECK = "类型:%s | 需求 %d | 已有 %d | 可建造 %s", + REPORT_ROW_REPAIR_CHECK = "类型:%s | 需求 %d | 已有 %d | 可维修 %s", + REPORT_ROW_BEACON = " %s | FM %s MHz | VHF %s KHz | UHF %s MHz ", + -- ============================================================ + -- Weight / Crate limit tokens + -- ============================================================ + WEIGHT_LIMIT = "已达重量上限", + CRATE_LIMIT = "已达货箱上限", + -- ============================================================ + -- Menu labels - Top level + -- ============================================================ + MENU_CTLD = "后勤系统(CTLD)", + MENU_MANAGE_TROOPS = "部队管理", + MENU_MANAGE_CRATES = "货箱管理", + MENU_MANAGE_UNITS = "单位管理", + -- ============================================================ + -- Menu labels - Troops + -- ============================================================ + MENU_LOAD_TROOPS = "装载部队", + MENU_DROP_TROOPS = "投放部队", + MENU_DROP_ALL_TROOPS = "投放全部部队", + MENU_EXTRACT_TROOPS = "撤离部队", + MENU_DROP_N_TROOPS = "投放 (%d) %s", + -- ============================================================ + -- Menu labels - Crates: Get + -- ============================================================ + MENU_GET_CRATES = "获取货箱", + MENU_GET = "获取", + MENU_GET_AND_LOAD = "获取并装载", + MENU_GET_ANYWAY = "强制获取", + MENU_PARTIALLY_LOAD = "部分装载", + MENU_OUT_OF_STOCK = "无库存", + MENU_TROOP_LIMIT = "已达部队上限", + -- ============================================================ + -- Menu labels - Crates: Load + -- ============================================================ + MENU_LOAD_CRATES = "装载货箱", + MENU_LOAD_ALL = "全部装载", + MENU_SHOW_LOADABLE_CRATES = "显示可装载货箱", + MENU_NO_CRATES_FOUND_RESCAN = "未检测到货箱,是否重新扫描?", + MENU_USE_C130_LOAD = "使用 C-130 装载系统", + MENU_LOAD_SINGLE = "装载", + -- ============================================================ + -- Menu labels - Crates: Drop + -- ============================================================ + MENU_DROP_CRATES = "投放货箱", + MENU_DROP_ALL_CRATES = "投放全部货箱", + MENU_DROP = "投放", + MENU_DROP_AND_BUILD = "投放并建造", + MENU_DROP_N_SETS = "投放 %d 组%s", + MENU_NO_CRATES_TO_DROP = "无可投放货箱", + -- ============================================================ + -- Menu labels - Crates: Build / Repair / Pack / Remove + -- ============================================================ + MENU_BUILD_CRATES = "建造货箱", + MENU_REPAIR = "维修", + MENU_PACK_CRATES = "打包货箱", + MENU_PACK = "打包", + MENU_SCAN_PACKABLE_UNITS = "扫描可打包单位", + MENU_NO_PACKABLE_UNITS_FOUND_RESCAN = "未发现可打包单位,重新扫描?", + MENU_PACK_ALL = "打包附近单位", + MENU_PACK_AND_LOAD = "打包并装载", + MENU_PACK_AND_LOAD_ALL = "打包并装载附近", + MENU_PACK_AND_REMOVE = "打包并移除", + MENU_PACK_AND_REMOVE_ALL = "打包并移除附近", + MENU_REMOVE_CRATES = "移除货箱", + MENU_REMOVE_CRATES_NEARBY = "删除附近货箱", + MENU_LIST_CRATES_NEARBY = "显示附近货箱", + MENU_CRATES_NEEDED = "%d 个货箱%s %s(%d 公斤)", + MENU_CRATE_SINGLE = "%s(%d 公斤)", + -- ============================================================ + -- Menu labels - Units (C-130) + -- ============================================================ + MENU_GET_UNITS = "获取单位", + MENU_REMOVE_UNITS_NEARBY = "移除附近单位", + -- ============================================================ + -- Menu labels - Info / Cargo + -- ============================================================ + MENU_LIST_BOARDED_CARGO = "查看已装载货物", + MENU_INVENTORY = "库存", + MENU_LIST_ZONE_BEACONS = "显示区域信标", + -- ============================================================ + -- Menu labels - Smokes / Flares / Beacons + -- ============================================================ + MENU_SMOKES_FLARES_BEACONS = "烟雾、照明弹、信标", + MENU_SMOKE_ZONES_NEARBY = "标记附近区域", + MENU_DROP_SMOKE_NOW = "立即释放烟雾", + MENU_RED_SMOKE = "红色烟雾", + MENU_BLUE_SMOKE = "蓝色烟雾", + MENU_GREEN_SMOKE = "绿色烟雾", + MENU_ORANGE_SMOKE = "橙色烟雾", + MENU_WHITE_SMOKE = "白色烟雾", + MENU_FLARE_ZONES_NEARBY = "标记附近区域(照明弹)", + MENU_FIRE_FLARE_NOW = "立即发射照明弹", + MENU_DROP_BEACON_NOW = "立即投放信标", + -- ============================================================ + -- Menu labels - Parameters + -- ============================================================ + MENU_SHOW_FLIGHT_PARAMS = "显示飞行参数", + MENU_SHOW_HOVER_PARAMS = "显示悬停参数", + STOCK_NONE = "无", + STOCK_UNLIMITED = "无限制", + BUILD_YES = "是", + BUILD_NO = "否", + }, +}