@jtff/miztemplate-lib 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- env.info('*** MOOSE GITHUB Commit Hash ID: 2026-04-16T12:38:15+02:00-87d0c4e9d4680eb50a634bdf15ed3f748bd2e2f8 ***')
1
+ env.info('*** MOOSE GITHUB Commit Hash ID: 2026-05-14T10:46:22+02:00-696630fe4d7c53e25c3599abea51a147a4363f1a ***')
2
2
  if not MOOSE_DEVELOPMENT_FOLDER then
3
3
  MOOSE_DEVELOPMENT_FOLDER='Scripts'
4
4
  end
@@ -13555,6 +13555,7 @@ Coalitions={
13555
13555
  },
13556
13556
  },
13557
13557
  filterNoRegex=false,
13558
+ filterReplaceDash=true,
13558
13559
  }
13559
13560
  function SET_BASE:New(Database)
13560
13561
  local self=BASE:Inherit(self,FSM:New())
@@ -13616,12 +13617,18 @@ return ObjectFound
13616
13617
  end
13617
13618
  function SET_BASE:_SearchPattern(Name,Pattern,NoRegex,ReplaceDash)
13618
13619
  NoRegex=NoRegex or self.filterNoRegex
13619
- if ReplaceDash==true then
13620
+ ReplaceDash=ReplaceDash or self.filterReplaceDash
13621
+ if ReplaceDash==true and NoRegex~=true then
13620
13622
  Pattern=Pattern:gsub("-","%%-")
13621
13623
  end
13622
13624
  local contain=string.find(Name,Pattern,1,NoRegex)
13623
13625
  return contain
13624
13626
  end
13627
+ function SET_BASE:FilterSetRegex(NoRegex,ReplaceDash)
13628
+ if NoRegex~=nil then self.filterNoRegex=NoRegex end
13629
+ self.filterReplaceDash=ReplaceDash or true
13630
+ return self
13631
+ end
13625
13632
  function SET_BASE:GetSet()
13626
13633
  return self.Set or{}
13627
13634
  end
@@ -14459,7 +14466,7 @@ end
14459
14466
  if self.Filter.GroupPrefixes and MGroupInclude then
14460
14467
  local MGroupPrefix=false
14461
14468
  for GroupPrefixId,GroupPrefix in pairs(self.Filter.GroupPrefixes)do
14462
- if self:_SearchPattern(MGroup:GetName(),GroupPrefix,false,true)then
14469
+ if self:_SearchPattern(MGroup:GetName(),GroupPrefix,self.filterNoRegex,self.filterReplaceDash)then
14463
14470
  MGroupPrefix=true
14464
14471
  end
14465
14472
  end
@@ -15098,7 +15105,7 @@ end
15098
15105
  if self.Filter.UnitPrefixes and MUnitInclude then
15099
15106
  local MUnitPrefix=false
15100
15107
  for UnitPrefixId,UnitPrefix in pairs(self.Filter.UnitPrefixes)do
15101
- if self:_SearchPattern(MUnit:GetName(),UnitPrefix,false,true)then
15108
+ if self:_SearchPattern(MUnit:GetName(),UnitPrefix,self.filterNoRegex,self.filterReplaceDash)then
15102
15109
  MUnitPrefix=true
15103
15110
  end
15104
15111
  end
@@ -15509,7 +15516,7 @@ end
15509
15516
  if self.Filter.StaticPrefixes then
15510
15517
  local MStaticPrefix=false
15511
15518
  for StaticPrefixId,StaticPrefix in pairs(self.Filter.StaticPrefixes)do
15512
- if self:_SearchPattern(MStatic:GetName(),StaticPrefix,false,true)then
15519
+ if self:_SearchPattern(MStatic:GetName(),StaticPrefix,self.filterNoRegex,self.filterReplaceDash)then
15513
15520
  MStaticPrefix=true
15514
15521
  end
15515
15522
  end
@@ -15933,7 +15940,7 @@ end
15933
15940
  if self.Filter.ClientPrefixes and MClientInclude then
15934
15941
  local MClientPrefix=false
15935
15942
  for ClientPrefixId,ClientPrefix in pairs(self.Filter.ClientPrefixes)do
15936
- if self:_SearchPattern(MClient.UnitName,ClientPrefix)then
15943
+ if self:_SearchPattern(MClient.UnitName,ClientPrefix,self.filterNoRegex,self.filterReplaceDash)then
15937
15944
  MClientPrefix=true
15938
15945
  end
15939
15946
  end
@@ -15953,7 +15960,7 @@ if self.Filter.Playernames and MClientInclude then
15953
15960
  local MClientPlayername=false
15954
15961
  local playername=MClient:GetPlayerName()or"Unknown"
15955
15962
  for _,_Playername in pairs(self.Filter.Playernames)do
15956
- if playername and self:_SearchPattern(playername,_Playername)then
15963
+ if playername and self:_SearchPattern(playername,_Playername,self.filterNoRegex,self.filterReplaceDash)then
15957
15964
  MClientPlayername=true
15958
15965
  end
15959
15966
  end
@@ -15963,7 +15970,7 @@ if self.Filter.Callsigns and MClientInclude then
15963
15970
  local MClientCallsigns=false
15964
15971
  local callsign=MClient:GetCallsign()
15965
15972
  for _,_Callsign in pairs(self.Filter.Callsigns)do
15966
- if callsign and self:_SearchPattern(callsign,_Callsign,true)then
15973
+ if callsign and self:_SearchPattern(callsign,_Callsign,self.filterNoRegex,self.filterReplaceDash)then
15967
15974
  MClientCallsigns=true
15968
15975
  end
15969
15976
  end
@@ -16192,7 +16199,7 @@ end
16192
16199
  if self.Filter.ClientPrefixes then
16193
16200
  local MClientPrefix=false
16194
16201
  for ClientPrefixId,ClientPrefix in pairs(self.Filter.ClientPrefixes)do
16195
- if self:_SearchPattern(MClient.UnitName,ClientPrefix)then
16202
+ if self:_SearchPattern(MClient.UnitName,ClientPrefix,self.filterNoRegex,self.filterReplaceDash)then
16196
16203
  MClientPrefix=true
16197
16204
  end
16198
16205
  end
@@ -16525,7 +16532,7 @@ local MZoneName=MZone:GetName()
16525
16532
  if self.Filter.Prefixes then
16526
16533
  local MZonePrefix=false
16527
16534
  for ZonePrefixId,ZonePrefix in pairs(self.Filter.Prefixes)do
16528
- if self:_SearchPattern(MZoneName,ZonePrefix,false,true)then
16535
+ if self:_SearchPattern(MZoneName,ZonePrefix,self.filterNoRegex,self.filterReplaceDash)then
16529
16536
  MZonePrefix=true
16530
16537
  end
16531
16538
  end
@@ -16754,7 +16761,7 @@ local MZoneName=MZone:GetName()
16754
16761
  if self.Filter.Prefixes then
16755
16762
  local MZonePrefix=false
16756
16763
  for ZonePrefixId,ZonePrefix in pairs(self.Filter.Prefixes)do
16757
- if self:_SearchPattern(MZoneName,ZonePrefix,false,true)then
16764
+ if self:_SearchPattern(MZoneName,ZonePrefix,self.filterNoRegex,self.filterReplaceDash)then
16758
16765
  MZonePrefix=true
16759
16766
  end
16760
16767
  end
@@ -16907,7 +16914,7 @@ local MZoneName=MZone:GetName()
16907
16914
  if self.Filter.Prefixes then
16908
16915
  local MZonePrefix=false
16909
16916
  for ZonePrefixId,ZonePrefix in pairs(self.Filter.Prefixes)do
16910
- if self:_SearchPattern(MZoneName,ZonePrefix,false,true)then
16917
+ if self:_SearchPattern(MZoneName,ZonePrefix,self.filterNoRegex,self.filterReplaceDash)then
16911
16918
  MZonePrefix=true
16912
16919
  break
16913
16920
  end
@@ -17266,7 +17273,7 @@ end
17266
17273
  if self.Filter.GroupPrefixes and MGroupInclude then
17267
17274
  local MGroupPrefix=false
17268
17275
  for GroupPrefixId,GroupPrefix in pairs(self.Filter.GroupPrefixes)do
17269
- if self:_SearchPattern(MGroup:GetName(),GroupPrefix,false,true)then
17276
+ if self:_SearchPattern(MGroup:GetName(),GroupPrefix,self.filterNoRegex,self.filterReplaceDash)then
17270
17277
  MGroupPrefix=true
17271
17278
  end
17272
17279
  end
@@ -17430,7 +17437,7 @@ local MSceneryName=MScenery:GetName()
17430
17437
  if self.Filter.Prefixes then
17431
17438
  local MSceneryPrefix=false
17432
17439
  for ZonePrefixId,ZonePrefix in pairs(self.Filter.Prefixes)do
17433
- if self:_SearchPattern(MSceneryName,ZonePrefix,false,true)then
17440
+ if self:_SearchPattern(MSceneryName,ZonePrefix,self.filterNoRegex,self.filterReplaceDash)then
17434
17441
  MSceneryPrefix=true
17435
17442
  end
17436
17443
  end
@@ -17561,7 +17568,7 @@ end
17561
17568
  if self.Filter.StaticPrefixes then
17562
17569
  local DCargoPrefix=false
17563
17570
  for StaticPrefixId,StaticPrefix in pairs(self.Filter.StaticPrefixes)do
17564
- if self:_SearchPattern(DCargo:GetName(),StaticPrefix,false,true)then
17571
+ if self:_SearchPattern(DCargo:GetName(),StaticPrefix,self.filterNoRegex,self.filterReplaceDash)then
17565
17572
  DCargoPrefix=true
17566
17573
  end
17567
17574
  end
@@ -17660,7 +17667,7 @@ end
17660
17667
  function SET_DYNAMICCARGO:FilterCurrentOwner(PlayerName)
17661
17668
  self:FilterFunction(
17662
17669
  function(cargo)
17663
- if cargo and cargo.Owner and self:_SearchPattern(cargo.Owner,PlayerName,true)then
17670
+ if cargo and cargo.Owner and self:_SearchPattern(cargo.Owner,PlayerName,self.filterNoRegex,self.filterReplaceDash)then
17664
17671
  return true
17665
17672
  else
17666
17673
  return false
@@ -20886,6 +20893,9 @@ self.SpawnGrouping=Grouping
20886
20893
  return self
20887
20894
  end
20888
20895
  function SPAWN:InitRandomizeZones(SpawnZoneTable,RandomizePositionInZone)
20896
+ if not SpawnZoneTable then
20897
+ return self
20898
+ end
20889
20899
  local temptable={}
20890
20900
  for _,_temp in pairs(SpawnZoneTable)do
20891
20901
  temptable[#temptable+1]=_temp
@@ -21354,6 +21364,7 @@ end
21354
21364
  local parkingspots={}
21355
21365
  local parkingindex={}
21356
21366
  local spots
21367
+ local useexplicitspots=false
21357
21368
  if spawnonground and not SpawnTemplate.parked then
21358
21369
  local nfree=0
21359
21370
  local termtype=TerminalType
@@ -21373,12 +21384,31 @@ local scanunits=true
21373
21384
  local scanstatics=true
21374
21385
  local scanscenery=false
21375
21386
  local verysafe=false
21376
- if autoparking then
21377
- nfree=SpawnAirbase:GetFreeParkingSpotsNumber(termtype,true)
21378
- spots=SpawnAirbase:GetFreeParkingSpotsTable(termtype,true)
21379
- elseif Parkingdata~=nil then
21387
+ if Parkingdata~=nil then
21380
21388
  nfree=#Parkingdata
21381
21389
  spots=Parkingdata
21390
+ useexplicitspots=true
21391
+ elseif autoparking and AirbaseCategory==Airbase.Category.HELIPAD and ishelo then
21392
+ if termtype==nil then
21393
+ spots=SpawnAirbase:FindFreeParkingSpotForAircraft(group,AIRBASE.TerminalType.HelicopterOnly,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,nil)
21394
+ nfree=#spots
21395
+ if nfree<nunits then
21396
+ spots=SpawnAirbase:FindFreeParkingSpotForAircraft(group,AIRBASE.TerminalType.HelicopterUsable,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,nil)
21397
+ nfree=#spots
21398
+ end
21399
+ else
21400
+ spots=SpawnAirbase:FindFreeParkingSpotForAircraft(group,termtype,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,nil)
21401
+ nfree=#spots
21402
+ end
21403
+ if nfree>=nunits then
21404
+ useexplicitspots=true
21405
+ else
21406
+ nfree=SpawnAirbase:GetFreeParkingSpotsNumber(termtype,true)
21407
+ spots=SpawnAirbase:GetFreeParkingSpotsTable(termtype,true)
21408
+ end
21409
+ elseif autoparking then
21410
+ nfree=SpawnAirbase:GetFreeParkingSpotsNumber(termtype,true)
21411
+ spots=SpawnAirbase:GetFreeParkingSpotsTable(termtype,true)
21382
21412
  else
21383
21413
  if ishelo then
21384
21414
  if termtype==nil then
@@ -21412,7 +21442,7 @@ end
21412
21442
  end
21413
21443
  end
21414
21444
  local _notenough=false
21415
- if autoparking then
21445
+ if autoparking and not useexplicitspots then
21416
21446
  if nfree>=1 then
21417
21447
  for i=1,nunits do
21418
21448
  table.insert(parkingspots,spots[1].Coordinate)
@@ -21432,6 +21462,9 @@ else
21432
21462
  _notenough=true
21433
21463
  end
21434
21464
  end
21465
+ if useexplicitspots and parkingspots[1]then
21466
+ PointVec3=parkingspots[1]
21467
+ end
21435
21468
  if _notenough then
21436
21469
  if EmergencyAirSpawn and not self.SpawnUnControlled then
21437
21470
  self:E(string.format("WARNING: Group %s has no parking spots at %s ==> air start!",self.SpawnTemplatePrefix,SpawnAirbase:GetName()))
@@ -21474,7 +21507,7 @@ local BY=SpawnTemplate.route.points[1].y
21474
21507
  local TX=PointVec3.x+(SX-BX)
21475
21508
  local TY=PointVec3.z+(SY-BY)
21476
21509
  if spawnonground then
21477
- if autoparking then
21510
+ if autoparking and not useexplicitspots then
21478
21511
  SpawnTemplate.units[UnitID].x=PointVec3.x
21479
21512
  SpawnTemplate.units[UnitID].y=PointVec3.z
21480
21513
  SpawnTemplate.units[UnitID].alt=PointVec3.y
@@ -21600,7 +21633,30 @@ local scanunits=true
21600
21633
  local scanstatics=true
21601
21634
  local scanscenery=false
21602
21635
  local verysafe=false
21603
- if spawnonship or spawnonfarp or spawnonrunway then
21636
+ local useexplicitspots=false
21637
+ if Parkingdata~=nil then
21638
+ nfree=#Parkingdata
21639
+ spots=Parkingdata
21640
+ useexplicitspots=true
21641
+ elseif spawnonfarp and ishelo then
21642
+ if termtype==nil then
21643
+ spots=SpawnAirbase:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.HelicopterOnly,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,nil)
21644
+ nfree=#spots
21645
+ if nfree<nunits then
21646
+ spots=SpawnAirbase:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.HelicopterUsable,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,nil)
21647
+ nfree=#spots
21648
+ end
21649
+ else
21650
+ spots=SpawnAirbase:FindFreeParkingSpotForAircraft(TemplateGroup,termtype,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,nil)
21651
+ nfree=#spots
21652
+ end
21653
+ if nfree>=nunits then
21654
+ useexplicitspots=true
21655
+ else
21656
+ nfree=SpawnAirbase:GetFreeParkingSpotsNumber(termtype,true)
21657
+ spots=SpawnAirbase:GetFreeParkingSpotsTable(termtype,true)
21658
+ end
21659
+ elseif spawnonship or spawnonfarp or spawnonrunway then
21604
21660
  nfree=SpawnAirbase:GetFreeParkingSpotsNumber(termtype,true)
21605
21661
  spots=SpawnAirbase:GetFreeParkingSpotsTable(termtype,true)
21606
21662
  else
@@ -21636,7 +21692,7 @@ end
21636
21692
  end
21637
21693
  end
21638
21694
  local _notenough=false
21639
- if spawnonship or spawnonfarp or spawnonrunway then
21695
+ if(spawnonship or spawnonfarp or spawnonrunway)and not useexplicitspots then
21640
21696
  if nfree>=1 then
21641
21697
  for i=1,nunits do
21642
21698
  table.insert(parkingspots,spots[1].Coordinate)
@@ -50595,7 +50651,7 @@ function SUPPRESSION:onafterStop(Controllable,From,Event,To)
50595
50651
  self:_EventFromTo("onafterStop",Event,From,To)
50596
50652
  local text=string.format("Stopping SUPPRESSION for group %s",self.Controllable:GetName())
50597
50653
  MESSAGE:New(text,10):ToAllIf(self.Debug)
50598
- sefl:T(self.lid..text)
50654
+ self:T(self.lid..text)
50599
50655
  self.CallScheduler:Clear()
50600
50656
  if self.mooseevents then
50601
50657
  self:UnHandleEvent(EVENTS.Dead)
@@ -52337,7 +52393,7 @@ return 0,0,0,0
52337
52393
  end
52338
52394
  local templategroupname=group:GetName()
52339
52395
  local unit=group:GetUnit(1)
52340
- local Descriptors=(unit and unit:IsAlive())and unit:GetDesc()or{}
52396
+ local Descriptors=(unit and unit:IsAlive()~=nil)and unit:GetDesc()or{}
52341
52397
  local Category=group:GetCategory()
52342
52398
  local TypeName=group:GetTypeName()or"none"
52343
52399
  local SpeedMax=group:GetSpeedMax()
@@ -55847,7 +55903,7 @@ MANTIS.radiusscale[MANTIS.SamType.MEDIUM]=1.2
55847
55903
  MANTIS.radiusscale[MANTIS.SamType.SHORT]=1.75
55848
55904
  MANTIS.radiusscale[MANTIS.SamType.POINT]=3
55849
55905
  MANTIS.SamData={
55850
- ["Hawk"]={Range=35,Blindspot=0,Height=12,Type="Medium",Radar="Hawk"},
55906
+ ["Hawk"]={Range=45,Blindspot=0,Height=12,Type="Medium",Radar="Hawk"},
55851
55907
  ["NASAMS"]={Range=14,Blindspot=0,Height=7,Type="Short",Radar="NSAMS",ARMCapacity=1},
55852
55908
  ["Patriot"]={Range=99,Blindspot=0,Height=25,Type="Long",Radar="Patriot str"},
55853
55909
  ["Rapier"]={Range=10,Blindspot=0,Height=3,Type="Short",Radar="rapier"},
@@ -74331,6 +74387,7 @@ return self
74331
74387
  end
74332
74388
  function CTLD:_InitLocalization()
74333
74389
  self:T(self.lid.."_InitLocalization")
74390
+ self.locale=string.lower(tostring(self.locale or"en"))
74334
74391
  self.gettext=TEXTANDSOUND:New("CTLD","en")
74335
74392
  for locale,table in pairs(self.Messages)do
74336
74393
  local Locale=string.lower(tostring(locale))
@@ -74342,6 +74399,35 @@ end
74342
74399
  end
74343
74400
  return self
74344
74401
  end
74402
+ function CTLD:SetGroupLocaleResolver(Resolver)
74403
+ self.GroupLocaleResolver=Resolver
74404
+ return self
74405
+ end
74406
+ function CTLD:_GetLocaleForGroup(Group)
74407
+ if self.GroupLocaleResolver then
74408
+ local locale=self:GroupLocaleResolver(Group)
74409
+ if locale and locale~=""then return string.lower(tostring(locale))end
74410
+ end
74411
+ return string.lower(tostring(self.locale or"en"))
74412
+ end
74413
+ function CTLD:_GetEntryForGroup(ID,Group)
74414
+ return self.gettext:GetEntry(ID,self:_GetLocaleForGroup(Group))
74415
+ end
74416
+ function CTLD:_GetMenuPluralSuffix(Count,Kind,Group)
74417
+ local count=tonumber(Count)or 0
74418
+ local locale=Group and self:_GetLocaleForGroup(Group)or string.lower(tostring(self.locale or"en"))
74419
+ if locale=="ru"then
74420
+ local n=math.abs(count)%100
74421
+ local d=n%10
74422
+ if n>=11 and n<=14 then return"ов"end
74423
+ if d==1 then return""end
74424
+ if d>=2 and d<=4 then return"а"end
74425
+ return"ов"
74426
+ end
74427
+ if locale=="tr"then return""end
74428
+ if locale=="de"and Kind=="crate"then return count>1 and"n"or""end
74429
+ return count>1 and"s"or""
74430
+ end
74345
74431
  function CTLD:SetSRS(Frequency,Modulation,PathToSRS,Gender,Culture,Port,Voice,Volume,PathToGoogleKey,AccessKey,Backend,Provider,Speaker)
74346
74432
  self:T(self.lid.."SetSRS")
74347
74433
  self.PathToSRS=PathToSRS or MSRS.path or"C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio"
@@ -74431,6 +74517,23 @@ return Cargo
74431
74517
  end
74432
74518
  return"Unknown"
74433
74519
  end
74520
+ function CTLD:SetCargoDisplayFormatter(Formatter)
74521
+ self.CargoDisplayFormatter=Formatter
74522
+ return self
74523
+ end
74524
+ function CTLD:_FormatCargoDisplayText(BaseText,Cargo,Group)
74525
+ local label=BaseText or self:_GetCargoDisplayName(Cargo)
74526
+ if self.CargoDisplayFormatter then
74527
+ local formatted=self:CargoDisplayFormatter(label,Cargo,Group)
74528
+ if type(formatted)=="string"and formatted~=""then
74529
+ return formatted
74530
+ end
74531
+ end
74532
+ return label
74533
+ end
74534
+ function CTLD:_GetCargoDisplayNameForGroup(Cargo,Group)
74535
+ return self:_FormatCargoDisplayText(self:_GetCargoDisplayName(Cargo),Cargo,Group)
74536
+ end
74434
74537
  function CTLD:AllowCATransport(OnOff,ClientSet)
74435
74538
  self.allowCATransport=OnOff
74436
74539
  self.CATransportSet=ClientSet
@@ -75236,7 +75339,7 @@ table.insert(loaded.Cargo,dcargo)
75236
75339
  self.Loaded_Cargo[unitname]=nil
75237
75340
  self.Loaded_Cargo[unitname]=loaded
75238
75341
  local Group=client:GetGroup()
75239
- local msg=self.gettext:GetEntry("CRATE_LOADED_GROUNDCREW",self.locale)
75342
+ local msg=self:_GetEntryForGroup("CRATE_LOADED_GROUNDCREW",Group)
75240
75343
  msg=string.format(msg,event.IniDynamicCargoName)
75241
75344
  self:_SendMessage(msg,10,false,Group)
75242
75345
  self:__CratesPickedUp(1,Group,client,dcargo)
@@ -75282,7 +75385,7 @@ self.Loaded_Cargo[unitname]=loaded
75282
75385
  end
75283
75386
  local Group=client:GetGroup()
75284
75387
  if not self:IsC130J(client,true)then
75285
- local msg=self.gettext:GetEntry("CRATE_UNLOADED_GROUNDCREW",self.locale)
75388
+ local msg=self:_GetEntryForGroup("CRATE_UNLOADED_GROUNDCREW",Group)
75286
75389
  msg=string.format(msg,event.IniDynamicCargoName)
75287
75390
  self:_SendMessage(msg,10,false,Group)
75288
75391
  end
@@ -75391,7 +75494,7 @@ local capabilities=self:_GetUnitCapabilities(Unit)
75391
75494
  local cancrates=capabilities.crates
75392
75495
  local cratelimit=capabilities.cratelimit
75393
75496
  if not cancrates then
75394
- local msg=self.gettext:GetEntry("CHOPPER_CANNOT_CARRY",self.locale)
75497
+ local msg=self:_GetEntryForGroup("CHOPPER_CANNOT_CARRY",Group)
75395
75498
  self:_SendMessage(msg,10,false,Group)
75396
75499
  return self
75397
75500
  else
@@ -75416,7 +75519,7 @@ crate:SetHasMoved(true)
75416
75519
  crate:SetWasDropped(false)
75417
75520
  table.insert(loaded.Cargo,crate)
75418
75521
  crate.Positionable=nil
75419
- local msg=self.gettext:GetEntry("CRATE_LOADED_ID",self.locale)
75522
+ local msg=self:_GetEntryForGroup("CRATE_LOADED_ID",Group)
75420
75523
  msg=string.format(msg,crate:GetID(),crate:GetName())
75421
75524
  self:_SendMessage(msg,10,false,Group)
75422
75525
  self.Loaded_Cargo[unitname]=loaded
@@ -75450,7 +75553,7 @@ local cgotype=Cargotype:GetType()
75450
75553
  local cgonetmass=Cargotype:GetNetMass()
75451
75554
  local maxloadable=self:_GetMaxLoadableMass(Unit)
75452
75555
  if type(instock)=="number"and tonumber(instock)<=0 and tonumber(instock)~=-1 and not Inject then
75453
- local msg=self.gettext:GetEntry("ALL_GONE",self.locale)
75556
+ local msg=self:_GetEntryForGroup("ALL_GONE",Group)
75454
75557
  msg=string.format(msg,cgoname)
75455
75558
  self:_SendMessage(msg,10,false,Group)
75456
75559
  return self
@@ -75463,15 +75566,15 @@ inzone,zonename,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.SHIP)
75463
75566
  end
75464
75567
  if not Inject then
75465
75568
  if not inzone then
75466
- local msg=self.gettext:GetEntry("NOT_CLOSE_ENOUGH_LOGISTICS",self.locale)
75569
+ local msg=self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_LOGISTICS",Group)
75467
75570
  self:_SendMessage(msg,10,false,Group)
75468
75571
  if not self.debug then return self end
75469
75572
  elseif not grounded and not hoverload then
75470
- local msg=self.gettext:GetEntry("NEED_TO_LAND_OR_HOVER_LOAD",self.locale)
75573
+ local msg=self:_GetEntryForGroup("NEED_TO_LAND_OR_HOVER_LOAD",Group)
75471
75574
  self:_SendMessage(msg,10,false,Group)
75472
75575
  if not self.debug then return self end
75473
75576
  elseif self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
75474
- local msg=self.gettext:GetEntry("OPEN_DOORS_LOAD_TROOPS",self.locale)
75577
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_LOAD_TROOPS",Group)
75475
75578
  self:_SendMessage(msg,10,false,Group)
75476
75579
  if not self.debug then return self end
75477
75580
  end
@@ -75498,11 +75601,11 @@ loaded.Cratesloaded=0
75498
75601
  loaded.Cargo={}
75499
75602
  end
75500
75603
  if troopsize+numberonboard>trooplimit then
75501
- local msg=self.gettext:GetEntry("CRAMMED",self.locale)
75604
+ local msg=self:_GetEntryForGroup("CRAMMED",Group)
75502
75605
  self:_SendMessage(msg,10,false,Group)
75503
75606
  return
75504
75607
  elseif maxloadable<cgonetmass then
75505
- local msg=self.gettext:GetEntry("TOO_HEAVY",self.locale)
75608
+ local msg=self:_GetEntryForGroup("TOO_HEAVY",Group)
75506
75609
  self:_SendMessage(msg,10,false,Group)
75507
75610
  return
75508
75611
  else
@@ -75515,7 +75618,7 @@ self:T({cargotype=loadcargotype})
75515
75618
  loaded.Troopsloaded=loaded.Troopsloaded+troopsize
75516
75619
  table.insert(loaded.Cargo,loadcargotype)
75517
75620
  self.Loaded_Cargo[unitname]=loaded
75518
- local msg=self.gettext:GetEntry("BOARDED",self.locale)
75621
+ local msg=self:_GetEntryForGroup("BOARDED",Group)
75519
75622
  msg=string.format(msg,cgoname)
75520
75623
  self:_SendMessage(msg,10,false,Group)
75521
75624
  self:_RefreshDropTroopsMenu(Group,Unit)
@@ -75543,7 +75646,7 @@ nearestDistance=distance
75543
75646
  end
75544
75647
  end
75545
75648
  if nearestGroup==nil or nearestDistance>self.EngineerSearch then
75546
- local msg=self.gettext:GetEntry("NO_UNIT_TO_REPAIR",self.locale)
75649
+ local msg=self:_GetEntryForGroup("NO_UNIT_TO_REPAIR",Group)
75547
75650
  self:_SendMessage(msg,10,false,Group)
75548
75651
  return nil,nil
75549
75652
  end
@@ -75588,7 +75691,7 @@ local NearestGroup,CargoType=self:_FindRepairNearby(Group,Unit,Repairtype)
75588
75691
  if NearestGroup~=nil then
75589
75692
  if self.repairtime<2 then self.repairtime=30 end
75590
75693
  if not Engineering then
75591
- local msg=self.gettext:GetEntry("REPAIR_STARTED",self.locale)
75694
+ local msg=self:_GetEntryForGroup("REPAIR_STARTED",Group)
75592
75695
  msg=string.format(msg,build.Name,self.repairtime)
75593
75696
  self:_SendMessage(msg,10,false,Group)
75594
75697
  end
@@ -75611,7 +75714,7 @@ buildtimer:Start(self.repairtime)
75611
75714
  self:__CratesRepairStarted(1,Group,Unit)
75612
75715
  else
75613
75716
  if not Engineering then
75614
- local msg=self.gettext:GetEntry("CANT_REPAIR_WITH",self.locale)
75717
+ local msg=self:_GetEntryForGroup("CANT_REPAIR_WITH",Group)
75615
75718
  msg=string.format(msg,build.Name)
75616
75719
  self:_SendMessage(msg,10,false,Group)
75617
75720
  else
@@ -75626,12 +75729,12 @@ local grounded=not self:IsUnitInAir(Unit)
75626
75729
  local hoverload=self:IsCorrectHover(Unit)
75627
75730
  local hassecondaries=false
75628
75731
  if not grounded and not hoverload then
75629
- local msg=self.gettext:GetEntry("NEED_TO_LAND_OR_HOVER_LOAD",self.locale)
75732
+ local msg=self:_GetEntryForGroup("NEED_TO_LAND_OR_HOVER_LOAD",Group)
75630
75733
  self:_SendMessage(msg,10,false,Group)
75631
75734
  if not self.debug then return self end
75632
75735
  end
75633
75736
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
75634
- local msg=self.gettext:GetEntry("OPEN_DOORS_EXTRACT_TROOPS",self.locale)
75737
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_EXTRACT_TROOPS",Group)
75635
75738
  self:_SendMessage(msg,10,false,Group)
75636
75739
  if not self.debug then return self end
75637
75740
  end
@@ -75667,7 +75770,7 @@ distancekeys[#distancekeys+1]=math.floor(distance)
75667
75770
  end
75668
75771
  end
75669
75772
  if nearestGroup==nil or nearestDistance>extractdistance then
75670
- local msg=self.gettext:GetEntry("NO_UNITS_TO_EXTRACT",self.locale)
75773
+ local msg=self:_GetEntryForGroup("NO_UNITS_TO_EXTRACT",Group)
75671
75774
  self:_SendMessage(msg,10,false,Group)
75672
75775
  return self
75673
75776
  end
@@ -75686,7 +75789,7 @@ break
75686
75789
  end
75687
75790
  end
75688
75791
  if Cargotype==nil then
75689
- local msg=self.gettext:GetEntry("CANT_ONBOARD",self.locale)
75792
+ local msg=self:_GetEntryForGroup("CANT_ONBOARD",Group)
75690
75793
  msg=string.format(msg,groupType)
75691
75794
  self:_SendMessage(msg,10,false,Group)
75692
75795
  else
@@ -75703,7 +75806,7 @@ loaded.Cratesloaded=0
75703
75806
  loaded.Cargo={}
75704
75807
  end
75705
75808
  if troopsize+numberonboard>trooplimit then
75706
- local msg=self.gettext:GetEntry("CRAMMED",self.locale)
75809
+ local msg=self:_GetEntryForGroup("CRAMMED",Group)
75707
75810
  self:_SendMessage(msg,10,false,Group)
75708
75811
  nearestGroup.ExtractTime=0
75709
75812
  else
@@ -75715,9 +75818,9 @@ local running=math.floor(nearestDistance/4)+20
75715
75818
  loaded.Troopsloaded=loaded.Troopsloaded+troopsize
75716
75819
  table.insert(loaded.Cargo,loadcargotype)
75717
75820
  self.Loaded_Cargo[unitname]=loaded
75718
- local boardedtext=self.gettext:GetEntry("BOARDED",self.locale)
75821
+ local boardedtext=self:_GetEntryForGroup("BOARDED",Group)
75719
75822
  self:ScheduleOnce(running,self._SendMessage,self,string.format(boardedtext,Cargotype.Name),10,false,Group)
75720
- local msg=self.gettext:GetEntry("BOARDING",self.locale)
75823
+ local msg=self:_GetEntryForGroup("BOARDING",Group)
75721
75824
  msg=string.format(msg,Cargotype.Name)
75722
75825
  self:_SendMessage(msg,10,false,Group)
75723
75826
  self:_RefreshDropTroopsMenu(Group,Unit)
@@ -75770,15 +75873,15 @@ if not inzone then
75770
75873
  inzone,zonename,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.SHIP)
75771
75874
  end
75772
75875
  if not inzone then
75773
- local msg=self.gettext:GetEntry("NOT_CLOSE_ENOUGH_LOGISTICS",self.locale)
75876
+ local msg=self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_LOGISTICS",Group)
75774
75877
  self:_SendMessage(msg,10,false,Group)
75775
75878
  if not self.debug then return self end
75776
75879
  elseif not grounded and not hoverload then
75777
- local msg=self.gettext:GetEntry("NEED_TO_LAND_OR_HOVER_LOAD",self.locale)
75880
+ local msg=self:_GetEntryForGroup("NEED_TO_LAND_OR_HOVER_LOAD",Group)
75778
75881
  self:_SendMessage(msg,10,false,Group)
75779
75882
  if not self.debug then return self end
75780
75883
  elseif self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
75781
- local msg=self.gettext:GetEntry("OPEN_DOORS_LOAD_TROOPS",self.locale)
75884
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_LOAD_TROOPS",Group)
75782
75885
  self:_SendMessage(msg,10,false,Group)
75783
75886
  if not self.debug then return self end
75784
75887
  end
@@ -75791,7 +75894,7 @@ end
75791
75894
  timer.scheduleFunction(function()
75792
75895
  self.suppressmessages=prevSuppress
75793
75896
  local dname=Cargo:GetName()
75794
- local msg=self.gettext:GetEntry("LOADED_FULL",self.locale)
75897
+ local msg=self:_GetEntryForGroup("LOADED_FULL",Group)
75795
75898
  msg=string.format(msg,n,dname)
75796
75899
  self:_SendMessage(msg,10,false,Group)
75797
75900
  end,{},timer.getTime()+0.2*n+0.05)
@@ -75812,8 +75915,8 @@ local onboard=(ld and type(ld.Troopsloaded)=="number")and ld.Troopsloaded or 0
75812
75915
  if trooplimit>0 then
75813
75916
  local space=trooplimit-onboard
75814
75917
  if space<troopsize then
75815
- local msg=self.gettext:GetEntry("MENU_TROOP_LIMIT",self.locale)
75816
- if type(stock)=="number"and stock==0 then msg=self.gettext:GetEntry("MENU_OUT_OF_STOCK",self.locale)end
75918
+ local msg=self:_GetEntryForGroup("MENU_TROOP_LIMIT",Group)
75919
+ if type(stock)=="number"and stock==0 then msg=self:_GetEntryForGroup("MENU_OUT_OF_STOCK",Group)end
75817
75920
  MENU_GROUP_COMMAND:New(Group,msg,parentMenu,function()end)
75818
75921
  return self
75819
75922
  end
@@ -75852,7 +75955,7 @@ local availableSets=nil
75852
75955
  if type(stock)=="number"and stock>=0 then
75853
75956
  availableSets=math.floor(stock)
75854
75957
  if availableSets<=0 then
75855
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_OUT_OF_STOCK",self.locale),parentMenu,function()end)
75958
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_OUT_OF_STOCK",Group),parentMenu,function()end)
75856
75959
  return self
75857
75960
  end
75858
75961
  if availableSets<maxQuantity then
@@ -75935,29 +76038,29 @@ MENU_GROUP_COMMAND:New(Group,"1",parentMenu,self._GetCrateQuantity,self,Group,Un
75935
76038
  else
75936
76039
  local msg
75937
76040
  if maxMassSets and(not capacitySets or capacitySets>=1)and maxMassSets<1 then
75938
- msg=self.gettext:GetEntry("WEIGHT_LIMIT",self.locale)
76041
+ msg=self:_GetEntryForGroup("WEIGHT_LIMIT",Group)
75939
76042
  else
75940
- msg=self.gettext:GetEntry("CRATE_LIMIT",self.locale)
76043
+ msg=self:_GetEntryForGroup("CRATE_LIMIT",Group)
75941
76044
  end
75942
76045
  MENU_GROUP_COMMAND:New(Group,msg,parentMenu,self._SendMessage,self,msg,10,false,Group)
75943
76046
  end
75944
76047
  return self
75945
76048
  end
75946
76049
  if canLoad and not isHerc and not suppressGetAndLoad then
75947
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_GET",self.locale),parentMenu,self._GetCrateQuantity,self,Group,Unit,cargoObj,1)
75948
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_GET_AND_LOAD",self.locale),parentMenu,self._GetAndLoad,self,Group,Unit,cargoObj,1)
76050
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_GET",Group),parentMenu,self._GetCrateQuantity,self,Group,Unit,cargoObj,1)
76051
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_GET_AND_LOAD",Group),parentMenu,self._GetAndLoad,self,Group,Unit,cargoObj,1)
75949
76052
  else
75950
76053
  local msg
75951
76054
  if not isHerc and not suppressGetAndLoad then
75952
76055
  if maxMassSets and(not capacitySets or capacitySets>=1)and maxMassSets<1 then
75953
- msg=self.gettext:GetEntry("WEIGHT_LIMIT",self.locale)
76056
+ msg=self:_GetEntryForGroup("WEIGHT_LIMIT",Group)
75954
76057
  else
75955
- msg=self.gettext:GetEntry("CRATE_LIMIT",self.locale)
76058
+ msg=self:_GetEntryForGroup("CRATE_LIMIT",Group)
75956
76059
  end
75957
76060
  MENU_GROUP_COMMAND:New(Group,msg,parentMenu,self._SendMessage,self,msg,10,false,Group)
75958
76061
  if canPartiallyLoad and(cgotype~=CTLD_CARGO.Enum.STATIC)and(not suppressGetAndLoad)then
75959
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_GET_ANYWAY",self.locale),parentMenu,self._GetCrateQuantity,self,Group,Unit,cargoObj,1)
75960
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_PARTIALLY_LOAD",self.locale),parentMenu,self._GetAndLoad,self,Group,Unit,cargoObj,1,true)
76062
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_GET_ANYWAY",Group),parentMenu,self._GetCrateQuantity,self,Group,Unit,cargoObj,1)
76063
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_PARTIALLY_LOAD",Group),parentMenu,self._GetAndLoad,self,Group,Unit,cargoObj,1,true)
75961
76064
  end
75962
76065
  end
75963
76066
  end
@@ -75973,8 +76076,8 @@ local cgotype=cargoObj:GetType()or nil
75973
76076
  local suppressGetAndLoad=(self.enableChinookGCLoading==true)and(cgotype==CTLD_CARGO.Enum.STATIC)
75974
76077
  if canLoad and not isHerc and not suppressGetAndLoad then
75975
76078
  local qMenu=MENU_GROUP:New(Group,label,parentMenu)
75976
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_GET",self.locale),qMenu,self._GetCrateQuantity,self,Group,Unit,cargoObj,quantity)
75977
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_GET_AND_LOAD",self.locale),qMenu,self._GetAndLoad,self,Group,Unit,cargoObj,quantity)
76079
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_GET",Group),qMenu,self._GetCrateQuantity,self,Group,Unit,cargoObj,quantity)
76080
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_GET_AND_LOAD",Group),qMenu,self._GetAndLoad,self,Group,Unit,cargoObj,quantity)
75978
76081
  else
75979
76082
  MENU_GROUP_COMMAND:New(Group,label,parentMenu,self._GetCrateQuantity,self,Group,Unit,cargoObj,quantity)
75980
76083
  end
@@ -75995,21 +76098,21 @@ break
75995
76098
  end
75996
76099
  end
75997
76100
  if not cfg then
75998
- local msg=self.gettext:GetEntry("NO_UNIT_CONFIG",self.locale)
76101
+ local msg=self:_GetEntryForGroup("NO_UNIT_CONFIG",Group)
75999
76102
  msg=string.format(msg,Name)
76000
76103
  self:_SendMessage(msg,10,false,Group)
76001
76104
  return self
76002
76105
  end
76003
76106
  local stock=cfg.Stock
76004
76107
  if type(stock)=="number"and stock~=-1 and stock<=0 then
76005
- local msg=self.gettext:GetEntry("ALL_GONE",self.locale)
76108
+ local msg=self:_GetEntryForGroup("ALL_GONE",Group)
76006
76109
  msg=string.format(msg,cfg.Name or"units")
76007
76110
  self:_SendMessage(msg,10,false,Group)
76008
76111
  return self
76009
76112
  end
76010
76113
  local inzone=self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD)
76011
76114
  if not inzone then
76012
- local msg=self.gettext:GetEntry("NOT_CLOSE_ENOUGH_LOGISTICS",self.locale)
76115
+ local msg=self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_LOGISTICS",Group)
76013
76116
  self:_SendMessage(msg,10,false,Group)
76014
76117
  return self
76015
76118
  end
@@ -76049,7 +76152,7 @@ end
76049
76152
  if nearbyCount>=maxUnitsNearby then break end
76050
76153
  end
76051
76154
  if nearbyCount>=maxUnitsNearby then
76052
- local msg=self.gettext:GetEntry("TOO_MANY_UNITS_NEARBY",self.locale)
76155
+ local msg=self:_GetEntryForGroup("TOO_MANY_UNITS_NEARBY",Group)
76053
76156
  msg=string.format(msg,maxUnitsNearby)
76054
76157
  self:_SendMessage(msg,10,false,Group)
76055
76158
  return self
@@ -76100,7 +76203,7 @@ end
76100
76203
  if type(stock)=="number"and stock~=-1 then
76101
76204
  cfg.Stock=stock-1
76102
76205
  end
76103
- local msg=self.gettext:GetEntry("DEPLOYED_NEAR_YOU",self.locale)
76206
+ local msg=self:_GetEntryForGroup("DEPLOYED_NEAR_YOU",Group)
76104
76207
  msg=string.format(msg,cfg.Name or"selection")
76105
76208
  self:_SendMessage(msg,10,false,Group)
76106
76209
  return self
@@ -76125,7 +76228,7 @@ if not drop and not pack then
76125
76228
  local cgoname=Cargo:GetName()
76126
76229
  local instock=Cargo:GetStock()
76127
76230
  if type(instock)=="number"and tonumber(instock)<=0 and tonumber(instock)~=-1 then
76128
- local msg=self.gettext:GetEntry("RAN_OUT_OF",self.locale)
76231
+ local msg=self:_GetEntryForGroup("RAN_OUT_OF",Group)
76129
76232
  msg=string.format(msg,cgoname)
76130
76233
  self:_SendMessage(msg,10,false,Group)
76131
76234
  return false
@@ -76153,7 +76256,7 @@ elseif pack and not drop then
76153
76256
  inzone=true
76154
76257
  end
76155
76258
  if not inzone then
76156
- local msg=self.gettext:GetEntry("NOT_CLOSE_ENOUGH_LOGISTICS",self.locale)
76259
+ local msg=self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_LOGISTICS",Group)
76157
76260
  self:_SendMessage(msg,10,false,Group)
76158
76261
  if not self.debug then return self end
76159
76262
  end
@@ -76162,7 +76265,7 @@ if location then
76162
76265
  local unitcoord=Unit:GetCoordinate()or Group:GetCoordinate()
76163
76266
  if unitcoord then
76164
76267
  if not location:IsCoordinateInZone(unitcoord)then
76165
- local msg=self.gettext:GetEntry("CARGO_NOT_AVAILABLE_ZONE",self.locale)
76268
+ local msg=self:_GetEntryForGroup("CARGO_NOT_AVAILABLE_ZONE",Group)
76166
76269
  self:_SendMessage(msg,10,false,Group)
76167
76270
  if not self.debug then return false end
76168
76271
  end
@@ -76173,7 +76276,7 @@ local canloadcratesno=capabilities.cratelimit
76173
76276
  local loaddist=self.CrateDistance or 35
76174
76277
  local nearcrates,numbernearby=self:_FindCratesNearby(Group,Unit,loaddist,true,true,true)
76175
76278
  if numbernearby>=canloadcratesno and(not drop)and(not pack)then
76176
- local msg=self.gettext:GetEntry("ENOUGH_CRATES_NEARBY",self.locale)
76279
+ local msg=self:_GetEntryForGroup("ENOUGH_CRATES_NEARBY",Group)
76177
76280
  self:_SendMessage(msg,10,false,Group)
76178
76281
  return false
76179
76282
  end
@@ -76188,7 +76291,7 @@ local cargotype=Cargo
76188
76291
  local number=requestNumber
76189
76292
  local cratesneeded=cargotype:GetCratesNeeded()
76190
76293
  local cratename=cargotype:GetName()
76191
- local cratedisplayname=self:_GetCargoDisplayName(cargotype)
76294
+ local cratedisplayname=self:_GetCargoDisplayNameForGroup(cargotype,Group)
76192
76295
  local cratetemplate="Container"
76193
76296
  local cgotype=cargotype:GetType()
76194
76297
  local cgomass=cargotype:GetMass()
@@ -76445,9 +76548,9 @@ if not(drop or pack)then
76445
76548
  Cargo:RemoveStock(requestedSets)
76446
76549
  self:_RefreshCrateQuantityMenus(Group,Unit,Cargo)
76447
76550
  end
76448
- local text=string.format(self.gettext:GetEntry("CRATES_POSITIONED",self.locale),number,cratedisplayname)
76551
+ local text=string.format(self:_GetEntryForGroup("CRATES_POSITIONED",Group),number,cratedisplayname)
76449
76552
  if drop then
76450
- text=string.format(self.gettext:GetEntry("CRATES_DROPPED",self.locale),number,cratedisplayname)
76553
+ text=string.format(self:_GetEntryForGroup("CRATES_DROPPED",Group),number,cratedisplayname)
76451
76554
  self:__CratesDropped(1,Group,Unit,droppedcargo)
76452
76555
  else
76453
76556
  if not quiet then
@@ -76554,7 +76657,7 @@ end
76554
76657
  end
76555
76658
  self:_SendMessage(text:Text(),30,true,_group,true)
76556
76659
  else
76557
- local msg=self.gettext:GetEntry("NO_CRATES_WITHIN",self.locale)
76660
+ local msg=self:_GetEntryForGroup("NO_CRATES_WITHIN",_group)
76558
76661
  msg=string.format(msg,finddist)
76559
76662
  self:_SendMessage(msg,10,false,_group,true)
76560
76663
  end
@@ -76588,7 +76691,7 @@ if string.match(gr:GetName(),tName)then
76588
76691
  local cname=cfg.Name or"Unit"
76589
76692
  table.insert(removedTable,{groupName=gr:GetName(),name=cname,template=tName,coordinate=gr:GetCoordinate()})
76590
76693
  gr:Destroy(false)
76591
- local msg=self.gettext:GetEntry("UNITS_REMOVED",self.locale)
76694
+ local msg=self:_GetEntryForGroup("UNITS_REMOVED",_group)
76592
76695
  msg=string.format(msg,cname)
76593
76696
  self:_SendMessage(msg,10,false,_group)
76594
76697
  removedAny=true
@@ -76602,7 +76705,7 @@ end
76602
76705
  end
76603
76706
  end
76604
76707
  if not removedAny then
76605
- local msg=self.gettext:GetEntry("NOTHING_TO_REMOVE",self.locale)
76708
+ local msg=self:_GetEntryForGroup("NOTHING_TO_REMOVE",_group)
76606
76709
  self:_SendMessage(msg,10,false,_group)
76607
76710
  else
76608
76711
  self:__RemoveCratesNearby(1,_group,_unit,removedTable)
@@ -76647,7 +76750,7 @@ self:_RefreshLoadCratesMenu(_group,_unit)
76647
76750
  self:_RefreshPackMenus(_group,_unit)
76648
76751
  self:__RemoveCratesNearby(1,_group,_unit,crates)
76649
76752
  else
76650
- local msg=self.gettext:GetEntry("NO_CRATES_WITHIN",self.locale)
76753
+ local msg=self:_GetEntryForGroup("NO_CRATES_WITHIN",_group)
76651
76754
  msg=string.format(msg,finddist)
76652
76755
  self:_SendMessage(msg,10,false,_group,true)
76653
76756
  end
@@ -76739,18 +76842,18 @@ local cratelimit=capabilities.cratelimit
76739
76842
  local grounded=not self:IsUnitInAir(Unit)
76740
76843
  local canhoverload=self:CanHoverLoad(Unit)
76741
76844
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
76742
- local msg=self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale)
76845
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO",Group)
76743
76846
  self:_SendMessage(msg,10,false,Group)
76744
76847
  if not self.debug then return self end
76745
76848
  end
76746
76849
  if not cancrates then
76747
- local msg=self.gettext:GetEntry("CHOPPER_CANNOT_CARRY",self.locale)
76850
+ local msg=self:_GetEntryForGroup("CHOPPER_CANNOT_CARRY",Group)
76748
76851
  self:_SendMessage(msg,10,false,Group)
76749
76852
  elseif self.forcehoverload and not canhoverload then
76750
- local msg=self.gettext:GetEntry("HOVER_OVER_CRATES",self.locale)
76853
+ local msg=self:_GetEntryForGroup("HOVER_OVER_CRATES",Group)
76751
76854
  self:_SendMessage(msg,10,false,Group)
76752
76855
  elseif not grounded and not canhoverload then
76753
- local msg=self.gettext:GetEntry("LAND_OR_HOVER_OVER_CRATES",self.locale)
76856
+ local msg=self:_GetEntryForGroup("LAND_OR_HOVER_OVER_CRATES",Group)
76754
76857
  self:_SendMessage(msg,10,false,Group)
76755
76858
  else
76756
76859
  local numberonboard=0
@@ -76770,11 +76873,11 @@ self:T(self.lid.." Crates found: "..number)
76770
76873
  if number==0 and self.hoverautoloading then
76771
76874
  return self
76772
76875
  elseif number==0 then
76773
- local msg=self.gettext:GetEntry("NO_LOADABLE_CRATES",self.locale)
76876
+ local msg=self:_GetEntryForGroup("NO_LOADABLE_CRATES",Group)
76774
76877
  self:_SendMessage(msg,10,false,Group)
76775
76878
  return self
76776
76879
  elseif numberonboard==cratelimit then
76777
- local msg=self.gettext:GetEntry("FULLY_LOADED",self.locale)
76880
+ local msg=self:_GetEntryForGroup("FULLY_LOADED",Group)
76778
76881
  self:_SendMessage(msg,10,false,Group)
76779
76882
  return self
76780
76883
  else
@@ -76816,21 +76919,21 @@ local fullSets=math.floor(loadedHere/needed)
76816
76919
  local leftover=loadedHere%needed
76817
76920
  if needed>1 then
76818
76921
  if fullSets>0 and leftover==0 then
76819
- local msg=self.gettext:GetEntry("LOADED_FULL",self.locale)
76820
- msg=string.format(msg,fullSets,cName)
76922
+ local msg=self:_GetEntryForGroup("LOADED_FULL",Group)
76923
+ msg=string.format(msg,fullSets,self:_GetCargoDisplayNameForGroup(cName,Group))
76821
76924
  self:_SendMessage(msg,10,false,Group)
76822
76925
  elseif fullSets>0 and leftover>0 then
76823
- local msg=self.gettext:GetEntry("LOADED_SETS_LEFTOVER",self.locale)
76824
- msg=string.format(msg,fullSets,cName,leftover)
76926
+ local msg=self:_GetEntryForGroup("LOADED_SETS_LEFTOVER",Group)
76927
+ msg=string.format(msg,fullSets,self:_GetCargoDisplayNameForGroup(cName,Group),leftover)
76825
76928
  self:_SendMessage(msg,10,false,Group)
76826
76929
  else
76827
- local msg=self.gettext:GetEntry("LOADED_PARTIAL",self.locale)
76828
- msg=string.format(msg,loadedHere,needed,cName)
76930
+ local msg=self:_GetEntryForGroup("LOADED_PARTIAL",Group)
76931
+ msg=string.format(msg,loadedHere,needed,self:_GetCargoDisplayNameForGroup(cName,Group))
76829
76932
  self:_SendMessage(msg,15,false,Group)
76830
76933
  end
76831
76934
  else
76832
- local msg=self.gettext:GetEntry("LOADED_SETS",self.locale)
76833
- msg=string.format(msg,loadedHere,cName)
76935
+ local msg=self:_GetEntryForGroup("LOADED_SETS",Group)
76936
+ msg=string.format(msg,loadedHere,self:_GetCargoDisplayNameForGroup(cName,Group))
76834
76937
  self:_SendMessage(msg,10,false,Group)
76835
76938
  end
76836
76939
  end
@@ -76991,7 +77094,7 @@ report:Add("Total Mass: "..loadedmass.." kg. Loadable: "..maxloadable.." kg.")
76991
77094
  local text=report:Text()
76992
77095
  self:_SendMessage(text,30,true,Group,true)
76993
77096
  else
76994
- local msg=self.gettext:GetEntry("NOTHING_LOADED",self.locale)
77097
+ local msg=self:_GetEntryForGroup("NOTHING_LOADED",Group)
76995
77098
  msg=string.format(msg,trooplimit,cratelimit,maxloadable)
76996
77099
  self:_SendMessage(msg,10,false,Group,true)
76997
77100
  end
@@ -77076,7 +77179,7 @@ end
77076
77179
  local text=report:Text()
77077
77180
  self:_SendMessage(text,30,true,Group,true)
77078
77181
  else
77079
- local msg=self.gettext:GetEntry("NOTHING_IN_STOCK",self.locale)
77182
+ local msg=self:_GetEntryForGroup("NOTHING_IN_STOCK",Group)
77080
77183
  self:_SendMessage(msg,10,false,Group,true)
77081
77184
  end
77082
77185
  return self
@@ -77127,7 +77230,7 @@ self:T(self.lid.." _UnloadTroops")
77127
77230
  local droppingatbase=false
77128
77231
  local canunload=true
77129
77232
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
77130
- local msg=self.gettext:GetEntry("OPEN_DOORS_UNLOAD_TROOPS",self.locale)
77233
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_UNLOAD_TROOPS",Group)
77131
77234
  self:_SendMessage(msg,10,false,Group)
77132
77235
  if not self.debug then return self end
77133
77236
  end
@@ -77214,19 +77317,21 @@ end
77214
77317
  end
77215
77318
  end
77216
77319
  local parts={}
77320
+ local troopLabel=self:_GetEntryForGroup("TROOPS_LABEL",Group)
77321
+ local engineerLabel=self:_GetEntryForGroup("ENGINEERS_LABEL",Group)
77217
77322
  for nName,nCount in pairs(deployedTroopsByName)do
77218
- parts[#parts+1]=tostring(nCount).."x Troops "..nName
77323
+ parts[#parts+1]=tostring(nCount).."x "..troopLabel.." "..nName
77219
77324
  end
77220
77325
  for nName,nCount in pairs(deployedEngineersByName)do
77221
- parts[#parts+1]=tostring(nCount).."x Engineers "..nName
77326
+ parts[#parts+1]=tostring(nCount).."x "..engineerLabel.." "..nName
77222
77327
  end
77223
77328
  if#parts>0 then
77224
- local msg=self.gettext:GetEntry("DROPPED_INTO_ACTION",self.locale)
77329
+ local msg=self:_GetEntryForGroup("DROPPED_INTO_ACTION",Group)
77225
77330
  msg=string.format(msg,table.concat(parts,", "))
77226
77331
  self:_SendMessage(msg,10,false,Group)
77227
77332
  end
77228
77333
  else
77229
- local msg=self.gettext:GetEntry("TROOPS_RETURNED",self.locale)
77334
+ local msg=self:_GetEntryForGroup("TROOPS_RETURNED",Group)
77230
77335
  self:_SendMessage(msg,10,false,Group)
77231
77336
  self:__TroopsRTB(1,Group,Unit,zonename,zone)
77232
77337
  end
@@ -77266,10 +77371,10 @@ self:_UpdateUnitCargoMass(Unit)
77266
77371
  self:_RefreshTroopQuantityMenus(Group,Unit,nil)
77267
77372
  else
77268
77373
  if IsHerc then
77269
- local msg=self.gettext:GetEntry("NOTHING_LOADED_AIRDROP",self.locale)
77374
+ local msg=self:_GetEntryForGroup("NOTHING_LOADED_AIRDROP",Group)
77270
77375
  self:_SendMessage(msg,10,false,Group)
77271
77376
  else
77272
- local msg=self.gettext:GetEntry("NOTHING_LOADED_HOVER",self.locale)
77377
+ local msg=self:_GetEntryForGroup("NOTHING_LOADED_HOVER",Group)
77273
77378
  self:_SendMessage(msg,10,false,Group)
77274
77379
  end
77275
77380
  end
@@ -77280,7 +77385,7 @@ self:T(self.lid.." _UnloadCrates")
77280
77385
  if not self.dropcratesanywhere then
77281
77386
  local inzone,zonename,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.DROP)
77282
77387
  if not inzone then
77283
- local msg=self.gettext:GetEntry("NOT_CLOSE_ENOUGH_DROP",self.locale)
77388
+ local msg=self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_DROP",Group)
77284
77389
  self:_SendMessage(msg,10,false,Group)
77285
77390
  if not self.debug then
77286
77391
  return self
@@ -77288,7 +77393,7 @@ end
77288
77393
  end
77289
77394
  end
77290
77395
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
77291
- local msg=self.gettext:GetEntry("OPEN_DOORS_DROP_CARGO",self.locale)
77396
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_DROP_CARGO",Group)
77292
77397
  self:_SendMessage(msg,10,false,Group)
77293
77398
  if not self.debug then return self end
77294
77399
  end
@@ -77325,21 +77430,21 @@ if needed>1 then
77325
77430
  local full=math.floor(count/needed)
77326
77431
  local left=count%needed
77327
77432
  if full>0 and left==0 then
77328
- local msg=self.gettext:GetEntry("DROPPED_FULL",self.locale)
77329
- msg=string.format(msg,full,cname)
77433
+ local msg=self:_GetEntryForGroup("DROPPED_FULL",Group)
77434
+ msg=string.format(msg,full,self:_GetCargoDisplayNameForGroup(cname,Group))
77330
77435
  self:_SendMessage(msg,10,false,Group)
77331
77436
  elseif full>0 and left>0 then
77332
- local msg=self.gettext:GetEntry("DROPPED_SETS_LEFTOVER",self.locale)
77333
- msg=string.format(msg,full,cname,left)
77437
+ local msg=self:_GetEntryForGroup("DROPPED_SETS_LEFTOVER",Group)
77438
+ msg=string.format(msg,full,self:_GetCargoDisplayNameForGroup(cname,Group),left)
77334
77439
  self:_SendMessage(msg,10,false,Group)
77335
77440
  else
77336
- local msg=self.gettext:GetEntry("DROPPED_PARTIAL",self.locale)
77337
- msg=string.format(msg,count,needed,cname)
77441
+ local msg=self:_GetEntryForGroup("DROPPED_PARTIAL",Group)
77442
+ msg=string.format(msg,count,needed,self:_GetCargoDisplayNameForGroup(cname,Group))
77338
77443
  self:_SendMessage(msg,15,false,Group)
77339
77444
  end
77340
77445
  else
77341
- local msg=self.gettext:GetEntry("DROPPED_SETS",self.locale)
77342
- msg=string.format(msg,count,cname)
77446
+ local msg=self:_GetEntryForGroup("DROPPED_SETS",Group)
77447
+ msg=string.format(msg,count,self:_GetCargoDisplayNameForGroup(cname,Group))
77343
77448
  self:_SendMessage(msg,10,false,Group)
77344
77449
  end
77345
77450
  end
@@ -77367,10 +77472,10 @@ self:_RefreshDropCratesMenu(Group,Unit)
77367
77472
  self:_RefreshCrateQuantityMenus(Group,Unit,nil)
77368
77473
  else
77369
77474
  if IsHerc then
77370
- local msg=self.gettext:GetEntry("NOTHING_LOADED_AIRDROP",self.locale)
77475
+ local msg=self:_GetEntryForGroup("NOTHING_LOADED_AIRDROP",Group)
77371
77476
  self:_SendMessage(msg,10,false,Group)
77372
77477
  else
77373
- local msg=self.gettext:GetEntry("NOTHING_LOADED_HOVER",self.locale)
77478
+ local msg=self:_GetEntryForGroup("NOTHING_LOADED_HOVER",Group)
77374
77479
  self:_SendMessage(msg,10,false,Group)
77375
77480
  end
77376
77481
  end
@@ -77384,7 +77489,7 @@ self:T(self.lid.." _BuildCrates")
77384
77489
  if self:IsFixedWing(Unit)and self.enableFixedWing and not Engineering then
77385
77490
  local speed=Unit:GetVelocityKMH()
77386
77491
  if speed>1 then
77387
- local msg=self.gettext:GetEntry("NEED_TO_LAND_BUILD",self.locale)
77492
+ local msg=self:_GetEntryForGroup("NEED_TO_LAND_BUILD",Group)
77388
77493
  self:_SendMessage(msg,10,false,Group)
77389
77494
  return self
77390
77495
  end
@@ -77392,7 +77497,7 @@ end
77392
77497
  if not Engineering and self.nobuildinloadzones then
77393
77498
  local inloadzone=self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD)
77394
77499
  if inloadzone then
77395
- local msg=self.gettext:GetEntry("CANNOT_BUILD_LOADING_AREA",self.locale)
77500
+ local msg=self:_GetEntryForGroup("CANNOT_BUILD_LOADING_AREA",Group)
77396
77501
  self:_SendMessage(msg,10,false,Group)
77397
77502
  return self
77398
77503
  end
@@ -77528,7 +77633,7 @@ end
77528
77633
  self:_SendMessage(msg,15,false,startMsgGroup)
77529
77634
  end
77530
77635
  else
77531
- local msg=self.gettext:GetEntry("BUILD_STARTED",self.locale)
77636
+ local msg=self:_GetEntryForGroup("BUILD_STARTED",startMsgGroup)
77532
77637
  msg=string.format(msg,self.buildtime)
77533
77638
  if startMsgGroup then
77534
77639
  self:_SendMessage(msg,15,false,startMsgGroup)
@@ -77597,7 +77702,7 @@ end
77597
77702
  end
77598
77703
  else
77599
77704
  if not Engineering then
77600
- local msg=self.gettext:GetEntry("NO_CRATES_WITHIN_PLAIN",self.locale)
77705
+ local msg=self:_GetEntryForGroup("NO_CRATES_WITHIN_PLAIN",Group)
77601
77706
  msg=string.format(msg,finddist)
77602
77707
  self:_SendMessage(msg,10,false,Group)
77603
77708
  end
@@ -77623,7 +77728,7 @@ if dist>innerDist and dist<=finddist then
77623
77728
  local generic=self:GetGenericCargoObjectFromGroupName(gr:GetName())
77624
77729
  local cargo=generic and self:_FindCratesCargoObject(generic:GetName()or generic.Name)or nil
77625
77730
  if cargo then
77626
- local display=self:_GetCargoDisplayName(cargo)
77731
+ local display=self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargo),cargo,Group)
77627
77732
  packable[#packable+1]={
77628
77733
  group=gr,
77629
77734
  groupName=gr:GetName(),
@@ -77704,12 +77809,12 @@ self:T(self.lid.." _LoadPackedCratesByIds cargoName="..(cargoName or"nil"))
77704
77809
  local grounded=not self:IsUnitInAir(Unit)
77705
77810
  local hover=self:CanHoverLoad(Unit)
77706
77811
  if not grounded and not hover then
77707
- local msg=self.gettext:GetEntry("MUST_LAND_OR_HOVER_CRATES",self.locale)
77812
+ local msg=self:_GetEntryForGroup("MUST_LAND_OR_HOVER_CRATES",Group)
77708
77813
  self:_SendMessage(msg,10,false,Group)
77709
77814
  return self
77710
77815
  end
77711
77816
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
77712
- local msg=self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale)
77817
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO",Group)
77713
77818
  self:_SendMessage(msg,10,false,Group)
77714
77819
  return self
77715
77820
  end
@@ -77732,7 +77837,7 @@ end
77732
77837
  end
77733
77838
  end
77734
77839
  if#matchingCrates==0 then
77735
- local msg=self.gettext:GetEntry("NO_NAMED_CRATES_IN_RANGE",self.locale)
77840
+ local msg=self:_GetEntryForGroup("NO_NAMED_CRATES_IN_RANGE",Group)
77736
77841
  msg=string.format(msg,cargoName or"selection")
77737
77842
  self:_SendMessage(msg,10,false,Group)
77738
77843
  self:_RefreshPackMenus(Group,Unit)
@@ -77745,7 +77850,7 @@ local loadedData=self.Loaded_Cargo[unitName]or{Troopsloaded=0,Cratesloaded=0,Car
77745
77850
  local capabilities=self:_GetUnitCapabilities(Unit)
77746
77851
  local capacity=capabilities.cratelimit or 0
77747
77852
  if loadedData.Cratesloaded>=capacity then
77748
- local msg=self.gettext:GetEntry("NO_MORE_CAPACITY",self.locale)
77853
+ local msg=self:_GetEntryForGroup("NO_MORE_CAPACITY",Group)
77749
77854
  self:_SendMessage(msg,10,false,Group)
77750
77855
  self:_RefreshPackMenus(Group,Unit)
77751
77856
  return self
@@ -77753,7 +77858,7 @@ end
77753
77858
  local spaceLeft=capacity-loadedData.Cratesloaded
77754
77859
  local toLoad=math.min(#matchingCrates,needed,spaceLeft)
77755
77860
  if toLoad<1 then
77756
- local msg=self.gettext:GetEntry("CANNOT_LOAD_NONE_OR_FULL",self.locale)
77861
+ local msg=self:_GetEntryForGroup("CANNOT_LOAD_NONE_OR_FULL",Group)
77757
77862
  self:_SendMessage(msg,10,false,Group)
77758
77863
  self:_RefreshPackMenus(Group,Unit)
77759
77864
  return self
@@ -77775,9 +77880,9 @@ self.Loaded_Cargo[unitName]=loadedData
77775
77880
  self:_UpdateUnitCargoMass(Unit)
77776
77881
  self:_CleanupTrackedCrates(crateIDsLoaded)
77777
77882
  local loadedHere=toLoad
77778
- local displayName=cargoName or(matchingCrates[1]:GetName()or"selection")
77883
+ local displayName=self:_GetCargoDisplayNameForGroup(cargoName or(matchingCrates[1]:GetName()or"selection"),Group)
77779
77884
  if loadedHere<needed and loadedData.Cratesloaded>=capacity then
77780
- local msg=self.gettext:GetEntry("LOADED_PARTIAL_LIMIT",self.locale)
77885
+ local msg=self:_GetEntryForGroup("LOADED_PARTIAL_LIMIT",Group)
77781
77886
  msg=string.format(msg,loadedHere,needed,displayName)
77782
77887
  self:_SendMessage(msg,10,false,Group)
77783
77888
  else
@@ -77785,20 +77890,20 @@ local fullSets=math.floor(loadedHere/needed)
77785
77890
  local leftover=loadedHere%needed
77786
77891
  if needed>1 then
77787
77892
  if fullSets>0 and leftover==0 then
77788
- local msg=self.gettext:GetEntry("LOADED_FULL",self.locale)
77893
+ local msg=self:_GetEntryForGroup("LOADED_FULL",Group)
77789
77894
  msg=string.format(msg,fullSets,displayName)
77790
77895
  self:_SendMessage(msg,10,false,Group)
77791
77896
  elseif fullSets>0 and leftover>0 then
77792
- local msg=self.gettext:GetEntry("LOADED_SETS_LEFTOVER",self.locale)
77897
+ local msg=self:_GetEntryForGroup("LOADED_SETS_LEFTOVER",Group)
77793
77898
  msg=string.format(msg,fullSets,displayName,leftover)
77794
77899
  self:_SendMessage(msg,10,false,Group)
77795
77900
  else
77796
- local msg=self.gettext:GetEntry("LOADED_PARTIAL",self.locale)
77901
+ local msg=self:_GetEntryForGroup("LOADED_PARTIAL",Group)
77797
77902
  msg=string.format(msg,loadedHere,needed,displayName)
77798
77903
  self:_SendMessage(msg,15,false,Group)
77799
77904
  end
77800
77905
  else
77801
- local msg=self.gettext:GetEntry("LOADED_SETS",self.locale)
77906
+ local msg=self:_GetEntryForGroup("LOADED_SETS",Group)
77802
77907
  msg=string.format(msg,loadedHere,displayName)
77803
77908
  self:_SendMessage(msg,10,false,Group)
77804
77909
  end
@@ -77832,17 +77937,17 @@ end
77832
77937
  end
77833
77938
  end
77834
77939
  if#crates==0 then
77835
- local msg=self.gettext:GetEntry("NOTHING_TO_REMOVE",self.locale)
77940
+ local msg=self:_GetEntryForGroup("NOTHING_TO_REMOVE",Group)
77836
77941
  self:_SendMessage(msg,10,false,Group)
77837
77942
  self:_RefreshPackMenus(Group,Unit)
77838
77943
  return self
77839
77944
  end
77840
- local text=REPORT:New(self.gettext:GetEntry("REPORT_REMOVING_CRATES",self.locale))
77945
+ local text=REPORT:New(self:_GetEntryForGroup("REPORT_REMOVING_CRATES",Group))
77841
77946
  text:Add("------------------------------------------------------------")
77842
77947
  local removedIDs={}
77843
77948
  for _,entry in pairs(crates)do
77844
- local name=entry:GetName()or"none"
77845
- text:Add(string.format(self.gettext:GetEntry("REPORT_ROW_CRATE_REMOVED",self.locale),name,entry.PerCrateMass))
77949
+ local name=self:_GetCargoDisplayNameForGroup(entry:GetName()or"none",Group)
77950
+ text:Add(string.format(self:_GetEntryForGroup("REPORT_ROW_CRATE_REMOVED",Group),name,entry.PerCrateMass))
77846
77951
  local pos=entry:GetPositionable()
77847
77952
  if pos then
77848
77953
  entry.coordinate=pos:GetCoordinate()
@@ -77871,7 +77976,7 @@ function CTLD:_PackSelectedGroupAction(Group,Unit,TargetGroupName,Mode)
77871
77976
  self:T(self.lid.." _PackSelectedGroupAction")
77872
77977
  local targetGroup=GROUP:FindByName(TargetGroupName)
77873
77978
  if not targetGroup or not targetGroup:IsAlive()then
77874
- local msg=self.gettext:GetEntry("NOTHING_TO_PACK",self.locale)
77979
+ local msg=self:_GetEntryForGroup("NOTHING_TO_PACK",Group)
77875
77980
  self:_SendMessage(msg,10,false,Group)
77876
77981
  self:_RefreshPackMenus(Group,Unit)
77877
77982
  return false
@@ -77908,7 +78013,7 @@ packedAny=true
77908
78013
  end
77909
78014
  end
77910
78015
  if not packedAny then
77911
- local msg=self.gettext:GetEntry("NOTHING_TO_PACK",self.locale)
78016
+ local msg=self:_GetEntryForGroup("NOTHING_TO_PACK",Group)
77912
78017
  self:_SendMessage(msg,10,false,Group)
77913
78018
  return false
77914
78019
  end
@@ -77984,7 +78089,7 @@ end
77984
78089
  end
77985
78090
  else
77986
78091
  if not Engineering then
77987
- local msg=self.gettext:GetEntry("NO_CRATES_WITHIN_PLAIN",self.locale)
78092
+ local msg=self:_GetEntryForGroup("NO_CRATES_WITHIN_PLAIN",Group)
77988
78093
  msg=string.format(msg,finddist)
77989
78094
  self:_SendMessage(msg,10,false,Group,true)
77990
78095
  end
@@ -78102,7 +78207,7 @@ end
78102
78207
  function CTLD:_DropAndBuild(Group,Unit)
78103
78208
  if self.nobuildinloadzones then
78104
78209
  if self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD)then
78105
- local msg=self.gettext:GetEntry("CANNOT_BUILD_LOADING_AREA",self.locale)
78210
+ local msg=self:_GetEntryForGroup("CANNOT_BUILD_LOADING_AREA",Group)
78106
78211
  self:_SendMessage(msg,10,false,Group)
78107
78212
  return self
78108
78213
  end
@@ -78113,7 +78218,7 @@ end
78113
78218
  function CTLD:_DropSingleAndBuild(Group,Unit,setIndex)
78114
78219
  if self.nobuildinloadzones then
78115
78220
  if self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD)then
78116
- local msg=self.gettext:GetEntry("CANNOT_BUILD_LOADING_AREA",self.locale)
78221
+ local msg=self:_GetEntryForGroup("CANNOT_BUILD_LOADING_AREA",Group)
78117
78222
  self:_SendMessage(msg,10,false,Group)
78118
78223
  return self
78119
78224
  end
@@ -78123,7 +78228,7 @@ timer.scheduleFunction(function()self:_BuildCrates(Group,Unit,false)end,{},timer
78123
78228
  end
78124
78229
  function CTLD:_PackAndLoad(Group,Unit)
78125
78230
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
78126
- local msg=self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale)
78231
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO",Group)
78127
78232
  self:_SendMessage(msg,10,false,Group)
78128
78233
  return self
78129
78234
  end
@@ -78142,7 +78247,7 @@ return self
78142
78247
  end
78143
78248
  function CTLD:_GetAndLoad(Group,Unit,cargoObj,quantity,LoadAnyWay)
78144
78249
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
78145
- local msg=self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale)
78250
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO",Group)
78146
78251
  self:_SendMessage(msg,10,false,Group)
78147
78252
  return self
78148
78253
  end
@@ -78159,7 +78264,7 @@ if space<0 then space=0 end
78159
78264
  local perSet=needed>0 and needed or 1
78160
78265
  capacitySets=math.floor(space/perSet)
78161
78266
  if capacitySets<1 and not LoadAnyWay then
78162
- local msg=self.gettext:GetEntry("NO_CAPACITY_NOW",self.locale)
78267
+ local msg=self:_GetEntryForGroup("NO_CAPACITY_NOW",Group)
78163
78268
  self:_SendMessage(msg,10,false,Group)
78164
78269
  return self
78165
78270
  end
@@ -78178,7 +78283,7 @@ local zone=nil
78178
78283
  inzone,ship,zone,distance,width=self:IsUnitInZone(Unit,CTLD.CargoZoneType.SHIP)
78179
78284
  end
78180
78285
  if not inzone then
78181
- local msg=self.gettext:GetEntry("NOT_CLOSE_ENOUGH_LOGISTICS",self.locale)
78286
+ local msg=self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_LOGISTICS",Group)
78182
78287
  self:_SendMessage(msg,10,false,Group)
78183
78288
  return self
78184
78289
  end
@@ -78197,7 +78302,7 @@ return self
78197
78302
  end
78198
78303
  function CTLD:_GetAllAndLoad(Group,Unit)
78199
78304
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
78200
- local msg=self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale)
78305
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO",Group)
78201
78306
  self:_SendMessage(msg,10,false,Group)
78202
78307
  return self
78203
78308
  end
@@ -78507,11 +78612,11 @@ _group.CTLDTopmenu=nil
78507
78612
  end
78508
78613
  local toptroops=nil
78509
78614
  local topcrates=nil
78510
- local topmenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_CTLD",self.locale),nil)
78615
+ local topmenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_CTLD",_group),nil)
78511
78616
  _group.CTLDTopmenu=topmenu
78512
78617
  if cantroops then
78513
- local toptroops=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_MANAGE_TROOPS",self.locale),topmenu)
78514
- local troopsmenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_LOAD_TROOPS",self.locale),toptroops)
78618
+ local toptroops=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_MANAGE_TROOPS",_group),topmenu)
78619
+ local troopsmenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_LOAD_TROOPS",_group),toptroops)
78515
78620
  _group.MyTopTroopsMenu=toptroops
78516
78621
  _group.CTLD_TroopMenus={}
78517
78622
  if self.usesubcats then
@@ -78530,7 +78635,7 @@ end
78530
78635
  end
78531
78636
  for _,cargoObj in pairs(self.Cargo_Troops)do
78532
78637
  if not cargoObj.DontShowInMenu then
78533
- local menutext=self:_GetCargoDisplayName(cargoObj)
78638
+ local menutext=self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj),cargoObj,_group)
78534
78639
  local parent=troopsmenu
78535
78640
  if useTroopSubcats and cargoObj.Subcategory and subcatmenus[cargoObj.Subcategory]then
78536
78641
  parent=subcatmenus[cargoObj.Subcategory]
@@ -78543,18 +78648,18 @@ end
78543
78648
  else
78544
78649
  for _,cargoObj in pairs(self.Cargo_Troops)do
78545
78650
  if not cargoObj.DontShowInMenu then
78546
- local menutext=self:_GetCargoDisplayName(cargoObj)
78651
+ local menutext=self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj),cargoObj,_group)
78547
78652
  local mSet=MENU_GROUP:New(_group,menutext,troopsmenu)
78548
78653
  _group.CTLD_TroopMenus[cargoObj.Name]=mSet
78549
78654
  self:_AddTroopQuantityMenus(_group,_unit,mSet,cargoObj)
78550
78655
  end
78551
78656
  end
78552
78657
  end
78553
- local dropTroopsMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_DROP_TROOPS",self.locale),toptroops):Refresh()
78658
+ local dropTroopsMenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_DROP_TROOPS",_group),toptroops):Refresh()
78554
78659
  if self.maxUnloadTroopsAllowed==-1 then
78555
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_DROP_ALL_TROOPS",self.locale),dropTroopsMenu,self._UnloadTroops,self,_group,_unit):Refresh()
78660
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_DROP_ALL_TROOPS",_group),dropTroopsMenu,self._UnloadTroops,self,_group,_unit):Refresh()
78556
78661
  end
78557
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_EXTRACT_TROOPS",self.locale),toptroops,self._ExtractTroops,self,_group,_unit):Refresh()
78662
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_EXTRACT_TROOPS",_group),toptroops,self._ExtractTroops,self,_group,_unit):Refresh()
78558
78663
  local uName=_unit:GetName()
78559
78664
  local loadedData=self.Loaded_Cargo[uName]
78560
78665
  if loadedData and loadedData.Cargo then
@@ -78570,9 +78675,9 @@ end
78570
78675
  end
78571
78676
  end
78572
78677
  if cancrates then
78573
- local topcrates=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_MANAGE_CRATES",self.locale),topmenu)
78678
+ local topcrates=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_MANAGE_CRATES",_group),topmenu)
78574
78679
  _group.MyTopCratesMenu=topcrates
78575
- local cratesmenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_GET_CRATES",self.locale),topcrates)
78680
+ local cratesmenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_GET_CRATES",_group),topcrates)
78576
78681
  if self.onestepmenu then
78577
78682
  _group.CTLD_CrateMenus={}
78578
78683
  local crateStockSummary=nil
@@ -78600,13 +78705,12 @@ end
78600
78705
  end
78601
78706
  local needed=cargoObj:GetCratesNeeded()or 1
78602
78707
  local txt
78603
- local cargoLabel=self:_GetCargoDisplayName(cargoObj)
78708
+ local cargoLabel=self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj),cargoObj,_group)
78604
78709
  if needed>1 then
78605
- local plural="s"
78606
- if self.locale=="de"then plural="n"end
78607
- txt=string.format(self.gettext:GetEntry("MENU_CRATES_NEEDED",self.locale),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0)
78710
+ local plural=self:_GetMenuPluralSuffix(needed,"crate",_group)
78711
+ txt=string.format(self:_GetEntryForGroup("MENU_CRATES_NEEDED",_group),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0)
78608
78712
  else
78609
- txt=string.format("%s (%dkg)",cargoLabel,cargoObj.PerCrateMass or 0)
78713
+ txt=string.format(self:_GetEntryForGroup("MENU_CRATE_SINGLE",_group),cargoLabel,cargoObj.PerCrateMass or 0)
78610
78714
  end
78611
78715
  if cargoObj.Location then txt=txt.."[R]"end
78612
78716
  if self.showstockinmenuitems then
@@ -78647,13 +78751,12 @@ for _,cargoObj in pairs(self.Cargo_Crates)do
78647
78751
  if not cargoObj.DontShowInMenu then
78648
78752
  local needed=cargoObj:GetCratesNeeded()or 1
78649
78753
  local txt
78650
- local cargoLabel=self:_GetCargoDisplayName(cargoObj)
78754
+ local cargoLabel=self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj),cargoObj,_group)
78651
78755
  if needed>1 then
78652
- local plural="s"
78653
- if self.locale=="de"then plural="n"end
78654
- txt=string.format(self.gettext:GetEntry("MENU_CRATES_NEEDED",self.locale),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0)
78756
+ local plural=self:_GetMenuPluralSuffix(needed,"crate",_group)
78757
+ txt=string.format(self:_GetEntryForGroup("MENU_CRATES_NEEDED",_group),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0)
78655
78758
  else
78656
- txt=string.format("%s (%dkg)",cargoLabel,cargoObj.PerCrateMass or 0)
78759
+ txt=string.format(self:_GetEntryForGroup("MENU_CRATE_SINGLE",_group),cargoLabel,cargoObj.PerCrateMass or 0)
78657
78760
  end
78658
78761
  if cargoObj.Location then txt=txt.."[R]"end
78659
78762
  local stock=cargoObj:GetStock()
@@ -78665,13 +78768,12 @@ for _,cargoObj in pairs(self.Cargo_Statics)do
78665
78768
  if(not cargoObj.DontShowInMenu)and(not cargoObj.UnitCanCarry or cargoObj:UnitCanCarry(_unit))then
78666
78769
  local needed=cargoObj:GetCratesNeeded()or 1
78667
78770
  local txt
78668
- local cargoLabel=self:_GetCargoDisplayName(cargoObj)
78771
+ local cargoLabel=self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj),cargoObj,_group)
78669
78772
  if needed>1 then
78670
- local plural="s"
78671
- if self.locale=="de"then plural="n"end
78672
- txt=string.format(self.gettext:GetEntry("MENU_CRATES_NEEDED",self.locale),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0)
78773
+ local plural=self:_GetMenuPluralSuffix(needed,"crate",_group)
78774
+ txt=string.format(self:_GetEntryForGroup("MENU_CRATES_NEEDED",_group),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0)
78673
78775
  else
78674
- txt=string.format("%s (%dkg)",cargoLabel,cargoObj.PerCrateMass or 0)
78776
+ txt=string.format(self:_GetEntryForGroup("MENU_CRATE_SINGLE",_group),cargoLabel,cargoObj.PerCrateMass or 0)
78675
78777
  end
78676
78778
  if cargoObj.Location then txt=txt.."[R]"end
78677
78779
  local stock=cargoObj:GetStock()
@@ -78684,13 +78786,12 @@ for _,cargoObj in pairs(self.Cargo_Crates)do
78684
78786
  if not cargoObj.DontShowInMenu then
78685
78787
  local needed=cargoObj:GetCratesNeeded()or 1
78686
78788
  local txt
78687
- local cargoLabel=self:_GetCargoDisplayName(cargoObj)
78789
+ local cargoLabel=self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj),cargoObj,_group)
78688
78790
  if needed>1 then
78689
- local plural="s"
78690
- if self.locale=="de"then plural="n"end
78691
- txt=string.format(self.gettext:GetEntry("MENU_CRATES_NEEDED",self.locale),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0)
78791
+ local plural=self:_GetMenuPluralSuffix(needed,"crate",_group)
78792
+ txt=string.format(self:_GetEntryForGroup("MENU_CRATES_NEEDED",_group),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0)
78692
78793
  else
78693
- txt=string.format("%s (%dkg)",cargoLabel,cargoObj.PerCrateMass or 0)
78794
+ txt=string.format(self:_GetEntryForGroup("MENU_CRATE_SINGLE",_group),cargoLabel,cargoObj.PerCrateMass or 0)
78694
78795
  end
78695
78796
  if cargoObj.Location then txt=txt.."[R]"end
78696
78797
  local stock=cargoObj:GetStock()
@@ -78702,13 +78803,12 @@ for _,cargoObj in pairs(self.Cargo_Statics)do
78702
78803
  if(not cargoObj.DontShowInMenu)and(not cargoObj.UnitCanCarry or cargoObj:UnitCanCarry(_unit))then
78703
78804
  local needed=cargoObj:GetCratesNeeded()or 1
78704
78805
  local txt
78705
- local cargoLabel=self:_GetCargoDisplayName(cargoObj)
78806
+ local cargoLabel=self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj),cargoObj,_group)
78706
78807
  if needed>1 then
78707
- local plural="s"
78708
- if self.locale=="de"then plural="n"end
78709
- txt=string.format(self.gettext:GetEntry("MENU_CRATES_NEEDED",self.locale),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0)
78808
+ local plural=self:_GetMenuPluralSuffix(needed,"crate",_group)
78809
+ txt=string.format(self:_GetEntryForGroup("MENU_CRATES_NEEDED",_group),needed,plural,cargoLabel,cargoObj.PerCrateMass or 0)
78710
78810
  else
78711
- txt=string.format("%s (%dkg)",cargoLabel,cargoObj.PerCrateMass or 0)
78811
+ txt=string.format(self:_GetEntryForGroup("MENU_CRATE_SINGLE",_group),cargoLabel,cargoObj.PerCrateMass or 0)
78712
78812
  end
78713
78813
  if cargoObj.Location then txt=txt.."[R]"end
78714
78814
  local stock=cargoObj:GetStock()
@@ -78718,30 +78818,30 @@ end
78718
78818
  end
78719
78819
  end
78720
78820
  end
78721
- local loadCratesMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_LOAD_CRATES",self.locale),topcrates)
78821
+ local loadCratesMenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_LOAD_CRATES",_group),topcrates)
78722
78822
  _group.MyLoadCratesMenu=loadCratesMenu
78723
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_LOAD_ALL",self.locale),loadCratesMenu,self._LoadCratesNearby,self,_group,_unit)
78724
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_SHOW_LOADABLE_CRATES",self.locale),loadCratesMenu,self._RefreshLoadCratesMenu,self,_group,_unit)
78725
- local dropCratesMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_DROP_CRATES",self.locale),topcrates)
78823
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_LOAD_ALL",_group),loadCratesMenu,self._LoadCratesNearby,self,_group,_unit)
78824
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_SHOW_LOADABLE_CRATES",_group),loadCratesMenu,self._RefreshLoadCratesMenu,self,_group,_unit)
78825
+ local dropCratesMenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_DROP_CRATES",_group),topcrates)
78726
78826
  topcrates.DropCratesMenu=dropCratesMenu
78727
78827
  if not self.nobuildmenu then
78728
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_BUILD_CRATES",self.locale),topcrates,self._BuildCrates,self,_group,_unit)
78729
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_REPAIR",self.locale),topcrates,self._RepairCrates,self,_group,_unit):Refresh()
78828
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_BUILD_CRATES",_group),topcrates,self._BuildCrates,self,_group,_unit)
78829
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_REPAIR",_group),topcrates,self._RepairCrates,self,_group,_unit):Refresh()
78730
78830
  end
78731
- local removecratesmenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_REMOVE_CRATES",self.locale),topcrates)
78732
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_REMOVE_CRATES_NEARBY",self.locale),removecratesmenu,self._RemoveCratesNearby,self,_group,_unit)
78831
+ local removecratesmenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_REMOVE_CRATES",_group),topcrates)
78832
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_REMOVE_CRATES_NEARBY",_group),removecratesmenu,self._RemoveCratesNearby,self,_group,_unit)
78733
78833
  if self.onestepmenu then
78734
- topcrates.PackRootMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_PACK",self.locale),topcrates)
78735
- topcrates.PackMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_PACK",self.locale),topcrates.PackRootMenu)
78834
+ topcrates.PackRootMenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_PACK",_group),topcrates)
78835
+ topcrates.PackMenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_PACK",_group),topcrates.PackRootMenu)
78736
78836
  local showPackAndLoad=not(self.UseC130LoadAndUnload and self:IsC130J(_unit))
78737
78837
  if showPackAndLoad then
78738
- topcrates.PackAndLoadMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_PACK_AND_LOAD",self.locale),topcrates.PackRootMenu)
78838
+ topcrates.PackAndLoadMenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_PACK_AND_LOAD",_group),topcrates.PackRootMenu)
78739
78839
  end
78740
- topcrates.PackAndRemoveMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_PACK_AND_REMOVE",self.locale),topcrates.PackRootMenu)
78741
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_LIST_CRATES_NEARBY",self.locale),topcrates,self._ListCratesNearby,self,_group,_unit)
78840
+ topcrates.PackAndRemoveMenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_PACK_AND_REMOVE",_group),topcrates.PackRootMenu)
78841
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_LIST_CRATES_NEARBY",_group),topcrates,self._ListCratesNearby,self,_group,_unit)
78742
78842
  else
78743
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_PACK_CRATES",self.locale),topcrates,self._PackCratesNearby,self,_group,_unit)
78744
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_LIST_CRATES_NEARBY",self.locale),topcrates,self._ListCratesNearby,self,_group,_unit)
78843
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_PACK_CRATES",_group),topcrates,self._PackCratesNearby,self,_group,_unit)
78844
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_LIST_CRATES_NEARBY",_group),topcrates,self._ListCratesNearby,self,_group,_unit)
78745
78845
  end
78746
78846
  local uName=_unit:GetName()
78747
78847
  local loadedData=self.Loaded_Cargo[uName]
@@ -78751,7 +78851,7 @@ for _,cgo in pairs(loadedData.Cargo)do
78751
78851
  if cgo and(not cgo:WasDropped())then
78752
78852
  local cname=cgo:GetName()
78753
78853
  local cneeded=cgo:GetCratesNeeded()
78754
- local cdisplay=self:_GetCargoDisplayName(cgo)
78854
+ local cdisplay=self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cgo),cgo,_group)
78755
78855
  cargoByName[cname]=cargoByName[cname]or{count=0,needed=cneeded,display=cdisplay}
78756
78856
  cargoByName[cname].count=cargoByName[cname].count+1
78757
78857
  end
@@ -78763,9 +78863,9 @@ end
78763
78863
  end
78764
78864
  end
78765
78865
  if self:IsC130J(_unit)then
78766
- local topunits=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_MANAGE_UNITS",self.locale),topmenu)
78767
- local getunits=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_GET_UNITS",self.locale),topunits)
78768
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_REMOVE_UNITS_NEARBY",self.locale),topunits,self._C130RemoveUnitsNearby,self,_group,_unit)
78866
+ local topunits=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_MANAGE_UNITS",_group),topmenu)
78867
+ local getunits=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_GET_UNITS",_group),topunits)
78868
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_REMOVE_UNITS_NEARBY",_group),topunits,self._C130RemoveUnitsNearby,self,_group,_unit)
78769
78869
  local unitentries=self.C130GetUnits or{}
78770
78870
  local unittype=_unit:GetTypeName()or"none"
78771
78871
  local subcatmenus=self.usesubcats and{}or nil
@@ -78791,7 +78891,7 @@ subcatmenus[cargoObj.SubCategory]=sub
78791
78891
  end
78792
78892
  parent=sub
78793
78893
  end
78794
- local menutext=self:_GetCargoDisplayName(cargoObj)
78894
+ local menutext=self:_FormatCargoDisplayText(self:_GetCargoDisplayName(cargoObj),cargoObj,_group)
78795
78895
  if type(cargoObj.Stock)=="number"and cargoObj.Stock>=0 and self.showstockinmenuitems then
78796
78896
  menutext=menutext.."["..cargoObj.Stock.."]"
78797
78897
  end
@@ -78799,24 +78899,24 @@ MENU_GROUP_COMMAND:New(_group,menutext,parent,self._C130GetUnits,self,_group,_un
78799
78899
  end
78800
78900
  end
78801
78901
  end
78802
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_LIST_BOARDED_CARGO",self.locale),topmenu,self._ListCargo,self,_group,_unit)
78803
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_INVENTORY",self.locale),topmenu,self._ListInventory,self,_group,_unit)
78804
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_LIST_ZONE_BEACONS",self.locale),topmenu,self._ListRadioBeacons,self,_group,_unit)
78805
- local smoketopmenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_SMOKES_FLARES_BEACONS",self.locale),topmenu)
78806
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_SMOKE_ZONES_NEARBY",self.locale),smoketopmenu,self.SmokeZoneNearBy,self,_unit,false)
78807
- local smokeself=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_DROP_SMOKE_NOW",self.locale),smoketopmenu)
78808
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_RED_SMOKE",self.locale),smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Red)
78809
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_BLUE_SMOKE",self.locale),smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Blue)
78810
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_GREEN_SMOKE",self.locale),smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Green)
78811
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_ORANGE_SMOKE",self.locale),smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Orange)
78812
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_WHITE_SMOKE",self.locale),smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.White)
78813
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_FLARE_ZONES_NEARBY",self.locale),smoketopmenu,self.SmokeZoneNearBy,self,_unit,true)
78814
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_FIRE_FLARE_NOW",self.locale),smoketopmenu,self.SmokePositionNow,self,_unit,true)
78815
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_DROP_BEACON_NOW",self.locale),smoketopmenu,self.DropBeaconNow,self,_unit):Refresh()
78902
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_LIST_BOARDED_CARGO",_group),topmenu,self._ListCargo,self,_group,_unit)
78903
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_INVENTORY",_group),topmenu,self._ListInventory,self,_group,_unit)
78904
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_LIST_ZONE_BEACONS",_group),topmenu,self._ListRadioBeacons,self,_group,_unit)
78905
+ local smoketopmenu=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_SMOKES_FLARES_BEACONS",_group),topmenu)
78906
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_SMOKE_ZONES_NEARBY",_group),smoketopmenu,self.SmokeZoneNearBy,self,_unit,false)
78907
+ local smokeself=MENU_GROUP:New(_group,self:_GetEntryForGroup("MENU_DROP_SMOKE_NOW",_group),smoketopmenu)
78908
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_RED_SMOKE",_group),smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Red)
78909
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_BLUE_SMOKE",_group),smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Blue)
78910
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_GREEN_SMOKE",_group),smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Green)
78911
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_ORANGE_SMOKE",_group),smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Orange)
78912
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_WHITE_SMOKE",_group),smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.White)
78913
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_FLARE_ZONES_NEARBY",_group),smoketopmenu,self.SmokeZoneNearBy,self,_unit,true)
78914
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_FIRE_FLARE_NOW",_group),smoketopmenu,self.SmokePositionNow,self,_unit,true)
78915
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_DROP_BEACON_NOW",_group),smoketopmenu,self.DropBeaconNow,self,_unit):Refresh()
78816
78916
  if self:IsFixedWing(_unit)then
78817
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_SHOW_FLIGHT_PARAMS",self.locale),topmenu,self._ShowFlightParams,self,_group,_unit):Refresh()
78917
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_SHOW_FLIGHT_PARAMS",_group),topmenu,self._ShowFlightParams,self,_group,_unit):Refresh()
78818
78918
  else
78819
- MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_SHOW_HOVER_PARAMS",self.locale),topmenu,self._ShowHoverParams,self,_group,_unit):Refresh()
78919
+ MENU_GROUP_COMMAND:New(_group,self:_GetEntryForGroup("MENU_SHOW_HOVER_PARAMS",_group),topmenu,self._ShowHoverParams,self,_group,_unit):Refresh()
78820
78920
  end
78821
78921
  self.MenusDone[_unitName]=true
78822
78922
  self:_RefreshLoadCratesMenu(_group,_unit)
@@ -78836,16 +78936,16 @@ function CTLD:_RefreshLoadCratesMenu(Group,Unit)
78836
78936
  if not Group.MyLoadCratesMenu then return end
78837
78937
  Group.MyLoadCratesMenu:RemoveSubMenus()
78838
78938
  if self:IsC130J(Unit)then
78839
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_USE_C130_LOAD",self.locale),Group.MyLoadCratesMenu,function()end)
78939
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_USE_C130_LOAD",Group),Group.MyLoadCratesMenu,function()end)
78840
78940
  return
78841
78941
  end
78842
78942
  local d=self.CrateDistance or 35
78843
78943
  local nearby,n=self:_FindCratesNearby(Group,Unit,d,true,true)
78844
78944
  if n==0 then
78845
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_NO_CRATES_FOUND_RESCAN",self.locale),Group.MyLoadCratesMenu,function()self:_RefreshLoadCratesMenu(Group,Unit)end)
78945
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_NO_CRATES_FOUND_RESCAN",Group),Group.MyLoadCratesMenu,function()self:_RefreshLoadCratesMenu(Group,Unit)end)
78846
78946
  return
78847
78947
  end
78848
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_LOAD_ALL",self.locale),Group.MyLoadCratesMenu,self._LoadCratesNearby,self,Group,Unit)
78948
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_LOAD_ALL",Group),Group.MyLoadCratesMenu,self._LoadCratesNearby,self,Group,Unit)
78849
78949
  local cargoByName={}
78850
78950
  for _,crate in pairs(nearby)do
78851
78951
  local name=crate:GetName()
@@ -78860,7 +78960,7 @@ local i=1
78860
78960
  while i<=#list do
78861
78961
  local left=#list-i+1
78862
78962
  local label
78863
- local loadkey=self.gettext:GetEntry("MENU_LOAD_SINGLE",self.locale)
78963
+ local loadkey=self:_GetEntryForGroup("MENU_LOAD_SINGLE",Group)
78864
78964
  if left>=needed then
78865
78965
  label=string.format("%d. %s %s",lineIndex,loadkey,cName)
78866
78966
  i=i+needed
@@ -78889,8 +78989,8 @@ local label=string.format("%d. %s (%dm)",idx,entry.display or entry.groupName,ma
78889
78989
  MENU_GROUP_COMMAND:New(Group,label,menu,self._PackSelectedGroupAction,self,Group,Unit,entry.groupName,mode)
78890
78990
  end
78891
78991
  end
78892
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry(allKey,self.locale),menu,bulkFunc,self,Group,Unit)
78893
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_SCAN_PACKABLE_UNITS",self.locale),menu,self._RefreshPackMenus,self,Group,Unit)
78992
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup(allKey,Group),menu,bulkFunc,self,Group,Unit)
78993
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_SCAN_PACKABLE_UNITS",Group),menu,self._RefreshPackMenus,self,Group,Unit)
78894
78994
  end
78895
78995
  refreshPackMenu(topCrates.PackMenu,"pack","MENU_PACK_ALL",self._PackCratesNearby)
78896
78996
  if topCrates.PackAndLoadMenu then
@@ -78903,19 +79003,19 @@ self:T(self.lid.." _LoadSingleCrateSet cargoName="..(cargoName or"nil"))
78903
79003
  local grounded=not self:IsUnitInAir(Unit)
78904
79004
  local hover=self:CanHoverLoad(Unit)
78905
79005
  if not grounded and not hover then
78906
- local msg=self.gettext:GetEntry("MUST_LAND_OR_HOVER_CRATES",self.locale)
79006
+ local msg=self:_GetEntryForGroup("MUST_LAND_OR_HOVER_CRATES",Group)
78907
79007
  self:_SendMessage(msg,10,false,Group)
78908
79008
  return self
78909
79009
  end
78910
79010
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
78911
- local msg=self.gettext:GetEntry("OPEN_DOORS_LOAD_CARGO",self.locale)
79011
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_LOAD_CARGO",Group)
78912
79012
  self:_SendMessage(msg,10,false,Group)
78913
79013
  return self
78914
79014
  end
78915
79015
  local finddist=self.CrateDistance or 35
78916
79016
  local cratesNearby,number=self:_FindCratesNearby(Group,Unit,finddist,false,false)
78917
79017
  if number==0 then
78918
- local msg=self.gettext:GetEntry("NO_CRATES_IN_RANGE",self.locale)
79018
+ local msg=self:_GetEntryForGroup("NO_CRATES_IN_RANGE",Group)
78919
79019
  self:_SendMessage(msg,10,false,Group)
78920
79020
  return self
78921
79021
  end
@@ -78928,8 +79028,8 @@ table.insert(matchingCrates,crateObj)
78928
79028
  end
78929
79029
  end
78930
79030
  if not needed then
78931
- local msg=self.gettext:GetEntry("NO_NAMED_CRATES_IN_RANGE",self.locale)
78932
- msg=string.format(msg,cargoName)
79031
+ local msg=self:_GetEntryForGroup("NO_NAMED_CRATES_IN_RANGE",Group)
79032
+ msg=string.format(msg,self:_GetCargoDisplayNameForGroup(cargoName,Group))
78933
79033
  self:_SendMessage(msg,10,false,Group)
78934
79034
  return self
78935
79035
  end
@@ -78942,7 +79042,7 @@ local loadedData=self.Loaded_Cargo[unitName]or{Troopsloaded=0,Cratesloaded=0,Car
78942
79042
  local capabilities=self:_GetUnitCapabilities(Unit)
78943
79043
  local capacity=capabilities.cratelimit or 0
78944
79044
  if loadedData.Cratesloaded>=capacity then
78945
- local msg=self.gettext:GetEntry("NO_MORE_CAPACITY",self.locale)
79045
+ local msg=self:_GetEntryForGroup("NO_MORE_CAPACITY",Group)
78946
79046
  self:_SendMessage(msg,10,false,Group)
78947
79047
  self.suppressmessages=prevSuppress
78948
79048
  return self
@@ -78950,7 +79050,7 @@ end
78950
79050
  local spaceLeft=capacity-loadedData.Cratesloaded
78951
79051
  local toLoad=math.min(found,needed,spaceLeft)
78952
79052
  if toLoad<1 then
78953
- local msg=self.gettext:GetEntry("CANNOT_LOAD_NONE_OR_FULL",self.locale)
79053
+ local msg=self:_GetEntryForGroup("CANNOT_LOAD_NONE_OR_FULL",Group)
78954
79054
  self:_SendMessage(msg,10,false,Group)
78955
79055
  self.suppressmessages=prevSuppress
78956
79056
  return self
@@ -78987,29 +79087,29 @@ self.Spawned_Cargo=newSpawned
78987
79087
  local loadedHere=toLoad
78988
79088
  if details or(not batch)then
78989
79089
  if loadedHere<needed and loadedData.Cratesloaded>=capacity then
78990
- local msg=self.gettext:GetEntry("LOADED_PARTIAL_LIMIT",self.locale)
78991
- msg=string.format(msg,loadedHere,needed,cargoName)
79090
+ local msg=self:_GetEntryForGroup("LOADED_PARTIAL_LIMIT",Group)
79091
+ msg=string.format(msg,loadedHere,needed,self:_GetCargoDisplayNameForGroup(cargoName,Group))
78992
79092
  self:_SendMessage(msg,10,false,Group)
78993
79093
  else
78994
79094
  local fullSets=math.floor(loadedHere/needed)
78995
79095
  local leftover=loadedHere%needed
78996
79096
  if needed>1 then
78997
79097
  if fullSets>0 and leftover==0 then
78998
- local msg=self.gettext:GetEntry("LOADED_FULL",self.locale)
78999
- msg=string.format(msg,fullSets,cargoName)
79098
+ local msg=self:_GetEntryForGroup("LOADED_FULL",Group)
79099
+ msg=string.format(msg,fullSets,self:_GetCargoDisplayNameForGroup(cargoName,Group))
79000
79100
  self:_SendMessage(msg,10,false,Group)
79001
79101
  elseif fullSets>0 and leftover>0 then
79002
- local msg=self.gettext:GetEntry("LOADED_SETS_LEFTOVER",self.locale)
79003
- msg=string.format(msg,fullSets,cargoName,leftover)
79102
+ local msg=self:_GetEntryForGroup("LOADED_SETS_LEFTOVER",Group)
79103
+ msg=string.format(msg,fullSets,self:_GetCargoDisplayNameForGroup(cargoName,Group),leftover)
79004
79104
  self:_SendMessage(msg,10,false,Group)
79005
79105
  else
79006
- local msg=self.gettext:GetEntry("LOADED_PARTIAL",self.locale)
79007
- msg=string.format(msg,loadedHere,needed,cargoName)
79106
+ local msg=self:_GetEntryForGroup("LOADED_PARTIAL",Group)
79107
+ msg=string.format(msg,loadedHere,needed,self:_GetCargoDisplayNameForGroup(cargoName,Group))
79008
79108
  self:_SendMessage(msg,15,false,Group)
79009
79109
  end
79010
79110
  else
79011
- local msg=self.gettext:GetEntry("LOADED_SETS",self.locale)
79012
- msg=string.format(msg,loadedHere,cargoName)
79111
+ local msg=self:_GetEntryForGroup("LOADED_SETS",Group)
79112
+ msg=string.format(msg,loadedHere,self:_GetCargoDisplayNameForGroup(cargoName,Group))
79013
79113
  self:_SendMessage(msg,10,false,Group)
79014
79114
  end
79015
79115
  end
@@ -79026,9 +79126,9 @@ batch.remaining=(batch.remaining or 1)-1
79026
79126
  if batch.remaining<=0 then
79027
79127
  self.suppressmessages=prevSuppress
79028
79128
  if not details then
79029
- local txt=string.format(self.gettext:GetEntry("LOADED_BATCH",self.locale),batch.loaded,cargoName)
79129
+ local txt=string.format(self:_GetEntryForGroup("LOADED_BATCH",batch.group),batch.loaded,self:_GetCargoDisplayNameForGroup(cargoName,batch.group))
79030
79130
  if batch.partials and batch.partials>0 then
79031
- txt=txt.." "..self.gettext:GetEntry("LOADED_BATCH_PARTIAL",self.locale)
79131
+ txt=txt.." "..self:_GetEntryForGroup("LOADED_BATCH_PARTIAL",batch.group)
79032
79132
  end
79033
79133
  self:_SendMessage(txt,10,false,batch.group)
79034
79134
  end
@@ -79044,7 +79144,7 @@ self:T(self.lid.." _UnloadSingleCrateSet")
79044
79144
  if not self.dropcratesanywhere then
79045
79145
  local inzone,zoneName,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.DROP)
79046
79146
  if not inzone then
79047
- local msg=self.gettext:GetEntry("NOT_CLOSE_ENOUGH_DROP",self.locale)
79147
+ local msg=self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_DROP",Group)
79048
79148
  self:_SendMessage(msg,10,false,Group)
79049
79149
  if not self.debug then
79050
79150
  return self
@@ -79052,26 +79152,26 @@ end
79052
79152
  end
79053
79153
  end
79054
79154
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
79055
- local msg=self.gettext:GetEntry("OPEN_DOORS_DROP_CARGO",self.locale)
79155
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_DROP_CARGO",Group)
79056
79156
  self:_SendMessage(msg,10,false,Group)
79057
79157
  if not self.debug then return self end
79058
79158
  end
79059
79159
  local unitName=Unit:GetName()
79060
79160
  if not self.CrateGroupList or not self.CrateGroupList[unitName]then
79061
- local msg=self.gettext:GetEntry("NO_CRATE_GROUPS",self.locale)
79161
+ local msg=self:_GetEntryForGroup("NO_CRATE_GROUPS",Group)
79062
79162
  self:_SendMessage(msg,10,false,Group)
79063
79163
  if not self.debug then return self end
79064
79164
  return self
79065
79165
  end
79066
79166
  local chunk=self.CrateGroupList[unitName][setIndex]
79067
79167
  if not chunk then
79068
- local msg=self.gettext:GetEntry("NO_CRATE_SET",self.locale)
79168
+ local msg=self:_GetEntryForGroup("NO_CRATE_SET",Group)
79069
79169
  self:_SendMessage(msg,10,false,Group)
79070
79170
  if not self.debug then return self end
79071
79171
  return self
79072
79172
  end
79073
79173
  if#chunk==0 then
79074
- local msg=self.gettext:GetEntry("NO_CRATE_IN_SET",self.locale)
79174
+ local msg=self:_GetEntryForGroup("NO_CRATE_IN_SET",Group)
79075
79175
  self:_SendMessage(msg,10,false,Group)
79076
79176
  if not self.debug then return self end
79077
79177
  return self
@@ -79085,10 +79185,10 @@ hoverunload=self:IsCorrectFlightParameters(Unit)
79085
79185
  end
79086
79186
  if not grounded and not hoverunload then
79087
79187
  if isHerc then
79088
- local msg=self.gettext:GetEntry("NOTHING_LOADED_AIRDROP",self.locale)
79188
+ local msg=self:_GetEntryForGroup("NOTHING_LOADED_AIRDROP",Group)
79089
79189
  self:_SendMessage(msg,10,false,Group)
79090
79190
  else
79091
- local msg=self.gettext:GetEntry("NOTHING_LOADED_HOVER",self.locale)
79191
+ local msg=self:_GetEntryForGroup("NOTHING_LOADED_HOVER",Group)
79092
79192
  self:_SendMessage(msg,10,false,Group)
79093
79193
  end
79094
79194
  if not self.debug then return self end
@@ -79096,7 +79196,7 @@ return self
79096
79196
  end
79097
79197
  local crateObj=chunk[1]
79098
79198
  if not crateObj then
79099
- local msg=self.gettext:GetEntry("NO_CRATE_IN_SET",self.locale)
79199
+ local msg=self:_GetEntryForGroup("NO_CRATE_IN_SET",Group)
79100
79200
  self:_SendMessage(msg,10,false,Group)
79101
79201
  if not self.debug then return self end
79102
79202
  return self
@@ -79111,17 +79211,17 @@ local cname=crateObj:GetName()or"Unknown"
79111
79211
  local count=#chunk
79112
79212
  if needed>1 then
79113
79213
  if count==needed then
79114
- local msg=self.gettext:GetEntry("DROPPED_FULL",self.locale)
79115
- msg=string.format(msg,1,cname)
79214
+ local msg=self:_GetEntryForGroup("DROPPED_FULL",Group)
79215
+ msg=string.format(msg,1,self:_GetCargoDisplayNameForGroup(cname,Group))
79116
79216
  self:_SendMessage(msg,10,false,Group)
79117
79217
  else
79118
- local msg=self.gettext:GetEntry("DROPPED_PARTIAL",self.locale)
79119
- msg=string.format(msg,count,needed,cname)
79218
+ local msg=self:_GetEntryForGroup("DROPPED_PARTIAL",Group)
79219
+ msg=string.format(msg,count,needed,self:_GetCargoDisplayNameForGroup(cname,Group))
79120
79220
  self:_SendMessage(msg,15,false,Group)
79121
79221
  end
79122
79222
  else
79123
- local msg=self.gettext:GetEntry("DROPPED_SETS",self.locale)
79124
- msg=string.format(msg,count,cname)
79223
+ local msg=self:_GetEntryForGroup("DROPPED_SETS",Group)
79224
+ msg=string.format(msg,count,self:_GetCargoDisplayNameForGroup(cname,Group))
79125
79225
  self:_SendMessage(msg,10,false,Group)
79126
79226
  end
79127
79227
  local loadedData=self.Loaded_Cargo[unitName]
@@ -79155,12 +79255,12 @@ if not topCrates then return end
79155
79255
  if topCrates.DropCratesMenu then
79156
79256
  topCrates.DropCratesMenu:RemoveSubMenus()
79157
79257
  else
79158
- topCrates.DropCratesMenu=MENU_GROUP:New(Group,self.gettext:GetEntry("MENU_DROP_CRATES",self.locale),topCrates)
79258
+ topCrates.DropCratesMenu=MENU_GROUP:New(Group,self:_GetEntryForGroup("MENU_DROP_CRATES",Group),topCrates)
79159
79259
  end
79160
79260
  local dropCratesMenu=topCrates.DropCratesMenu
79161
79261
  local loadedData=self.Loaded_Cargo[Unit:GetName()]
79162
79262
  if not loadedData or not loadedData.Cargo then
79163
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_NO_CRATES_TO_DROP",self.locale),dropCratesMenu,function()end)
79263
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_NO_CRATES_TO_DROP",Group),dropCratesMenu,function()end)
79164
79264
  return
79165
79265
  end
79166
79266
  local cargoByName={}
@@ -79177,11 +79277,11 @@ end
79177
79277
  end
79178
79278
  end
79179
79279
  if dropableCrates==0 then
79180
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_NO_CRATES_TO_DROP",self.locale),dropCratesMenu,function()end)
79280
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_NO_CRATES_TO_DROP",Group),dropCratesMenu,function()end)
79181
79281
  return
79182
79282
  end
79183
79283
  if not self.onestepmenu then
79184
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP_ALL_CRATES",self.locale),dropCratesMenu,self._UnloadCrates,self,Group,Unit)
79284
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP_ALL_CRATES",Group),dropCratesMenu,self._UnloadCrates,self,Group,Unit)
79185
79285
  self.CrateGroupList=self.CrateGroupList or{}
79186
79286
  self.CrateGroupList[Unit:GetName()]={}
79187
79287
  local lineIndex=1
@@ -79200,7 +79300,7 @@ table.insert(self.CrateGroupList[Unit:GetName()],chunk)
79200
79300
  i=i+needed
79201
79301
  end
79202
79302
  if sets==1 then
79203
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP",self.locale),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79303
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP",Group),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79204
79304
  local uName=UnitArg:GetName()
79205
79305
  for k=1,qty do
79206
79306
  local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName]
@@ -79217,8 +79317,8 @@ end
79217
79317
  end,self,Group,Unit,cName,needed,1)
79218
79318
  else
79219
79319
  for q=1,sets do
79220
- local qm=MENU_GROUP:New(Group,string.format(self.gettext:GetEntry("MENU_DROP_N_SETS",self.locale),q,q>1 and"s"or""),parentMenu)
79221
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP",self.locale),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79320
+ local qm=MENU_GROUP:New(Group,string.format(self:_GetEntryForGroup("MENU_DROP_N_SETS",Group),q,self:_GetMenuPluralSuffix(q,"set",Group)),parentMenu)
79321
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP",Group),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79222
79322
  local uName=UnitArg:GetName()
79223
79323
  for k=1,qty do
79224
79324
  local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName]
@@ -79249,10 +79349,10 @@ lineIndex=lineIndex+1
79249
79349
  end
79250
79350
  end
79251
79351
  else
79252
- local mAll=MENU_GROUP:New(Group,self.gettext:GetEntry("MENU_DROP_ALL_CRATES",self.locale),dropCratesMenu)
79253
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP",self.locale),mAll,self._UnloadCrates,self,Group,Unit)
79352
+ local mAll=MENU_GROUP:New(Group,self:_GetEntryForGroup("MENU_DROP_ALL_CRATES",Group),dropCratesMenu)
79353
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP",Group),mAll,self._UnloadCrates,self,Group,Unit)
79254
79354
  if not(self:IsUnitInAir(Unit)and self:IsFixedWing(Unit))then
79255
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP_AND_BUILD",self.locale),mAll,self._DropAndBuild,self,Group,Unit)
79355
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP_AND_BUILD",Group),mAll,self._DropAndBuild,self,Group,Unit)
79256
79356
  end
79257
79357
  self.CrateGroupList=self.CrateGroupList or{}
79258
79358
  self.CrateGroupList[Unit:GetName()]={}
@@ -79272,7 +79372,7 @@ table.insert(self.CrateGroupList[Unit:GetName()],chunk)
79272
79372
  i=i+needed
79273
79373
  end
79274
79374
  if sets==1 then
79275
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP",self.locale),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79375
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP",Group),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79276
79376
  local uName=UnitArg:GetName()
79277
79377
  for k=1,qty do
79278
79378
  local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName]
@@ -79288,7 +79388,7 @@ selfArg:_UnloadSingleCrateSet(GroupArg,UnitArg,idx)
79288
79388
  end
79289
79389
  end,self,Group,Unit,cName,needed,1)
79290
79390
  if not(self:IsUnitInAir(Unit)and self:IsFixedWing(Unit))then
79291
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP_AND_BUILD",self.locale),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79391
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP_AND_BUILD",Group),parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79292
79392
  local uName=UnitArg:GetName()
79293
79393
  for k=1,qty do
79294
79394
  local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName]
@@ -79307,8 +79407,8 @@ end,self,Group,Unit,cName,needed,1)
79307
79407
  end
79308
79408
  else
79309
79409
  for q=1,sets do
79310
- local qm=MENU_GROUP:New(Group,string.format(self.gettext:GetEntry("MENU_DROP_N_SETS",self.locale),q,q>1 and"s"or""),parentMenu)
79311
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP",self.locale),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79410
+ local qm=MENU_GROUP:New(Group,string.format(self:_GetEntryForGroup("MENU_DROP_N_SETS",Group),q,self:_GetMenuPluralSuffix(q,"set",Group)),parentMenu)
79411
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP",Group),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79312
79412
  local uName=UnitArg:GetName()
79313
79413
  for k=1,qty do
79314
79414
  local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName]
@@ -79324,7 +79424,7 @@ selfArg:_UnloadSingleCrateSet(GroupArg,UnitArg,idx)
79324
79424
  end
79325
79425
  end,self,Group,Unit,cName,needed,q)
79326
79426
  if not(self:IsUnitInAir(Unit)and self:IsFixedWing(Unit))then
79327
- MENU_GROUP_COMMAND:New(Group,self.gettext:GetEntry("MENU_DROP_AND_BUILD",self.locale),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79427
+ MENU_GROUP_COMMAND:New(Group,self:_GetEntryForGroup("MENU_DROP_AND_BUILD",Group),qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty)
79328
79428
  local uName=UnitArg:GetName()
79329
79429
  for k=1,qty do
79330
79430
  local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName]
@@ -79373,7 +79473,7 @@ if inzone then
79373
79473
  droppingatbase=self.returntroopstobase
79374
79474
  end
79375
79475
  if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then
79376
- local msg=self.gettext:GetEntry("OPEN_DOORS_UNLOAD_TROOPS",self.locale)
79476
+ local msg=self:_GetEntryForGroup("OPEN_DOORS_UNLOAD_TROOPS",Group)
79377
79477
  self:_SendMessage(msg,10,false,Group)
79378
79478
  if not self.debug then return self end
79379
79479
  end
@@ -79392,7 +79492,7 @@ return self
79392
79492
  end
79393
79493
  if not droppingatbase or self.debug then
79394
79494
  if not self.TroopsIDToChunk or not self.TroopsIDToChunk[chunkID]then
79395
- local msg=self.gettext:GetEntry("NO_TROOP_CHUNK",self.locale)
79495
+ local msg=self:_GetEntryForGroup("NO_TROOP_CHUNK",Group)
79396
79496
  msg=string.format(msg,chunkID)
79397
79497
  self:_SendMessage(msg,10,false,Group)
79398
79498
  if not self.debug then return self end
@@ -79400,7 +79500,7 @@ return self
79400
79500
  end
79401
79501
  local chunk=self.TroopsIDToChunk[chunkID]
79402
79502
  if not chunk or#chunk==0 then
79403
- local msg=self.gettext:GetEntry("TROOP_CHUNK_EMPTY",self.locale)
79503
+ local msg=self:_GetEntryForGroup("TROOP_CHUNK_EMPTY",Group)
79404
79504
  msg=string.format(msg,chunkID)
79405
79505
  self:_SendMessage(msg,10,false,Group)
79406
79506
  if not self.debug then return self end
@@ -79475,19 +79575,21 @@ break
79475
79575
  end
79476
79576
  end
79477
79577
  local parts={}
79578
+ local troopLabel=self:_GetEntryForGroup("TROOPS_LABEL",Group)
79579
+ local engineerLabel=self:_GetEntryForGroup("ENGINEERS_LABEL",Group)
79478
79580
  for nName,nCount in pairs(deployedTroopsByName)do
79479
- parts[#parts+1]=tostring(nCount).."x Troops "..nName
79581
+ parts[#parts+1]=tostring(nCount).."x "..troopLabel.." "..nName
79480
79582
  end
79481
79583
  for nName,nCount in pairs(deployedEngineersByName)do
79482
- parts[#parts+1]=tostring(nCount).."x Engineers "..nName
79584
+ parts[#parts+1]=tostring(nCount).."x "..engineerLabel.." "..nName
79483
79585
  end
79484
79586
  if#parts>0 then
79485
- local msg=self.gettext:GetEntry("DROPPED_INTO_ACTION",self.locale)
79587
+ local msg=self:_GetEntryForGroup("DROPPED_INTO_ACTION",Group)
79486
79588
  msg=string.format(msg,table.concat(parts,", "))
79487
79589
  self:_SendMessage(msg,10,false,Group)
79488
79590
  end
79489
79591
  else
79490
- local msg=self.gettext:GetEntry("TROOPS_RETURNED",self.locale)
79592
+ local msg=self:_GetEntryForGroup("TROOPS_RETURNED",Group)
79491
79593
  self:_SendMessage(msg,10,false,Group)
79492
79594
  self:__TroopsRTB(1,Group,Unit,zonename,zone)
79493
79595
  if self.TroopsIDToChunk and self.TroopsIDToChunk[chunkID]then
@@ -79537,10 +79639,10 @@ self:_RefreshTroopQuantityMenus(Group,Unit,nil)
79537
79639
  else
79538
79640
  local isHerc=self:IsFixedWing(Unit)
79539
79641
  if isHerc then
79540
- local msg=self.gettext:GetEntry("NOTHING_LOADED_AIRDROP",self.locale)
79642
+ local msg=self:_GetEntryForGroup("NOTHING_LOADED_AIRDROP",Group)
79541
79643
  self:_SendMessage(msg,10,false,Group)
79542
79644
  else
79543
- local msg=self.gettext:GetEntry("NOTHING_LOADED_HOVER",self.locale)
79645
+ local msg=self:_GetEntryForGroup("NOTHING_LOADED_HOVER",Group)
79544
79646
  self:_SendMessage(msg,10,false,Group)
79545
79647
  end
79546
79648
  end
@@ -79556,11 +79658,11 @@ local dropTroopsMenu=topTroops.DropTroopsMenu
79556
79658
  if dropTroopsMenu then
79557
79659
  dropTroopsMenu:RemoveSubMenus()
79558
79660
  else
79559
- dropTroopsMenu=MENU_GROUP:New(theGroup,self.gettext:GetEntry("MENU_DROP_TROOPS",self.locale),topTroops)
79661
+ dropTroopsMenu=MENU_GROUP:New(theGroup,self:_GetEntryForGroup("MENU_DROP_TROOPS",theGroup),topTroops)
79560
79662
  topTroops.DropTroopsMenu=dropTroopsMenu
79561
79663
  end
79562
79664
  if self.maxUnloadTroopsAllowed==-1 then
79563
- MENU_GROUP_COMMAND:New(theGroup,self.gettext:GetEntry("MENU_DROP_ALL_TROOPS",self.locale),dropTroopsMenu,self._UnloadTroops,self,theGroup,theUnit)
79665
+ MENU_GROUP_COMMAND:New(theGroup,self:_GetEntryForGroup("MENU_DROP_ALL_TROOPS",theGroup),dropTroopsMenu,self._UnloadTroops,self,theGroup,theUnit)
79564
79666
  end
79565
79667
  local loadedData=self.Loaded_Cargo[theUnit:GetName()]
79566
79668
  if not loadedData or not loadedData.Cargo then return end
@@ -79582,14 +79684,14 @@ local count=#objList
79582
79684
  if count>0 then
79583
79685
  local chunkID=objList[1]:GetID()
79584
79686
  self.TroopsIDToChunk[chunkID]=objList
79585
- local label=string.format(self.gettext:GetEntry("MENU_DROP_N_TROOPS",self.locale),count,tName)
79687
+ local label=string.format(self:_GetEntryForGroup("MENU_DROP_N_TROOPS",theGroup),count,tName)
79586
79688
  if count==1 then
79587
79689
  MENU_GROUP_COMMAND:New(theGroup,label,dropTroopsMenu,self._UnloadSingleTroopByID,self,theGroup,theUnit,chunkID,1)
79588
79690
  else
79589
79691
  local parentMenu=MENU_GROUP:New(theGroup,label,dropTroopsMenu)
79590
79692
  for q=1,count do
79591
79693
  if q>self.maxUnloadTroopsAllowed and self.maxUnloadTroopsAllowed>-1 then break end
79592
- 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)
79694
+ MENU_GROUP_COMMAND:New(theGroup,string.format(self:_GetEntryForGroup("MENU_DROP_N_TROOPS",theGroup),q,tName),parentMenu,self._UnloadSingleTroopByID,self,theGroup,theUnit,chunkID,q)
79593
79695
  end
79594
79696
  end
79595
79697
  end
@@ -80060,7 +80162,7 @@ local Name=ctldzone.name
80060
80162
  local FM=FMbeacon.frequency
80061
80163
  local VHF=VHFbeacon.frequency*1000
80062
80164
  local UHF=UHFbeacon.frequency
80063
- local text=string.format(self.gettext:GetEntry("DROPPED_BEACON",self.locale),Name,FM,VHF,UHF)
80165
+ local text=string.format(self:_GetEntryForGroup("DROPPED_BEACON",Unit:GetGroup()),Name,FM,VHF,UHF)
80064
80166
  self:_SendMessage(text,15,false,Unit:GetGroup())
80065
80167
  return self
80066
80168
  end
@@ -80326,7 +80428,7 @@ zonecoord:Flare(color or FLARECOLOR.White)
80326
80428
  end
80327
80429
  local txt="smoking"
80328
80430
  if Flare then txt="flaring"end
80329
- local msg=self.gettext:GetEntry("ROGER_ZONE",self.locale)
80431
+ local msg=self:_GetEntryForGroup("ROGER_ZONE",Group)
80330
80432
  msg=string.format(msg,txt,zonename)
80331
80433
  self:_SendMessage(msg,10,false,Group)
80332
80434
  smoked=true
@@ -80336,7 +80438,7 @@ end
80336
80438
  end
80337
80439
  if not smoked then
80338
80440
  local distance=UTILS.MetersToNM(self.smokedistance)
80339
- local msg=self.gettext:GetEntry("NOT_CLOSE_ENOUGH_ZONE_NM",self.locale)
80441
+ local msg=self:_GetEntryForGroup("NOT_CLOSE_ENOUGH_ZONE_NM",Group)
80340
80442
  msg=string.format(msg,distance)
80341
80443
  self:_SendMessage(msg,10,false,Group)
80342
80444
  end
@@ -80432,11 +80534,11 @@ local htxt="true"
80432
80534
  if not inhover then htxt="false"end
80433
80535
  local text=""
80434
80536
  if _SETTINGS:IsMetric()then
80435
- text=string.format(self.gettext:GetEntry("HOVER_PARAMS_METRIC",self.locale),self.minimumHoverHeight,self.maximumHoverHeight,htxt)
80537
+ text=string.format(self:_GetEntryForGroup("HOVER_PARAMS_METRIC",Group),self.minimumHoverHeight,self.maximumHoverHeight,htxt)
80436
80538
  else
80437
80539
  local minheight=UTILS.MetersToFeet(self.minimumHoverHeight)
80438
80540
  local maxheight=UTILS.MetersToFeet(self.maximumHoverHeight)
80439
- text=string.format(self.gettext:GetEntry("HOVER_PARAMS_IMPERIAL",self.locale),minheight,maxheight,htxt)
80541
+ text=string.format(self:_GetEntryForGroup("HOVER_PARAMS_IMPERIAL",Group),minheight,maxheight,htxt)
80440
80542
  end
80441
80543
  self:_SendMessage(text,10,false,Group)
80442
80544
  return self
@@ -80449,11 +80551,11 @@ local text=""
80449
80551
  if _SETTINGS:IsImperial()then
80450
80552
  local minheight=UTILS.MetersToFeet(self.FixedMinAngels)
80451
80553
  local maxheight=UTILS.MetersToFeet(self.FixedMaxAngels)
80452
- text=string.format(self.gettext:GetEntry("FLIGHT_PARAMS_IMPERIAL",self.locale),minheight,maxheight,htxt)
80554
+ text=string.format(self:_GetEntryForGroup("FLIGHT_PARAMS_IMPERIAL",Group),minheight,maxheight,htxt)
80453
80555
  else
80454
80556
  local minheight=self.FixedMinAngels
80455
80557
  local maxheight=self.FixedMaxAngels
80456
- text=string.format(self.gettext:GetEntry("FLIGHT_PARAMS_METRIC",self.locale),minheight,maxheight,htxt)
80558
+ text=string.format(self:_GetEntryForGroup("FLIGHT_PARAMS_METRIC",Group),minheight,maxheight,htxt)
80457
80559
  end
80458
80560
  self:_SendMessage(text,10,false,Group)
80459
80561
  return self
@@ -82187,6 +82289,8 @@ CRATES_DROPPED="%d crates for %s have been dropped!",
82187
82289
  BOARDED="%s boarded!",
82188
82290
  BOARDING="%s boarding!",
82189
82291
  TROOPS_RETURNED="Troops have returned to base!",
82292
+ TROOPS_LABEL="Troops",
82293
+ ENGINEERS_LABEL="Engineers",
82190
82294
  DEPLOYED_NEAR_YOU="%s have been deployed near you!",
82191
82295
  UNITS_REMOVED="%s have been removed",
82192
82296
  BUILD_STARTED="Build started, ready in %d seconds!",
@@ -82319,6 +82423,7 @@ MENU_REMOVE_CRATES="Remove crates",
82319
82423
  MENU_REMOVE_CRATES_NEARBY="Remove crates nearby",
82320
82424
  MENU_LIST_CRATES_NEARBY="List crates nearby",
82321
82425
  MENU_CRATES_NEEDED="%d crate%s %s (%dkg)",
82426
+ MENU_CRATE_SINGLE="%s (%dkg)",
82322
82427
  MENU_GET_UNITS="Get Units",
82323
82428
  MENU_REMOVE_UNITS_NEARBY="Remove units nearby",
82324
82429
  MENU_LIST_BOARDED_CARGO="List boarded cargo",
@@ -82364,6 +82469,8 @@ CRATES_DROPPED="%d Kisten für %s abgeworfen!",
82364
82469
  BOARDED="%s eingestiegen!",
82365
82470
  BOARDING="%s steigt ein!",
82366
82471
  TROOPS_RETURNED="Truppen zur Basis zurückgekehrt!",
82472
+ TROOPS_LABEL="Truppen",
82473
+ ENGINEERS_LABEL="Pioniere",
82367
82474
  DEPLOYED_NEAR_YOU="%s in Ihrer Nähe eingesetzt!",
82368
82475
  UNITS_REMOVED="%s entfernt",
82369
82476
  BUILD_STARTED="Bau gestartet, fertig in %d Sekunden!",
@@ -82496,6 +82603,7 @@ MENU_REMOVE_CRATES="Kisten entfernen",
82496
82603
  MENU_REMOVE_CRATES_NEARBY="Nahe Kisten entfernen",
82497
82604
  MENU_LIST_CRATES_NEARBY="Nahe Kisten auflisten",
82498
82605
  MENU_CRATES_NEEDED="%d Kiste%s %s (%dkg)",
82606
+ MENU_CRATE_SINGLE="%s (%dkg)",
82499
82607
  MENU_GET_UNITS="Einheiten holen",
82500
82608
  MENU_REMOVE_UNITS_NEARBY="Nahe Einheiten entfernen",
82501
82609
  MENU_LIST_BOARDED_CARGO="Geladene Fracht anzeigen",
@@ -82541,6 +82649,8 @@ CRATES_DROPPED="%d caisses pour %s larguées !",
82541
82649
  BOARDED="%s embarqué(s) !",
82542
82650
  BOARDING="%s en cours d'embarquement !",
82543
82651
  TROOPS_RETURNED="Les troupes sont retournées à la base !",
82652
+ TROOPS_LABEL="troupes",
82653
+ ENGINEERS_LABEL="sapeurs",
82544
82654
  DEPLOYED_NEAR_YOU="%s déployé(s) près de vous !",
82545
82655
  UNITS_REMOVED="%s supprimé(s)",
82546
82656
  BUILD_STARTED="Construction démarrée, prête dans %d secondes !",
@@ -82673,6 +82783,7 @@ MENU_REMOVE_CRATES="Retirer caisses",
82673
82783
  MENU_REMOVE_CRATES_NEARBY="Retirer caisses proches",
82674
82784
  MENU_LIST_CRATES_NEARBY="Lister caisses proches",
82675
82785
  MENU_CRATES_NEEDED="%d caisse%s %s (%dkg)",
82786
+ MENU_CRATE_SINGLE="%s (%dkg)",
82676
82787
  MENU_GET_UNITS="Récupérer unités",
82677
82788
  MENU_REMOVE_UNITS_NEARBY="Retirer les unités proches",
82678
82789
  MENU_LIST_BOARDED_CARGO="Lister le fret embarqué",
@@ -82718,6 +82829,8 @@ CRATES_DROPPED="%d contenedores para %s han sido entregados.",
82718
82829
  BOARDED="¡%s a bordo!",
82719
82830
  BOARDING="¡%s entrando!",
82720
82831
  TROOPS_RETURNED="¡Las tropas han vuelto a la base!",
82832
+ TROOPS_LABEL="tropas",
82833
+ ENGINEERS_LABEL="ingenieros",
82721
82834
  DEPLOYED_NEAR_YOU="%s han sido servidas cerca de tí.",
82722
82835
  UNITS_REMOVED="%s ha sido eliminado",
82723
82836
  BUILD_STARTED="Construcción comenzada, listo en %d segundos.",
@@ -82850,6 +82963,7 @@ MENU_REMOVE_CRATES="Eliminar cargas",
82850
82963
  MENU_REMOVE_CRATES_NEARBY="Eliminar cargas cercanas",
82851
82964
  MENU_LIST_CRATES_NEARBY="Listar cargas cercanas",
82852
82965
  MENU_CRATES_NEEDED="%d contenedor%s %s (%dkg)",
82966
+ MENU_CRATE_SINGLE="%s (%dkg)",
82853
82967
  MENU_GET_UNITS="Obtener unidades",
82854
82968
  MENU_REMOVE_UNITS_NEARBY="Eliminar unidades cercanas",
82855
82969
  MENU_LIST_BOARDED_CARGO="Lista de cargas a bordo",
@@ -82873,6 +82987,906 @@ STOCK_UNLIMITED="ilimitado",
82873
82987
  BUILD_YES="SI",
82874
82988
  BUILD_NO="NO",
82875
82989
  },
82990
+ ["PT-BR"]={
82991
+ CRATE_LOADED_GROUNDCREW="Caixa %s carregada pela equipe de solo!",
82992
+ CRATE_UNLOADED_GROUNDCREW="Caixa %s descarregada pela equipe de solo!",
82993
+ CRATE_LOADED_ID="Caixa ID %d para %s carregada!",
82994
+ LOADED_FULL="%d %s carregado.",
82995
+ LOADED_SETS_LEFTOVER="%d %s carregado(s), com %d caixa(s) sobrando.",
82996
+ LOADED_SETS="%d %s carregado(s).",
82997
+ LOADED_PARTIAL="Carregado apenas %d/%d caixa(s) de %s.",
82998
+ LOADED_PARTIAL_LIMIT="Carregado apenas %d/%d caixa(s) de %s. O limite de carga foi atingido!",
82999
+ LOADED_BATCH="%d %s carregado.",
83000
+ LOADED_BATCH_PARTIAL="Alguns conjuntos não puderam ser carregados completamente.",
83001
+ DROPPED_FULL="%d %s solto.",
83002
+ DROPPED_SETS_LEFTOVER="%d %s solto(s), com %d caixa(s) sobrando.",
83003
+ DROPPED_SETS="%d %s solto(s).",
83004
+ DROPPED_PARTIAL="%d/%d caixa(s) de %s solta(s).",
83005
+ DROPPED_INTO_ACTION="Unidades desembarcadas para a ação: %s!",
83006
+ DROPPED_BEACON="Baliza %s posicionada | FM %s Mhz | VHF %s KHz | UHF %s Mhz ",
83007
+ CRATES_POSITIONED="%d caixas para %s foram posicionadas perto de você!",
83008
+ CRATES_DROPPED="%d caixas para %s foram soltas!",
83009
+ BOARDED="%s embarcou!",
83010
+ BOARDING="%s embarcando!",
83011
+ TROOPS_RETURNED="As tropas retornaram à base!",
83012
+ TROOPS_LABEL="tropas",
83013
+ ENGINEERS_LABEL="engenheiros",
83014
+ DEPLOYED_NEAR_YOU="%s foram posicionados perto de você!",
83015
+ UNITS_REMOVED="%s foram removidos",
83016
+ BUILD_STARTED="Construção iniciada, pronta em %d segundos!",
83017
+ REPAIR_STARTED="Reparo iniciado usando %s, levando %d segundos",
83018
+ NO_UNIT_TO_REPAIR="Nenhuma unidade perto o suficiente para reparar!",
83019
+ CANT_REPAIR_WITH="Não é possível reparar esta unidade com %s",
83020
+ CRATES_MOVE_BEFORE_BUILD="*** As caixas precisam ser movidas antes da construção!",
83021
+ CHOPPER_CANNOT_CARRY="Desculpe, este helicóptero não pode carregar caixas!",
83022
+ TOO_HEAVY="Desculpe, isso é pesado demais para carregar!",
83023
+ FULLY_LOADED="Desculpe, estamos totalmente carregados!",
83024
+ CRAMMED="Desculpe, já estamos lotados!",
83025
+ NO_CAPACITY_NOW="Sem capacidade para carregar mais agora!",
83026
+ NO_MORE_CAPACITY="Não há mais capacidade para carregar caixas!",
83027
+ CANNOT_LOAD_NONE_OR_FULL="Não é possível carregar caixas: nenhuma encontrada ou sem capacidade restante.",
83028
+ NEED_TO_LAND_OR_HOVER_LOAD="Você precisa pousar ou pairar na posição para carregar!",
83029
+ HOVER_OVER_CRATES="Paire sobre as caixas para pegá-las!",
83030
+ LAND_OR_HOVER_OVER_CRATES="Pouse ou paire sobre as caixas para pegá-las!",
83031
+ MUST_LAND_OR_HOVER_CRATES="Você deve pousar ou pairar para carregar caixas!",
83032
+ NEED_TO_LAND_BUILD="Você precisa pousar / parar para construir algo, piloto!",
83033
+ NOT_CLOSE_ENOUGH_LOGISTICS="Você não está perto o suficiente de uma zona logística!",
83034
+ NOT_CLOSE_ENOUGH_DROP="Você não está perto o suficiente de uma zona de lançamento!",
83035
+ NOT_CLOSE_ENOUGH_ZONE_NM="Negativo, precisa estar a menos de %d nm de uma zona!",
83036
+ CANNOT_BUILD_LOADING_AREA="Você não pode construir em uma área de carregamento, piloto!",
83037
+ OPEN_DOORS_LOAD_CARGO="Você precisa abrir a(s) porta(s) para carregar carga!",
83038
+ OPEN_DOORS_LOAD_TROOPS="Você precisa abrir a(s) porta(s) para carregar tropas!",
83039
+ OPEN_DOORS_EXTRACT_TROOPS="Você precisa abrir a(s) porta(s) para extrair tropas!",
83040
+ OPEN_DOORS_UNLOAD_TROOPS="Você precisa abrir a(s) porta(s) para descarregar tropas!",
83041
+ OPEN_DOORS_DROP_CARGO="Você precisa abrir a(s) porta(s) para soltar carga!",
83042
+ ALL_GONE="Desculpe, todos os %s acabaram!",
83043
+ RAN_OUT_OF="Desculpe, ficamos sem %s",
83044
+ CARGO_NOT_AVAILABLE_ZONE="A carga solicitada não está disponível nesta zona!",
83045
+ ENOUGH_CRATES_NEARBY="Já há caixas suficientes por perto! Cuide delas primeiro!",
83046
+ NO_CRATES_WITHIN="Nenhuma caixa carregável em um raio de %d metros!",
83047
+ NO_CRATES_WITHIN_PLAIN="Nenhuma caixa em um raio de %d metros!",
83048
+ NO_CRATES_IN_RANGE="Nenhuma caixa encontrada no alcance!",
83049
+ NO_NAMED_CRATES_IN_RANGE="Nenhuma caixa \"%s\" encontrada no alcance!",
83050
+ NO_LOADABLE_CRATES="Desculpe, nenhuma caixa carregável por perto ou peso máximo de carga atingido!",
83051
+ NO_UNITS_TO_EXTRACT="Nenhuma unidade perto o suficiente para extrair!",
83052
+ NO_UNIT_CONFIG="Nenhuma configuração de unidade encontrada para %s",
83053
+ CANT_ONBOARD="Não é possível embarcar %s",
83054
+ TOO_MANY_UNITS_NEARBY="Você já tem %d unidades por perto!",
83055
+ NO_CRATE_GROUPS="Nenhum grupo de caixas encontrado para esta unidade!",
83056
+ NO_CRATE_SET="Nenhum conjunto de caixas encontrado ou índice inválido!",
83057
+ NO_CRATE_IN_SET="Nenhuma caixa encontrada nesse conjunto!",
83058
+ NO_TROOP_CHUNK="Nenhum bloco de carga de tropas encontrado para ID %d!",
83059
+ TROOP_CHUNK_EMPTY="O bloco de tropas está vazio para ID %d!",
83060
+ NOTHING_LOADED="Nada carregado!\nLimite de tropas: %d | Limite de caixas %d | Limite de peso %d kg",
83061
+ NOTHING_LOADED_AIRDROP="Nada carregado ou fora dos parâmetros de lançamento aéreo!",
83062
+ NOTHING_LOADED_HOVER="Nada carregado ou fora dos parâmetros de pairado!",
83063
+ NOTHING_IN_STOCK="Nada em estoque!",
83064
+ NOTHING_TO_PACK="Nada para empacotar nesta distância, piloto!",
83065
+ NOTHING_TO_REMOVE="Nada para remover nesta distância, piloto!",
83066
+ ROGER_ZONE="Entendido, zona %s %s!",
83067
+ 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",
83068
+ 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",
83069
+ 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",
83070
+ 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",
83071
+ REPORT_CRATES_FOUND="Caixas encontradas por perto:",
83072
+ REPORT_REMOVING_CRATES="Removendo caixas encontradas por perto:",
83073
+ REPORT_TRANSPORT_CHECKOUT="Ficha de verificação de transporte",
83074
+ REPORT_INVENTORY="Ficha de inventário",
83075
+ REPORT_BUILD_CHECKLIST="Checklist de caixas construíveis",
83076
+ REPORT_REPAIR_CHECKLIST="Checklist de reparos",
83077
+ REPORT_BEACONS="Balizas de zona ativas",
83078
+ REPORT_SECTION_TROOPS=" -- TROPAS --",
83079
+ REPORT_SECTION_CRATES=" -- CAIXAS --",
83080
+ REPORT_SECTION_CRATES_GC=" -- CAIXAS carregadas pela equipe de solo --",
83081
+ REPORT_SECTION_NONE=" N E N H U M",
83082
+ REPORT_SECTION_NONE_ALT=" --- Nada encontrado! ---",
83083
+ REPORT_SECTION_NONE_REPAIR=" --- Nada encontrado ---",
83084
+ REPORT_GC_LOADABLE_HINT="Provavelmente carregável pela equipe de solo (F8)",
83085
+ REPORT_TOTAL_MASS="Massa total: %s kg. Carregável: %s kg.",
83086
+ REPORT_TROOPS_CRATES_COUNT="Tropas: %d(%d), Caixas: %d(%d)",
83087
+ REPORT_TROOPS_CRATETYPES_COUNT="Tropas: %d, Tipos de caixas: %d",
83088
+ REPORT_ROW_TROOP="Tropa: %s tamanho %d",
83089
+ REPORT_ROW_CRATE="Caixa: %s %d/%d",
83090
+ REPORT_ROW_CRATE_SIZE1="Caixa: %s tamanho 1",
83091
+ REPORT_ROW_GC_CRATE="Caixa carregada pela equipe de solo: %s tamanho 1",
83092
+ REPORT_ROW_DROPPED_CRATE="Caixa solta para %s, %dkg",
83093
+ REPORT_ROW_CRATE_KG="Caixa para %s, %dkg",
83094
+ REPORT_ROW_CRATE_REMOVED="Caixa para %s, %dkg removida",
83095
+ REPORT_ROW_UNIT_STOCK="Unidade: %s | Soldados: %d | Estoque: %s",
83096
+ REPORT_ROW_TYPE_CRATE_STOCK="Tipo: %s | Caixas por conjunto: %d | Estoque: %s",
83097
+ REPORT_ROW_TYPE_STOCK="Tipo: %s | Estoque: %s",
83098
+ REPORT_ROW_BUILD_CHECK="Tipo: %s | Necessário %d | Encontrado %d | Pode construir %s",
83099
+ REPORT_ROW_REPAIR_CHECK="Tipo: %s | Necessário %d | Encontrado %d | Pode reparar %s",
83100
+ REPORT_ROW_BEACON=" %s | FM %s Mhz | VHF %s KHz | UHF %s Mhz ",
83101
+ WEIGHT_LIMIT="Limite de peso atingido",
83102
+ CRATE_LIMIT="Limite de caixas atingido",
83103
+ MENU_CTLD="CTLD",
83104
+ MENU_MANAGE_TROOPS="Gerenciar tropas",
83105
+ MENU_MANAGE_CRATES="Gerenciar caixas",
83106
+ MENU_MANAGE_UNITS="Gerenciar unidades",
83107
+ MENU_LOAD_TROOPS="Carregar tropas",
83108
+ MENU_DROP_TROOPS="Desembarcar tropas",
83109
+ MENU_DROP_ALL_TROOPS="Desembarcar TODAS as tropas",
83110
+ MENU_EXTRACT_TROOPS="Extrair tropas",
83111
+ MENU_DROP_N_TROOPS="Desembarcar (%d) %s",
83112
+ MENU_GET_CRATES="Solicitar caixas",
83113
+ MENU_GET="Solicitar",
83114
+ MENU_GET_AND_LOAD="Solicitar e carregar",
83115
+ MENU_GET_ANYWAY="Solicitar mesmo assim",
83116
+ MENU_PARTIALLY_LOAD="Carregar parcialmente",
83117
+ MENU_OUT_OF_STOCK="Sem estoque",
83118
+ MENU_TROOP_LIMIT="Limite de tropas atingido",
83119
+ MENU_LOAD_CRATES="Carregar caixas",
83120
+ MENU_LOAD_ALL="Carregar TUDO",
83121
+ MENU_SHOW_LOADABLE_CRATES="Mostrar caixas carregáveis",
83122
+ MENU_NO_CRATES_FOUND_RESCAN="Nenhuma caixa encontrada! Procurar novamente?",
83123
+ MENU_USE_C130_LOAD="Usar sistema de carga do C-130",
83124
+ MENU_LOAD_SINGLE="Carregar",
83125
+ MENU_DROP_CRATES="Soltar caixas",
83126
+ MENU_DROP_ALL_CRATES="Soltar TODAS as caixas",
83127
+ MENU_DROP="Soltar",
83128
+ MENU_DROP_AND_BUILD="Soltar e construir",
83129
+ MENU_DROP_N_SETS="Soltar %d conjunto%s",
83130
+ MENU_NO_CRATES_TO_DROP="Nenhuma caixa para soltar!",
83131
+ MENU_BUILD_CRATES="Construir caixas",
83132
+ MENU_REPAIR="Reparar",
83133
+ MENU_PACK_CRATES="Empacotar caixas",
83134
+ MENU_PACK="Empacotar",
83135
+ MENU_SCAN_PACKABLE_UNITS="Procurar unidades empacotáveis por perto",
83136
+ MENU_NO_PACKABLE_UNITS_FOUND_RESCAN="Nenhuma unidade empacotável encontrada! Procurar novamente?",
83137
+ MENU_PACK_ALL="Empacotar próximas",
83138
+ MENU_PACK_AND_LOAD="Empacotar e carregar",
83139
+ MENU_PACK_AND_LOAD_ALL="Empacotar e carregar próximas",
83140
+ MENU_PACK_AND_REMOVE="Empacotar e remover",
83141
+ MENU_PACK_AND_REMOVE_ALL="Empacotar e remover próximas",
83142
+ MENU_REMOVE_CRATES="Remover caixas",
83143
+ MENU_REMOVE_CRATES_NEARBY="Remover caixas próximas",
83144
+ MENU_LIST_CRATES_NEARBY="Listar caixas próximas",
83145
+ MENU_CRATES_NEEDED="%d caixa%s %s (%dkg)",
83146
+ MENU_CRATE_SINGLE="%s (%dkg)",
83147
+ MENU_GET_UNITS="Solicitar unidades",
83148
+ MENU_REMOVE_UNITS_NEARBY="Remover unidades próximas",
83149
+ MENU_LIST_BOARDED_CARGO="Listar carga embarcada",
83150
+ MENU_INVENTORY="Inventário",
83151
+ MENU_LIST_ZONE_BEACONS="Listar balizas de zona ativas",
83152
+ MENU_SMOKES_FLARES_BEACONS="Fumaças, sinalizadores, balizas",
83153
+ MENU_SMOKE_ZONES_NEARBY="Fumaça em zonas próximas",
83154
+ MENU_DROP_SMOKE_NOW="Lançar fumaça agora",
83155
+ MENU_RED_SMOKE="Fumaça vermelha",
83156
+ MENU_BLUE_SMOKE="Fumaça azul",
83157
+ MENU_GREEN_SMOKE="Fumaça verde",
83158
+ MENU_ORANGE_SMOKE="Fumaça laranja",
83159
+ MENU_WHITE_SMOKE="Fumaça branca",
83160
+ MENU_FLARE_ZONES_NEARBY="Sinalizadores em zonas próximas",
83161
+ MENU_FIRE_FLARE_NOW="Disparar sinalizador agora",
83162
+ MENU_DROP_BEACON_NOW="Posicionar baliza agora",
83163
+ MENU_SHOW_FLIGHT_PARAMS="Mostrar parâmetros de voo",
83164
+ MENU_SHOW_HOVER_PARAMS="Mostrar parâmetros de pairado",
83165
+ STOCK_NONE="nenhum",
83166
+ STOCK_UNLIMITED="ilimitado",
83167
+ BUILD_YES="SIM",
83168
+ BUILD_NO="NÃO",
83169
+ },
83170
+ TR={
83171
+ CRATE_LOADED_GROUNDCREW="%s sandığı yer ekibi tarafından yüklendi!",
83172
+ CRATE_UNLOADED_GROUNDCREW="%s sandığı yer ekibi tarafından boşaltıldı!",
83173
+ CRATE_LOADED_ID="Sandık ID %d %s için yüklendi!",
83174
+ LOADED_FULL="%d %s yüklendi.",
83175
+ LOADED_SETS_LEFTOVER="%d %s yüklendi, %d sandık kaldı.",
83176
+ LOADED_SETS="%d %s yüklendi.",
83177
+ LOADED_PARTIAL="Yalnızca %d/%d sandık %s için yüklendi.",
83178
+ LOADED_PARTIAL_LIMIT="Yalnızca %d/%d sandık %s için yüklendi. Kargo limiti artık doldu!",
83179
+ LOADED_BATCH="%d %s yüklendi.",
83180
+ LOADED_BATCH_PARTIAL="Bazı setler tamamen yüklenemedi.",
83181
+ DROPPED_FULL="%d %s bırakıldı.",
83182
+ DROPPED_SETS_LEFTOVER="%d %s bırakıldı, %d sandık kaldı.",
83183
+ DROPPED_SETS="%d %s bırakıldı.",
83184
+ DROPPED_PARTIAL="%d/%d sandık %s için bırakıldı.",
83185
+ DROPPED_INTO_ACTION="Çatışma alanına konuşlandırılanlar: %s!",
83186
+ DROPPED_BEACON="Radyo işaretçisi %s bırakıldı | FM %s Mhz | VHF %s KHz | UHF %s Mhz ",
83187
+ CRATES_POSITIONED="%d sandık %s için yakınınıza yerleştirildi!",
83188
+ CRATES_DROPPED="%d sandık %s için bırakıldı!",
83189
+ BOARDED="%s bindirildi!",
83190
+ BOARDING="%s biniyor!",
83191
+ TROOPS_RETURNED="Birlikler üsse döndü!",
83192
+ TROOPS_LABEL="birlik",
83193
+ ENGINEERS_LABEL="mühendis",
83194
+ DEPLOYED_NEAR_YOU="%s yakınınıza konuşlandırıldı!",
83195
+ UNITS_REMOVED="%s kaldırıldı",
83196
+ BUILD_STARTED="İnşa başladı, %d saniye içinde hazır!",
83197
+ REPAIR_STARTED="%s kullanılarak onarım başladı, %d saniye sürecek",
83198
+ NO_UNIT_TO_REPAIR="Onarmak için yeterince yakın bir birim yok!",
83199
+ CANT_REPAIR_WITH="Bu birim %s ile onarılamaz",
83200
+ CRATES_MOVE_BEFORE_BUILD="*** İnşa etmeden önce sandıkların taşınması gerekiyor!",
83201
+ CHOPPER_CANNOT_CARRY="Üzgünüm, bu helikopter sandık taşıyamaz!",
83202
+ TOO_HEAVY="Üzgünüm, bu yük çok ağır!",
83203
+ FULLY_LOADED="Üzgünüm, tamamen doluyuz!",
83204
+ CRAMMED="Üzgünüm, zaten tıka basa doluyuz!",
83205
+ NO_CAPACITY_NOW="Şu anda daha fazla yüklemek için kapasite yok!",
83206
+ NO_MORE_CAPACITY="Sandık yüklemek için daha fazla kapasite yok!",
83207
+ CANNOT_LOAD_NONE_OR_FULL="Sandıklar yüklenemiyor: ya hiç bulunamadı ya da kapasite kalmadı.",
83208
+ NEED_TO_LAND_OR_HOVER_LOAD="Yüklemek için inmen veya pozisyonda asılı kalman gerekiyor!",
83209
+ HOVER_OVER_CRATES="Sandıkları almak için üzerlerinde asılı kal!",
83210
+ LAND_OR_HOVER_OVER_CRATES="Sandıkları almak için in veya üzerlerinde asılı kal!",
83211
+ MUST_LAND_OR_HOVER_CRATES="Sandık yüklemek için inmen veya asılı kalman gerekiyor!",
83212
+ NEED_TO_LAND_BUILD="Bir şey inşa etmek için inmen / durman gerekiyor, pilot!",
83213
+ NOT_CLOSE_ENOUGH_LOGISTICS="Lojistik bölgesine yeterince yakın değilsin!",
83214
+ NOT_CLOSE_ENOUGH_DROP="Bırakma bölgesine yeterince yakın değilsin!",
83215
+ NOT_CLOSE_ENOUGH_ZONE_NM="Negatif, bir bölgeye %d nm'den daha yakın olmalısın!",
83216
+ CANNOT_BUILD_LOADING_AREA="Yükleme alanında inşa yapamazsın, pilot!",
83217
+ OPEN_DOORS_LOAD_CARGO="Kargo yüklemek için kapı(ları) açman gerekiyor!",
83218
+ OPEN_DOORS_LOAD_TROOPS="Birlik yüklemek için kapı(ları) açman gerekiyor!",
83219
+ OPEN_DOORS_EXTRACT_TROOPS="Birlik tahliye etmek için kapı(ları) açman gerekiyor!",
83220
+ OPEN_DOORS_UNLOAD_TROOPS="Birlik boşaltmak için kapı(ları) açman gerekiyor!",
83221
+ OPEN_DOORS_DROP_CARGO="Kargo bırakmak için kapı(ları) açman gerekiyor!",
83222
+ ALL_GONE="Üzgünüm, tüm %s bitti!",
83223
+ RAN_OUT_OF="Üzgünüm, %s tükendi",
83224
+ CARGO_NOT_AVAILABLE_ZONE="İstenen kargo bu bölgede mevcut değil!",
83225
+ ENOUGH_CRATES_NEARBY="Yakında zaten yeterince sandık var! Önce onlarla ilgilen!",
83226
+ NO_CRATES_WITHIN="%d metre içinde yüklenebilir sandık yok!",
83227
+ NO_CRATES_WITHIN_PLAIN="%d metre içinde sandık yok!",
83228
+ NO_CRATES_IN_RANGE="Menzilde sandık bulunamadı!",
83229
+ NO_NAMED_CRATES_IN_RANGE="Menzilde \"%s\" sandığı bulunamadı!",
83230
+ NO_LOADABLE_CRATES="Üzgünüm, yakında yüklenebilir sandık yok veya maksimum kargo ağırlığına ulaşıldı!",
83231
+ NO_UNITS_TO_EXTRACT="Tahliye etmek için yeterince yakın birim yok!",
83232
+ NO_UNIT_CONFIG="%s için birim yapılandırması bulunamadı",
83233
+ CANT_ONBOARD="%s bindirilemiyor",
83234
+ TOO_MANY_UNITS_NEARBY="Yakında zaten %d birimin var!",
83235
+ NO_CRATE_GROUPS="Bu birim için sandık grubu bulunamadı!",
83236
+ NO_CRATE_SET="Sandık seti bulunamadı veya indeks geçersiz!",
83237
+ NO_CRATE_IN_SET="Bu sette sandık bulunamadı!",
83238
+ NO_TROOP_CHUNK="ID %d için birlik kargo parçası bulunamadı!",
83239
+ TROOP_CHUNK_EMPTY="ID %d için birlik parçası boş!",
83240
+ NOTHING_LOADED="Hiçbir şey yüklü değil!\nBirlik limiti: %d | Sandık limiti %d | Ağırlık limiti %d kg",
83241
+ NOTHING_LOADED_AIRDROP="Hiçbir şey yüklü değil veya havadan bırakma parametreleri dahilinde değil!",
83242
+ NOTHING_LOADED_HOVER="Hiçbir şey yüklü değil veya asılı kalma parametreleri dahilinde değil!",
83243
+ NOTHING_IN_STOCK="Stokta hiçbir şey yok!",
83244
+ NOTHING_TO_PACK="Bu mesafede paketlenecek bir şey yok, pilot!",
83245
+ NOTHING_TO_REMOVE="Bu mesafede kaldırılacak bir şey yok, pilot!",
83246
+ ROGER_ZONE="Anlaşıldı, %s bölgesi %s!",
83247
+ 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",
83248
+ 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",
83249
+ FLIGHT_PARAMS_IMPERIAL="Uçuş parametreleri (havadan bırakma):\n - Minimum irtifa %dft \n - Maksimum irtifa %dft \n - Parametreler dahilinde: %s",
83250
+ FLIGHT_PARAMS_METRIC="Uçuş parametreleri (havadan bırakma):\n - Minimum irtifa %dm \n - Maksimum irtifa %dm \n - Parametreler dahilinde: %s",
83251
+ REPORT_CRATES_FOUND="Yakında bulunan sandıklar:",
83252
+ REPORT_REMOVING_CRATES="Yakında bulunan sandıklar kaldırılıyor:",
83253
+ REPORT_TRANSPORT_CHECKOUT="Taşıma kontrol formu",
83254
+ REPORT_INVENTORY="Envanter formu",
83255
+ REPORT_BUILD_CHECKLIST="İnşa edilebilir sandık kontrol listesi",
83256
+ REPORT_REPAIR_CHECKLIST="Onarım kontrol listesi",
83257
+ REPORT_BEACONS="Aktif bölge radyo işaretçileri",
83258
+ REPORT_SECTION_TROOPS=" -- BİRLİKLER --",
83259
+ REPORT_SECTION_CRATES=" -- SANDIKLAR --",
83260
+ REPORT_SECTION_CRATES_GC=" -- Yer ekibiyle yüklenen SANDIKLAR --",
83261
+ REPORT_SECTION_NONE=" Y O K",
83262
+ REPORT_SECTION_NONE_ALT=" --- Hiçbir şey bulunamadı! ---",
83263
+ REPORT_SECTION_NONE_REPAIR=" --- Hiçbir şey bulunamadı ---",
83264
+ REPORT_GC_LOADABLE_HINT="Muhtemelen yer ekibiyle yüklenebilir (F8)",
83265
+ REPORT_TOTAL_MASS="Toplam kütle: %s kg. Yüklenebilir: %s kg.",
83266
+ REPORT_TROOPS_CRATES_COUNT="Birlikler: %d(%d), Sandıklar: %d(%d)",
83267
+ REPORT_TROOPS_CRATETYPES_COUNT="Birlikler: %d, Sandık tipleri: %d",
83268
+ REPORT_ROW_TROOP="Birlik: %s boyut %d",
83269
+ REPORT_ROW_CRATE="Sandık: %s %d/%d",
83270
+ REPORT_ROW_CRATE_SIZE1="Sandık: %s boyut 1",
83271
+ REPORT_ROW_GC_CRATE="Yer ekibiyle yüklenen sandık: %s boyut 1",
83272
+ REPORT_ROW_DROPPED_CRATE="%s için bırakılan sandık, %dkg",
83273
+ REPORT_ROW_CRATE_KG="%s için sandık, %dkg",
83274
+ REPORT_ROW_CRATE_REMOVED="%s için sandık, %dkg kaldırıldı",
83275
+ REPORT_ROW_UNIT_STOCK="Birim: %s | Askerler: %d | Stok: %s",
83276
+ REPORT_ROW_TYPE_CRATE_STOCK="Tip: %s | Set başına sandık: %d | Stok: %s",
83277
+ REPORT_ROW_TYPE_STOCK="Tip: %s | Stok: %s",
83278
+ REPORT_ROW_BUILD_CHECK="Tip: %s | Gerekli %d | Bulunan %d | İnşa edilebilir %s",
83279
+ REPORT_ROW_REPAIR_CHECK="Tip: %s | Gerekli %d | Bulunan %d | Onarılabilir %s",
83280
+ REPORT_ROW_BEACON=" %s | FM %s Mhz | VHF %s KHz | UHF %s Mhz ",
83281
+ WEIGHT_LIMIT="Ağırlık limitine ulaşıldı",
83282
+ CRATE_LIMIT="Sandık limitine ulaşıldı",
83283
+ MENU_CTLD="CTLD",
83284
+ MENU_MANAGE_TROOPS="Birlikleri yönet",
83285
+ MENU_MANAGE_CRATES="Sandıkları yönet",
83286
+ MENU_MANAGE_UNITS="Birimleri yönet",
83287
+ MENU_LOAD_TROOPS="Birlik yükle",
83288
+ MENU_DROP_TROOPS="Birlik indir",
83289
+ MENU_DROP_ALL_TROOPS="TÜM birlikleri indir",
83290
+ MENU_EXTRACT_TROOPS="Birlik tahliye et",
83291
+ MENU_DROP_N_TROOPS="(%d) %s indir",
83292
+ MENU_GET_CRATES="Sandık talep et",
83293
+ MENU_GET="Talep et",
83294
+ MENU_GET_AND_LOAD="Talep et ve yükle",
83295
+ MENU_GET_ANYWAY="Yine de talep et",
83296
+ MENU_PARTIALLY_LOAD="Kısmen yükle",
83297
+ MENU_OUT_OF_STOCK="Stokta yok",
83298
+ MENU_TROOP_LIMIT="Birlik limitine ulaşıldı",
83299
+ MENU_LOAD_CRATES="Sandık yükle",
83300
+ MENU_LOAD_ALL="TÜMÜNÜ yükle",
83301
+ MENU_SHOW_LOADABLE_CRATES="Yüklenebilir sandıkları göster",
83302
+ MENU_NO_CRATES_FOUND_RESCAN="Sandık bulunamadı! Tekrar tara?",
83303
+ MENU_USE_C130_LOAD="C-130 yükleme sistemini kullan",
83304
+ MENU_LOAD_SINGLE="Yükle",
83305
+ MENU_DROP_CRATES="Sandık bırak",
83306
+ MENU_DROP_ALL_CRATES="TÜM sandıkları bırak",
83307
+ MENU_DROP="Bırak",
83308
+ MENU_DROP_AND_BUILD="Bırak ve inşa et",
83309
+ MENU_DROP_N_SETS="%d set%.0s bırak",
83310
+ MENU_NO_CRATES_TO_DROP="Bırakılacak sandık yok!",
83311
+ MENU_BUILD_CRATES="Sandıkları inşa et",
83312
+ MENU_REPAIR="Onar",
83313
+ MENU_PACK_CRATES="Sandıkları paketle",
83314
+ MENU_PACK="Paketle",
83315
+ MENU_SCAN_PACKABLE_UNITS="Yakındaki paketlenebilir birimleri tara",
83316
+ MENU_NO_PACKABLE_UNITS_FOUND_RESCAN="Paketlenebilir birim bulunamadı! Tekrar tara?",
83317
+ MENU_PACK_ALL="Yakındakileri paketle",
83318
+ MENU_PACK_AND_LOAD="Paketle ve yükle",
83319
+ MENU_PACK_AND_LOAD_ALL="Yakındakileri paketle ve yükle",
83320
+ MENU_PACK_AND_REMOVE="Paketle ve kaldır",
83321
+ MENU_PACK_AND_REMOVE_ALL="Yakındakileri paketle ve kaldır",
83322
+ MENU_REMOVE_CRATES="Sandıkları kaldır",
83323
+ MENU_REMOVE_CRATES_NEARBY="Yakındaki sandıkları kaldır",
83324
+ MENU_LIST_CRATES_NEARBY="Yakındaki sandıkları listele",
83325
+ MENU_CRATES_NEEDED="%d sandık%.0s %s (%dkg)",
83326
+ MENU_CRATE_SINGLE="%s (%dkg)",
83327
+ MENU_GET_UNITS="Birim talep et",
83328
+ MENU_REMOVE_UNITS_NEARBY="Yakındaki birimleri kaldır",
83329
+ MENU_LIST_BOARDED_CARGO="Bindirilmiş kargoyu listele",
83330
+ MENU_INVENTORY="Envanter",
83331
+ MENU_LIST_ZONE_BEACONS="Aktif bölge radyo işaretçilerini listele",
83332
+ MENU_SMOKES_FLARES_BEACONS="Dumanlar, işaret fişekleri, radyo işaretçileri",
83333
+ MENU_SMOKE_ZONES_NEARBY="Yakındaki bölgelerde duman",
83334
+ MENU_DROP_SMOKE_NOW="Şimdi duman işareti bırak",
83335
+ MENU_RED_SMOKE="Kırmızı duman",
83336
+ MENU_BLUE_SMOKE="Mavi duman",
83337
+ MENU_GREEN_SMOKE="Yeşil duman",
83338
+ MENU_ORANGE_SMOKE="Turuncu duman",
83339
+ MENU_WHITE_SMOKE="Beyaz duman",
83340
+ MENU_FLARE_ZONES_NEARBY="Yakındaki bölgelerde işaret fişekleri",
83341
+ MENU_FIRE_FLARE_NOW="Şimdi işaret fişeği ateşle",
83342
+ MENU_DROP_BEACON_NOW="Şimdi radyo işaretçisi bırak",
83343
+ MENU_SHOW_FLIGHT_PARAMS="Uçuş parametrelerini göster",
83344
+ MENU_SHOW_HOVER_PARAMS="Asılı kalma parametrelerini göster",
83345
+ STOCK_NONE="yok",
83346
+ STOCK_UNLIMITED="sınırsız",
83347
+ BUILD_YES="EVET",
83348
+ BUILD_NO="HAYIR",
83349
+ },
83350
+ RU={
83351
+ CRATE_LOADED_GROUNDCREW="Ящик %s загружен наземной службой!",
83352
+ CRATE_UNLOADED_GROUNDCREW="Ящик %s выгружен наземной службой!",
83353
+ CRATE_LOADED_ID="Ящик ID %d для %s загружен!",
83354
+ LOADED_FULL="Загружено %d %s.",
83355
+ LOADED_SETS_LEFTOVER="Загружено %d %s, осталось %d ящик(ов).",
83356
+ LOADED_SETS="Загружено %d %s.",
83357
+ LOADED_PARTIAL="Загружено только %d/%d ящик(ов) для %s.",
83358
+ LOADED_PARTIAL_LIMIT="Загружено только %d/%d ящик(ов) для %s. Достигнут лимит груза!",
83359
+ LOADED_BATCH="Загружено %d %s.",
83360
+ LOADED_BATCH_PARTIAL="Некоторые комплекты не удалось загрузить полностью.",
83361
+ DROPPED_FULL="Сброшено %d %s.",
83362
+ DROPPED_SETS_LEFTOVER="Сброшено %d %s, осталось %d ящик(ов).",
83363
+ DROPPED_SETS="Сброшено %d %s.",
83364
+ DROPPED_PARTIAL="Сброшено %d/%d ящик(ов) для %s.",
83365
+ DROPPED_INTO_ACTION="%s сброшено в бой!",
83366
+ DROPPED_BEACON="Сброшен %s | FM %s Mhz | VHF %s KHz | UHF %s Mhz ",
83367
+ CRATES_POSITIONED="%d ящик(ов) для %s размещены рядом с вами!",
83368
+ CRATES_DROPPED="%d ящик(ов) для %s сброшены!",
83369
+ BOARDED="%s на борту!",
83370
+ BOARDING="%s грузится!",
83371
+ TROOPS_RETURNED="Войска вернулись на базу!",
83372
+ TROOPS_LABEL="войска",
83373
+ ENGINEERS_LABEL="инженеры",
83374
+ DEPLOYED_NEAR_YOU="%s развернуты рядом с вами!",
83375
+ UNITS_REMOVED="%s удалены",
83376
+ BUILD_STARTED="Строительство начато, готово через %d секунд!",
83377
+ REPAIR_STARTED="Ремонт начат с использованием %s, займет %d сек",
83378
+ NO_UNIT_TO_REPAIR="Нет достаточно близкого юнита для ремонта!",
83379
+ CANT_REPAIR_WITH="Нельзя отремонтировать этот юнит с помощью %s",
83380
+ CRATES_MOVE_BEFORE_BUILD="*** Ящики нужно переместить перед строительством!",
83381
+ CHOPPER_CANNOT_CARRY="Извините, этот вертолет не может перевозить ящики!",
83382
+ TOO_HEAVY="Извините, это слишком тяжело для загрузки!",
83383
+ FULLY_LOADED="Извините, мы полностью загружены!",
83384
+ CRAMMED="Извините, у нас уже нет места!",
83385
+ NO_CAPACITY_NOW="Сейчас нет места для дополнительной загрузки!",
83386
+ NO_MORE_CAPACITY="Больше нет места для загрузки ящиков!",
83387
+ CANNOT_LOAD_NONE_OR_FULL="Нельзя загрузить ящики: ничего не найдено или нет свободной вместимости.",
83388
+ NEED_TO_LAND_OR_HOVER_LOAD="Нужно приземлиться или зависнуть на месте для загрузки!",
83389
+ HOVER_OVER_CRATES="Зависните над ящиками, чтобы подобрать их!",
83390
+ LAND_OR_HOVER_OVER_CRATES="Приземлитесь или зависните над ящиками, чтобы подобрать их!",
83391
+ MUST_LAND_OR_HOVER_CRATES="Нужно приземлиться или зависнуть, чтобы загрузить ящики!",
83392
+ NEED_TO_LAND_BUILD="Нужно приземлиться / остановиться, чтобы что-то построить, пилот!",
83393
+ NOT_CLOSE_ENOUGH_LOGISTICS="Вы недостаточно близко к логистической зоне!",
83394
+ NOT_CLOSE_ENOUGH_DROP="Вы недостаточно близко к зоне сброса!",
83395
+ NOT_CLOSE_ENOUGH_ZONE_NM="Отказ, нужно быть ближе чем %d nm к зоне!",
83396
+ CANNOT_BUILD_LOADING_AREA="Нельзя строить в зоне погрузки, пилот!",
83397
+ OPEN_DOORS_LOAD_CARGO="Нужно открыть дверь(и), чтобы загрузить груз!",
83398
+ OPEN_DOORS_LOAD_TROOPS="Нужно открыть дверь(и), чтобы загрузить войска!",
83399
+ OPEN_DOORS_EXTRACT_TROOPS="Нужно открыть дверь(и), чтобы эвакуировать войска!",
83400
+ OPEN_DOORS_UNLOAD_TROOPS="Нужно открыть дверь(и), чтобы выгрузить войска!",
83401
+ OPEN_DOORS_DROP_CARGO="Нужно открыть дверь(и), чтобы сбросить груз!",
83402
+ ALL_GONE="Извините, все %s закончились!",
83403
+ RAN_OUT_OF="Извините, у нас закончились %s",
83404
+ CARGO_NOT_AVAILABLE_ZONE="Запрошенный груз недоступен в этой зоне!",
83405
+ ENOUGH_CRATES_NEARBY="Рядом уже достаточно ящиков! Сначала разберитесь с ними!",
83406
+ NO_CRATES_WITHIN="Нет загружаемых ящиков в пределах %d метров!",
83407
+ NO_CRATES_WITHIN_PLAIN="Нет ящиков в пределах %d метров!",
83408
+ NO_CRATES_IN_RANGE="Ящики в радиусе не найдены!",
83409
+ NO_NAMED_CRATES_IN_RANGE="Ящики «%s» в радиусе не найдены!",
83410
+ NO_LOADABLE_CRATES="Извините, рядом нет загружаемых ящиков или достигнут максимальный вес груза!",
83411
+ NO_UNITS_TO_EXTRACT="Нет достаточно близких юнитов для эвакуации!",
83412
+ NO_UNIT_CONFIG="Конфигурация юнита для %s не найдена",
83413
+ CANT_ONBOARD="Нельзя взять на борт %s",
83414
+ TOO_MANY_UNITS_NEARBY="У вас уже есть %d юнитов поблизости!",
83415
+ NO_CRATE_GROUPS="Группы ящиков для этого юнита не найдены!",
83416
+ NO_CRATE_SET="Набор ящиков не найден или индекс недействителен!",
83417
+ NO_CRATE_IN_SET="Ящик в этом наборе не найден!",
83418
+ NO_TROOP_CHUNK="Часть войскового груза с ID %d не найдена!",
83419
+ TROOP_CHUNK_EMPTY="Часть войскового груза с ID %d пуста!",
83420
+ NOTHING_LOADED="Ничего не загружено!\nЛимит войск: %d | Лимит ящиков %d | Лимит веса %d кг",
83421
+ NOTHING_LOADED_AIRDROP="Ничего не загружено или параметры воздушного сброса не соблюдены!",
83422
+ NOTHING_LOADED_HOVER="Ничего не загружено или висение вне допустимых параметров!",
83423
+ NOTHING_IN_STOCK="На складе ничего нет!",
83424
+ NOTHING_TO_PACK="На этой дистанции нечего упаковывать, пилот!",
83425
+ NOTHING_TO_REMOVE="На этой дистанции нечего удалять, пилот!",
83426
+ ROGER_ZONE="Принято, зона %s %s!",
83427
+ HOVER_PARAMS_METRIC="Параметры висения (автозагрузка/сброс):\n - Мин. высота %dм \n - Макс. высота %dм \n - Макс. скорость 2м/с \n - В параметрах: %s",
83428
+ HOVER_PARAMS_IMPERIAL="Параметры висения (автозагрузка/сброс):\n - Мин. высота %dфт \n - Макс. высота %dфт \n - Макс. скорость 6фт/с \n - В параметрах: %s",
83429
+ FLIGHT_PARAMS_IMPERIAL="Параметры полета (воздушный сброс):\n - Мин. высота %dфт \n - Макс. высота %dфт \n - В параметрах: %s",
83430
+ FLIGHT_PARAMS_METRIC="Параметры полета (воздушный сброс):\n - Мин. высота %dм \n - Макс. высота %dм \n - В параметрах: %s",
83431
+ REPORT_CRATES_FOUND="Ящики поблизости:",
83432
+ REPORT_REMOVING_CRATES="Удаление найденных поблизости ящиков:",
83433
+ REPORT_TRANSPORT_CHECKOUT="Транспортная ведомость",
83434
+ REPORT_INVENTORY="Инвентарная ведомость",
83435
+ REPORT_BUILD_CHECKLIST="Чек-лист строящихся ящиков",
83436
+ REPORT_REPAIR_CHECKLIST="Чек-лист ремонта",
83437
+ REPORT_BEACONS="Активные маяки зон",
83438
+ REPORT_SECTION_TROOPS=" -- ВОЙСКА --",
83439
+ REPORT_SECTION_CRATES=" -- ЯЩИКИ --",
83440
+ REPORT_SECTION_CRATES_GC=" -- ЯЩИКИ загружены наземной службой --",
83441
+ REPORT_SECTION_NONE=" Н Е Т",
83442
+ REPORT_SECTION_NONE_ALT=" --- Ничего не найдено! ---",
83443
+ REPORT_SECTION_NONE_REPAIR=" --- Ничего не найдено ---",
83444
+ REPORT_GC_LOADABLE_HINT="Вероятно, можно загрузить наземной службой (F8)",
83445
+ REPORT_TOTAL_MASS="Общая масса: %s кг. Можно загрузить: %s кг.",
83446
+ REPORT_TROOPS_CRATES_COUNT="Войска: %d(%d), Ящики: %d(%d)",
83447
+ REPORT_TROOPS_CRATETYPES_COUNT="Войска: %d, Типы ящиков: %d",
83448
+ REPORT_ROW_TROOP="Войска: %s размер %d",
83449
+ REPORT_ROW_CRATE="Ящик: %s %d/%d",
83450
+ REPORT_ROW_CRATE_SIZE1="Ящик: %s размер 1",
83451
+ REPORT_ROW_GC_CRATE="Ящик загружен НС: %s размер 1",
83452
+ REPORT_ROW_DROPPED_CRATE="Сброшен ящик для %s, %dкг",
83453
+ REPORT_ROW_CRATE_KG="Ящик для %s, %dкг",
83454
+ REPORT_ROW_CRATE_REMOVED="Ящик для %s, %dкг удален",
83455
+ REPORT_ROW_UNIT_STOCK="Юнит: %s | Солдаты: %d | Запас: %s",
83456
+ REPORT_ROW_TYPE_CRATE_STOCK="Тип: %s | Ящиков на комплект: %d | Запас: %s",
83457
+ REPORT_ROW_TYPE_STOCK="Тип: %s | Запас: %s",
83458
+ REPORT_ROW_BUILD_CHECK="Тип: %s | Требуется %d | Найдено %d | Можно строить %s",
83459
+ REPORT_ROW_REPAIR_CHECK="Тип: %s | Требуется %d | Найдено %d | Можно ремонтировать %s",
83460
+ REPORT_ROW_BEACON=" %s | FM %s Mhz | VHF %s KHz | UHF %s Mhz ",
83461
+ WEIGHT_LIMIT="Достигнут лимит веса",
83462
+ CRATE_LIMIT="Достигнут лимит ящиков",
83463
+ MENU_CTLD="CTLD",
83464
+ MENU_MANAGE_TROOPS="Управление войсками",
83465
+ MENU_MANAGE_CRATES="Управление ящиками",
83466
+ MENU_MANAGE_UNITS="Управление юнитами",
83467
+ MENU_LOAD_TROOPS="Загрузить войска",
83468
+ MENU_DROP_TROOPS="Высадить войска",
83469
+ MENU_DROP_ALL_TROOPS="Высадить ВСЕ войска",
83470
+ MENU_EXTRACT_TROOPS="Эвакуировать войска",
83471
+ MENU_DROP_N_TROOPS="Высадить (%d) %s",
83472
+ MENU_GET_CRATES="Получить ящики",
83473
+ MENU_GET="Получить",
83474
+ MENU_GET_AND_LOAD="Получить и загрузить",
83475
+ MENU_GET_ANYWAY="Все равно получить",
83476
+ MENU_PARTIALLY_LOAD="Частично загрузить",
83477
+ MENU_OUT_OF_STOCK="Нет в наличии",
83478
+ MENU_TROOP_LIMIT="Достигнут лимит войск",
83479
+ MENU_LOAD_CRATES="Загрузить ящики",
83480
+ MENU_LOAD_ALL="Загрузить ВСЕ",
83481
+ MENU_SHOW_LOADABLE_CRATES="Показать загружаемые ящики",
83482
+ MENU_NO_CRATES_FOUND_RESCAN="Ящики не найдены! Сканировать снова?",
83483
+ MENU_USE_C130_LOAD="Использовать систему загрузки C-130",
83484
+ MENU_LOAD_SINGLE="Загрузить",
83485
+ MENU_DROP_CRATES="Сбросить ящики",
83486
+ MENU_DROP_ALL_CRATES="Сбросить ВСЕ ящики",
83487
+ MENU_DROP="Сбросить",
83488
+ MENU_DROP_AND_BUILD="Сбросить и построить",
83489
+ MENU_DROP_N_SETS="Сбросить %d комплект%s",
83490
+ MENU_NO_CRATES_TO_DROP="Нет ящиков для сброса!",
83491
+ MENU_BUILD_CRATES="Построить из ящиков",
83492
+ MENU_REPAIR="Ремонт",
83493
+ MENU_PACK_CRATES="Упаковать ящики",
83494
+ MENU_PACK="Упаковать",
83495
+ MENU_SCAN_PACKABLE_UNITS="Сканировать упаковываемые юниты поблизости",
83496
+ MENU_NO_PACKABLE_UNITS_FOUND_RESCAN="Упаковываемые юниты не найдены! Сканировать снова?",
83497
+ MENU_PACK_ALL="Упаковать поблизости",
83498
+ MENU_PACK_AND_LOAD="Упаковать и загрузить",
83499
+ MENU_PACK_AND_LOAD_ALL="Упаковать и загрузить поблизости",
83500
+ MENU_PACK_AND_REMOVE="Упаковать и удалить",
83501
+ MENU_PACK_AND_REMOVE_ALL="Упаковать и удалить поблизости",
83502
+ MENU_REMOVE_CRATES="Удалить ящики",
83503
+ MENU_REMOVE_CRATES_NEARBY="Удалить ящики поблизости",
83504
+ MENU_LIST_CRATES_NEARBY="Список ящиков поблизости",
83505
+ MENU_CRATES_NEEDED="%d ящик%s %s (%dкг)",
83506
+ MENU_CRATE_SINGLE="%s (%dкг)",
83507
+ MENU_GET_UNITS="Получить юниты",
83508
+ MENU_REMOVE_UNITS_NEARBY="Удалить юниты поблизости",
83509
+ MENU_LIST_BOARDED_CARGO="Список груза на борту",
83510
+ MENU_INVENTORY="Инвентарь",
83511
+ MENU_LIST_ZONE_BEACONS="Список активных маяков зон",
83512
+ MENU_SMOKES_FLARES_BEACONS="Дымы, ракеты, маяки",
83513
+ MENU_SMOKE_ZONES_NEARBY="Дым в ближайших зонах",
83514
+ MENU_DROP_SMOKE_NOW="Сбросить дым сейчас",
83515
+ MENU_RED_SMOKE="Красный дым",
83516
+ MENU_BLUE_SMOKE="Синий дым",
83517
+ MENU_GREEN_SMOKE="Зеленый дым",
83518
+ MENU_ORANGE_SMOKE="Оранжевый дым",
83519
+ MENU_WHITE_SMOKE="Белый дым",
83520
+ MENU_FLARE_ZONES_NEARBY="Ракеты в ближайших зонах",
83521
+ MENU_FIRE_FLARE_NOW="Выпустить ракету сейчас",
83522
+ MENU_DROP_BEACON_NOW="Сбросить маяк сейчас",
83523
+ MENU_SHOW_FLIGHT_PARAMS="Показать параметры полета",
83524
+ MENU_SHOW_HOVER_PARAMS="Показать параметры висения",
83525
+ STOCK_NONE="нет",
83526
+ STOCK_UNLIMITED="без ограничений",
83527
+ BUILD_YES="ДА",
83528
+ BUILD_NO="НЕТ",
83529
+ },
83530
+ ["zh-TW"]={
83531
+ CRATE_LOADED_GROUNDCREW="地勤已裝載貨箱 %s!",
83532
+ CRATE_UNLOADED_GROUNDCREW="地勤已卸載貨箱 %s!",
83533
+ CRATE_LOADED_ID="貨箱 ID %d(%s)已裝載!",
83534
+ LOADED_FULL="已裝載 %d 個 %s。",
83535
+ LOADED_SETS_LEFTOVER="已裝載 %d 組 %s,剩餘 %d 個貨箱。",
83536
+ LOADED_SETS="已裝載 %d 組 %s。",
83537
+ LOADED_PARTIAL="僅裝載 %d/%d 個 %s 的貨箱。",
83538
+ LOADED_PARTIAL_LIMIT="僅裝載 %d/%d 個 %s 的貨箱,已達載運上限!",
83539
+ LOADED_BATCH="已裝載 %d 個 %s。",
83540
+ LOADED_BATCH_PARTIAL="部分組合無法完全裝載。",
83541
+ DROPPED_FULL="已投放 %d 個 %s。",
83542
+ DROPPED_SETS_LEFTOVER="已投放 %d 組 %s,剩餘 %d 個貨箱。",
83543
+ DROPPED_SETS="已投放 %d 組 %s。",
83544
+ DROPPED_PARTIAL="已投放 %d/%d 個 %s 的貨箱。",
83545
+ DROPPED_INTO_ACTION="已將 %s 投入作戰!",
83546
+ DROPPED_BEACON="已投放 %s | FM %s MHz | VHF %s KHz | UHF %s MHz ",
83547
+ CRATES_POSITIONED="已在你附近部署 %d 個 %s 貨箱!",
83548
+ CRATES_DROPPED="已投放 %d 個 %s 貨箱!",
83549
+ BOARDED="%s 已登機!",
83550
+ BOARDING="%s 正在登機!",
83551
+ TROOPS_RETURNED="部隊已返回基地!",
83552
+ TROOPS_LABEL="部隊",
83553
+ ENGINEERS_LABEL="工程兵",
83554
+ DEPLOYED_NEAR_YOU="%s 已在你附近部署!",
83555
+ UNITS_REMOVED="%s 已移除",
83556
+ BUILD_STARTED="建設開始,將於%d 秒後完成!",
83557
+ REPAIR_STARTED="使用 %s 開始維修,需時 %d 秒",
83558
+ NO_UNIT_TO_REPAIR="附近沒有可維修單位!",
83559
+ CANT_REPAIR_WITH="無法使用 %s 維修此單位",
83560
+ CRATES_MOVE_BEFORE_BUILD="*** 建設前需先移動貨箱!",
83561
+ CHOPPER_CANNOT_CARRY="此直升機無法運載貨箱!",
83562
+ TOO_HEAVY="重量過重,無法裝載!",
83563
+ FULLY_LOADED="已達滿載!",
83564
+ CRAMMED="空間已滿!",
83565
+ NO_CAPACITY_NOW="目前無法再裝載!",
83566
+ NO_MORE_CAPACITY="已無空間裝載貨箱!",
83567
+ CANNOT_LOAD_NONE_OR_FULL="無法裝載貨箱:未找到或已無容量。",
83568
+ NEED_TO_LAND_OR_HOVER_LOAD="需降落或穩定懸停才能裝載!",
83569
+ HOVER_OVER_CRATES="請懸停於貨箱上方進行拾取!",
83570
+ LAND_OR_HOVER_OVER_CRATES="請降落或懸停於貨箱上方進行拾取!",
83571
+ MUST_LAND_OR_HOVER_CRATES="必須降落或懸停才能裝載貨箱!",
83572
+ NEED_TO_LAND_BUILD="飛行員,需降落或停止才能建設!",
83573
+ NOT_CLOSE_ENOUGH_LOGISTICS="距離後勤區域過遠!",
83574
+ NOT_CLOSE_ENOUGH_DROP="距離投放區域過遠!",
83575
+ NOT_CLOSE_ENOUGH_ZONE_NM="距離區域需小於 %d 海浬!",
83576
+ CANNOT_BUILD_LOADING_AREA="無法在裝載區域進行建設!",
83577
+ OPEN_DOORS_LOAD_CARGO="需開啟艙門才能裝載貨物!",
83578
+ OPEN_DOORS_LOAD_TROOPS="需開啟艙門才能裝載部隊!",
83579
+ OPEN_DOORS_EXTRACT_TROOPS="需開啟艙門才能撤離部隊!",
83580
+ OPEN_DOORS_UNLOAD_TROOPS="需開啟艙門才能卸載部隊!",
83581
+ OPEN_DOORS_DROP_CARGO="需開啟艙門才能投放貨物!",
83582
+ ALL_GONE="%s 已全部耗盡!",
83583
+ RAN_OUT_OF="%s 已用盡",
83584
+ CARGO_NOT_AVAILABLE_ZONE="此區域無法取得該貨物!",
83585
+ ENOUGH_CRATES_NEARBY="附近已有足夠貨箱,請先處理現有貨箱!",
83586
+ NO_CRATES_WITHIN="%d 公尺內沒有可裝載貨箱!",
83587
+ NO_CRATES_WITHIN_PLAIN="%d 公尺內沒有貨箱!",
83588
+ NO_CRATES_IN_RANGE="範圍內未發現貨箱!",
83589
+ NO_NAMED_CRATES_IN_RANGE="範圍內未發現「%s」貨箱!",
83590
+ NO_LOADABLE_CRATES="附近沒有可裝載貨箱或已達重量上限!",
83591
+ NO_UNITS_TO_EXTRACT="附近沒有可撤離單位!",
83592
+ NO_UNIT_CONFIG="未找到 %s 的單位設定",
83593
+ CANT_ONBOARD="無法登載 %s",
83594
+ TOO_MANY_UNITS_NEARBY="附近已有 %d 個單位!",
83595
+ NO_CRATE_GROUPS="未找到此單位的貨箱群組!",
83596
+ NO_CRATE_SET="未找到貨箱組或索引無效!",
83597
+ NO_CRATE_IN_SET="該組中沒有貨箱!",
83598
+ NO_TROOP_CHUNK="未找到 ID %d 的部隊資料!",
83599
+ TROOP_CHUNK_EMPTY="ID %d 的部隊資料為空!",
83600
+ NOTHING_LOADED="未裝載任何內容!\n部隊上限:%d | 貨箱上限 %d | 重量上限 %d 公斤",
83601
+ NOTHING_LOADED_AIRDROP="未裝載或不符合空投條件!",
83602
+ NOTHING_LOADED_HOVER="未裝載或未達懸停條件!",
83603
+ NOTHING_IN_STOCK="庫存為空!",
83604
+ NOTHING_TO_PACK="此距離內無可打包目標!",
83605
+ NOTHING_TO_REMOVE="此距離內無可移除目標!",
83606
+ ROGER_ZONE="收到,%s 區域 %s!",
83607
+ HOVER_PARAMS_METRIC="懸停參數(自動裝載/投放):\n - 最低高度 %d 公尺 \n - 最高高度 %d 公尺 \n - 最大速度 2 公尺/秒 \n - 是否符合:%s",
83608
+ HOVER_PARAMS_IMPERIAL="懸停參數(自動裝載/投放):\n - 最低高度 %d 英尺 \n - 最高高度 %d 英尺 \n - 最大速度 6 英尺/秒 \n - 是否符合:%s",
83609
+ FLIGHT_PARAMS_IMPERIAL="飛行參數(空投):\n - 最低高度 %d 英尺 \n - 最高高度 %d 英尺 \n - 是否符合:%s",
83610
+ FLIGHT_PARAMS_METRIC="飛行參數(空投):\n - 最低高度 %d 公尺 \n - 最高高度 %d 公尺 \n - 是否符合:%s",
83611
+ REPORT_CRATES_FOUND="附近發現貨箱:",
83612
+ REPORT_REMOVING_CRATES="移除附近貨箱:",
83613
+ REPORT_TRANSPORT_CHECKOUT="運輸檢查表",
83614
+ REPORT_INVENTORY="庫存報表",
83615
+ REPORT_BUILD_CHECKLIST="建設檢查清單",
83616
+ REPORT_REPAIR_CHECKLIST="維修檢查清單",
83617
+ REPORT_BEACONS="區域信標狀態",
83618
+ REPORT_SECTION_TROOPS=" -- 部隊 --",
83619
+ REPORT_SECTION_CRATES=" -- 貨箱 --",
83620
+ REPORT_SECTION_CRATES_GC=" -- 地勤裝載貨箱 --",
83621
+ REPORT_SECTION_NONE=" 無",
83622
+ REPORT_SECTION_NONE_ALT=" --- 未發現 ---",
83623
+ REPORT_SECTION_NONE_REPAIR=" --- 未發現 ---",
83624
+ REPORT_GC_LOADABLE_HINT="可能可由地勤裝載(F8)",
83625
+ REPORT_TOTAL_MASS="總重量:%s 公斤,可裝載:%s 公斤",
83626
+ REPORT_TROOPS_CRATES_COUNT="部隊:%d(%d),貨箱:%d(%d)",
83627
+ REPORT_TROOPS_CRATETYPES_COUNT="部隊:%d,貨箱種類:%d",
83628
+ REPORT_ROW_TROOP="部隊:%s 人數 %d",
83629
+ REPORT_ROW_CRATE="貨箱:%s %d/%d",
83630
+ REPORT_ROW_CRATE_SIZE1="貨箱:%s 尺寸 1",
83631
+ REPORT_ROW_GC_CRATE="地勤裝載貨箱:%s 尺寸 1",
83632
+ REPORT_ROW_DROPPED_CRATE="已投放 %s 貨箱,%d 公斤",
83633
+ REPORT_ROW_CRATE_KG="%s 貨箱,%d 公斤",
83634
+ REPORT_ROW_CRATE_REMOVED="%s 貨箱,%d 公斤 已移除",
83635
+ REPORT_ROW_UNIT_STOCK="單位:%s | 士兵:%d | 庫存:%s",
83636
+ REPORT_ROW_TYPE_CRATE_STOCK="類型:%s | 每組貨箱:%d | 庫存:%s",
83637
+ REPORT_ROW_TYPE_STOCK="類型:%s | 庫存:%s",
83638
+ REPORT_ROW_BUILD_CHECK="類型:%s | 需求 %d | 已有 %d | 可建設 %s",
83639
+ REPORT_ROW_REPAIR_CHECK="類型:%s | 需求 %d | 已有 %d | 可維修 %s",
83640
+ REPORT_ROW_BEACON=" %s | FM %s MHz | VHF %s KHz | UHF %s MHz ",
83641
+ WEIGHT_LIMIT="已達重量上限",
83642
+ CRATE_LIMIT="已達貨箱上限",
83643
+ MENU_CTLD="後勤管理(CTLD)",
83644
+ MENU_MANAGE_TROOPS="部隊管理",
83645
+ MENU_MANAGE_CRATES="貨箱管理",
83646
+ MENU_MANAGE_UNITS="單位管理",
83647
+ MENU_LOAD_TROOPS="裝載部隊",
83648
+ MENU_DROP_TROOPS="投放部隊",
83649
+ MENU_DROP_ALL_TROOPS="投放全部部隊",
83650
+ MENU_EXTRACT_TROOPS="撤離部隊",
83651
+ MENU_DROP_N_TROOPS="投放 (%d) %s",
83652
+ MENU_GET_CRATES="取得貨箱",
83653
+ MENU_GET="取得",
83654
+ MENU_GET_AND_LOAD="取得並裝載",
83655
+ MENU_GET_ANYWAY="強制取得",
83656
+ MENU_PARTIALLY_LOAD="部分裝載",
83657
+ MENU_OUT_OF_STOCK="無庫存",
83658
+ MENU_TROOP_LIMIT="已達部隊上限",
83659
+ MENU_LOAD_CRATES="裝載貨箱",
83660
+ MENU_LOAD_ALL="全部裝載",
83661
+ MENU_SHOW_LOADABLE_CRATES="顯示可裝載貨箱",
83662
+ MENU_NO_CRATES_FOUND_RESCAN="未發現貨箱,重新掃描?",
83663
+ MENU_USE_C130_LOAD="使用 C-130 裝載系統",
83664
+ MENU_LOAD_SINGLE="裝載",
83665
+ MENU_DROP_CRATES="投放貨箱",
83666
+ MENU_DROP_ALL_CRATES="投放全部貨箱",
83667
+ MENU_DROP="投放",
83668
+ MENU_DROP_AND_BUILD="投放並建設",
83669
+ MENU_DROP_N_SETS="投放 %d 組%s",
83670
+ MENU_NO_CRATES_TO_DROP="沒有可投放貨箱",
83671
+ MENU_BUILD_CRATES="建設貨箱",
83672
+ MENU_REPAIR="維修",
83673
+ MENU_PACK_CRATES="打包貨箱",
83674
+ MENU_PACK="打包",
83675
+ MENU_SCAN_PACKABLE_UNITS="掃描可打包單位",
83676
+ MENU_NO_PACKABLE_UNITS_FOUND_RESCAN="未發現可打包單位,重新掃描?",
83677
+ MENU_PACK_ALL="打包附近",
83678
+ MENU_PACK_AND_LOAD="打包並裝載",
83679
+ MENU_PACK_AND_LOAD_ALL="打包並裝載附近",
83680
+ MENU_PACK_AND_REMOVE="打包並移除",
83681
+ MENU_PACK_AND_REMOVE_ALL="打包並移除附近",
83682
+ MENU_REMOVE_CRATES="移除貨箱",
83683
+ MENU_REMOVE_CRATES_NEARBY="移除附近貨箱",
83684
+ MENU_LIST_CRATES_NEARBY="列出附近貨箱",
83685
+ MENU_CRATES_NEEDED="%d 個貨箱%s %s(%d 公斤)",
83686
+ MENU_CRATE_SINGLE="%s(%d 公斤)",
83687
+ MENU_GET_UNITS="取得單位",
83688
+ MENU_REMOVE_UNITS_NEARBY="移除附近單位",
83689
+ MENU_LIST_BOARDED_CARGO="查看已裝載貨物",
83690
+ MENU_INVENTORY="庫存",
83691
+ MENU_LIST_ZONE_BEACONS="列出區域信標",
83692
+ MENU_SMOKES_FLARES_BEACONS="煙霧、照明彈、信標",
83693
+ MENU_SMOKE_ZONES_NEARBY="標記附近區域",
83694
+ MENU_DROP_SMOKE_NOW="立即投放煙霧",
83695
+ MENU_RED_SMOKE="紅色煙霧",
83696
+ MENU_BLUE_SMOKE="藍色煙霧",
83697
+ MENU_GREEN_SMOKE="綠色煙霧",
83698
+ MENU_ORANGE_SMOKE="橙色煙霧",
83699
+ MENU_WHITE_SMOKE="白色煙霧",
83700
+ MENU_FLARE_ZONES_NEARBY="標記附近區域(照明彈)",
83701
+ MENU_FIRE_FLARE_NOW="立即發射照明彈",
83702
+ MENU_DROP_BEACON_NOW="立即投放信標",
83703
+ MENU_SHOW_FLIGHT_PARAMS="顯示飛行參數",
83704
+ MENU_SHOW_HOVER_PARAMS="顯示懸停參數",
83705
+ STOCK_NONE="無",
83706
+ STOCK_UNLIMITED="無限制",
83707
+ BUILD_YES="是",
83708
+ BUILD_NO="否",
83709
+ },
83710
+ ["zh-CN"]={
83711
+ CRATE_LOADED_GROUNDCREW="地勤已装载货箱 %s!",
83712
+ CRATE_UNLOADED_GROUNDCREW="地勤已卸载货箱 %s!",
83713
+ CRATE_LOADED_ID="货箱 ID %d(%s)已装载!",
83714
+ LOADED_FULL="已装载 %d 个 %s。",
83715
+ LOADED_SETS_LEFTOVER="已装载 %d 组 %s,剩余 %d 个货箱。",
83716
+ LOADED_SETS="已装载 %d 组 %s。",
83717
+ LOADED_PARTIAL="仅装载 %d/%d 个 %s 的货箱。",
83718
+ LOADED_PARTIAL_LIMIT="仅装载 %d/%d 个 %s 的货箱,已达到载重上限!",
83719
+ LOADED_BATCH="已装载 %d 个 %s。",
83720
+ LOADED_BATCH_PARTIAL="部分组合未能完整装载。",
83721
+ DROPPED_FULL="已投放 %d 个 %s。",
83722
+ DROPPED_SETS_LEFTOVER="已投放 %d 组 %s,剩余 %d 个货箱。",
83723
+ DROPPED_SETS="已投放 %d 组 %s。",
83724
+ DROPPED_PARTIAL="已投放 %d/%d 个 %s 的货箱。",
83725
+ DROPPED_INTO_ACTION="已将 %s 投入作战!",
83726
+ DROPPED_BEACON="已投放 %s | FM %s MHz | VHF %s KHz | UHF %s MHz ",
83727
+ CRATES_POSITIONED="已在你附近部署 %d 个 %s 货箱!",
83728
+ CRATES_DROPPED="已投放 %d 个 %s 货箱!",
83729
+ BOARDED="%s 已登机!",
83730
+ BOARDING="%s 正在登机!",
83731
+ TROOPS_RETURNED="部队已返回基地!",
83732
+ TROOPS_LABEL="部队",
83733
+ ENGINEERS_LABEL="工兵",
83734
+ DEPLOYED_NEAR_YOU="%s 已在你附近部署!",
83735
+ UNITS_REMOVED="%s 已移除",
83736
+ BUILD_STARTED="开始建造,%d 秒后完成!",
83737
+ REPAIR_STARTED="使用 %s 开始维修,耗时 %d 秒",
83738
+ NO_UNIT_TO_REPAIR="附近没有可维修单位!",
83739
+ CANT_REPAIR_WITH="无法使用 %s 修复该单位",
83740
+ CRATES_MOVE_BEFORE_BUILD="*** 建造前请先移动货箱!",
83741
+ CHOPPER_CANNOT_CARRY="该直升机无法运输货箱!",
83742
+ TOO_HEAVY="重量超限,无法装载!",
83743
+ FULLY_LOADED="已满载!",
83744
+ CRAMMED="空间已满!",
83745
+ NO_CAPACITY_NOW="当前无法继续装载!",
83746
+ NO_MORE_CAPACITY="没有剩余空间可装载货箱!",
83747
+ CANNOT_LOAD_NONE_OR_FULL="无法装载货箱:未找到或已满载。",
83748
+ NEED_TO_LAND_OR_HOVER_LOAD="需要降落或稳定悬停才能装载!",
83749
+ HOVER_OVER_CRATES="请在货箱上方悬停进行拾取!",
83750
+ LAND_OR_HOVER_OVER_CRATES="请降落或在货箱上方悬停进行拾取!",
83751
+ MUST_LAND_OR_HOVER_CRATES="必须降落或悬停才能装载货箱!",
83752
+ NEED_TO_LAND_BUILD="飞行员,请降落或停止后再建造!",
83753
+ NOT_CLOSE_ENOUGH_LOGISTICS="距离后勤区域过远!",
83754
+ NOT_CLOSE_ENOUGH_DROP="距离投放区域过远!",
83755
+ NOT_CLOSE_ENOUGH_ZONE_NM="距离区域必须小于 %d 海里!",
83756
+ CANNOT_BUILD_LOADING_AREA="无法在装载区域建造!",
83757
+ OPEN_DOORS_LOAD_CARGO="需要打开舱门才能装载货物!",
83758
+ OPEN_DOORS_LOAD_TROOPS="需要打开舱门才能装载部队!",
83759
+ OPEN_DOORS_EXTRACT_TROOPS="需要打开舱门才能撤离部队!",
83760
+ OPEN_DOORS_UNLOAD_TROOPS="需要打开舱门才能卸载部队!",
83761
+ OPEN_DOORS_DROP_CARGO="需要打开舱门才能投放货物!",
83762
+ ALL_GONE="%s 已全部耗尽!",
83763
+ RAN_OUT_OF="%s 已用完",
83764
+ CARGO_NOT_AVAILABLE_ZONE="该区域无法获取此类货物!",
83765
+ ENOUGH_CRATES_NEARBY="附近已有足够货箱,请先处理现有货箱!",
83766
+ NO_CRATES_WITHIN="%d 米内没有可装载货箱!",
83767
+ NO_CRATES_WITHIN_PLAIN="%d 米内没有货箱!",
83768
+ NO_CRATES_IN_RANGE="范围内未发现货箱!",
83769
+ NO_NAMED_CRATES_IN_RANGE="范围内未发现“%s”货箱!",
83770
+ NO_LOADABLE_CRATES="附近没有可装载货箱或已超重!",
83771
+ NO_UNITS_TO_EXTRACT="附近没有可撤离单位!",
83772
+ NO_UNIT_CONFIG="未找到 %s 的单位配置",
83773
+ CANT_ONBOARD="无法装载 %s",
83774
+ TOO_MANY_UNITS_NEARBY="附近已有 %d 个单位!",
83775
+ NO_CRATE_GROUPS="未找到该单位对应的货箱组!",
83776
+ NO_CRATE_SET="未找到货箱组或索引无效!",
83777
+ NO_CRATE_IN_SET="该组中没有货箱!",
83778
+ NO_TROOP_CHUNK="未找到 ID %d 的部队数据!",
83779
+ TROOP_CHUNK_EMPTY="ID %d 的部队数据为空!",
83780
+ NOTHING_LOADED="未装载任何内容!\n部队上限:%d | 货箱上限 %d | 重量上限 %d 公斤",
83781
+ NOTHING_LOADED_AIRDROP="未装载或不满足空投条件!",
83782
+ NOTHING_LOADED_HOVER="未装载或未满足悬停条件!",
83783
+ NOTHING_IN_STOCK="库存为空!",
83784
+ NOTHING_TO_PACK="该范围内没有可打包目标!",
83785
+ NOTHING_TO_REMOVE="该范围内没有可移除目标!",
83786
+ ROGER_ZONE="收到,%s 区域 %s!",
83787
+ HOVER_PARAMS_METRIC="悬停参数(自动装载/投放):\n - 最低高度 %d 米 \n - 最高高度 %d 米 \n - 最大速度 2 米/秒 \n - 是否符合条件:%s",
83788
+ HOVER_PARAMS_IMPERIAL="悬停参数(自动装载/投放):\n - 最低高度 %d 英尺 \n - 最高高度 %d 英尺 \n - 最大速度 6 英尺/秒 \n - 是否符合条件:%s",
83789
+ FLIGHT_PARAMS_IMPERIAL="飞行参数(空投):\n - 最低高度 %d 英尺 \n - 最高高度 %d 英尺 \n - 是否符合条件:%s",
83790
+ FLIGHT_PARAMS_METRIC="飞行参数(空投):\n - 最低高度 %d 米 \n - 最高高度 %d 米 \n - 是否符合条件:%s",
83791
+ REPORT_CRATES_FOUND="附近发现货箱:",
83792
+ REPORT_REMOVING_CRATES="删除附近货箱:",
83793
+ REPORT_TRANSPORT_CHECKOUT="运输检查表",
83794
+ REPORT_INVENTORY="库存报表",
83795
+ REPORT_BUILD_CHECKLIST="建造检查清单",
83796
+ REPORT_REPAIR_CHECKLIST="维修检查清单",
83797
+ REPORT_BEACONS="区域信标状态",
83798
+ REPORT_SECTION_TROOPS=" -- 部队 --",
83799
+ REPORT_SECTION_CRATES=" -- 货箱 --",
83800
+ REPORT_SECTION_CRATES_GC=" -- 地勤装载货箱 --",
83801
+ REPORT_SECTION_NONE=" 无",
83802
+ REPORT_SECTION_NONE_ALT=" --- 未发现 ---",
83803
+ REPORT_SECTION_NONE_REPAIR=" --- 未发现 ---",
83804
+ REPORT_GC_LOADABLE_HINT="可能可由地勤装载(F8)",
83805
+ REPORT_TOTAL_MASS="总重量:%s 公斤,可装载:%s 公斤",
83806
+ REPORT_TROOPS_CRATES_COUNT="部队:%d(%d),货箱:%d(%d)",
83807
+ REPORT_TROOPS_CRATETYPES_COUNT="部队:%d,货箱种类:%d",
83808
+ REPORT_ROW_TROOP="部队:%s 人数 %d",
83809
+ REPORT_ROW_CRATE="货箱:%s %d/%d",
83810
+ REPORT_ROW_CRATE_SIZE1="货箱:%s 尺寸 1",
83811
+ REPORT_ROW_GC_CRATE="地勤装载货箱:%s 尺寸 1",
83812
+ REPORT_ROW_DROPPED_CRATE="已投放 %s 货箱,%d 公斤",
83813
+ REPORT_ROW_CRATE_KG="%s 货箱,%d 公斤",
83814
+ REPORT_ROW_CRATE_REMOVED="%s 货箱,%d 公斤 已移除",
83815
+ REPORT_ROW_UNIT_STOCK="单位:%s | 士兵:%d | 库存:%s",
83816
+ REPORT_ROW_TYPE_CRATE_STOCK="类型:%s | 每组货箱:%d | 库存:%s",
83817
+ REPORT_ROW_TYPE_STOCK="类型:%s | 库存:%s",
83818
+ REPORT_ROW_BUILD_CHECK="类型:%s | 需求 %d | 已有 %d | 可建造 %s",
83819
+ REPORT_ROW_REPAIR_CHECK="类型:%s | 需求 %d | 已有 %d | 可维修 %s",
83820
+ REPORT_ROW_BEACON=" %s | FM %s MHz | VHF %s KHz | UHF %s MHz ",
83821
+ WEIGHT_LIMIT="已达重量上限",
83822
+ CRATE_LIMIT="已达货箱上限",
83823
+ MENU_CTLD="后勤系统(CTLD)",
83824
+ MENU_MANAGE_TROOPS="部队管理",
83825
+ MENU_MANAGE_CRATES="货箱管理",
83826
+ MENU_MANAGE_UNITS="单位管理",
83827
+ MENU_LOAD_TROOPS="装载部队",
83828
+ MENU_DROP_TROOPS="投放部队",
83829
+ MENU_DROP_ALL_TROOPS="投放全部部队",
83830
+ MENU_EXTRACT_TROOPS="撤离部队",
83831
+ MENU_DROP_N_TROOPS="投放 (%d) %s",
83832
+ MENU_GET_CRATES="获取货箱",
83833
+ MENU_GET="获取",
83834
+ MENU_GET_AND_LOAD="获取并装载",
83835
+ MENU_GET_ANYWAY="强制获取",
83836
+ MENU_PARTIALLY_LOAD="部分装载",
83837
+ MENU_OUT_OF_STOCK="无库存",
83838
+ MENU_TROOP_LIMIT="已达部队上限",
83839
+ MENU_LOAD_CRATES="装载货箱",
83840
+ MENU_LOAD_ALL="全部装载",
83841
+ MENU_SHOW_LOADABLE_CRATES="显示可装载货箱",
83842
+ MENU_NO_CRATES_FOUND_RESCAN="未检测到货箱,是否重新扫描?",
83843
+ MENU_USE_C130_LOAD="使用 C-130 装载系统",
83844
+ MENU_LOAD_SINGLE="装载",
83845
+ MENU_DROP_CRATES="投放货箱",
83846
+ MENU_DROP_ALL_CRATES="投放全部货箱",
83847
+ MENU_DROP="投放",
83848
+ MENU_DROP_AND_BUILD="投放并建造",
83849
+ MENU_DROP_N_SETS="投放 %d 组%s",
83850
+ MENU_NO_CRATES_TO_DROP="无可投放货箱",
83851
+ MENU_BUILD_CRATES="建造货箱",
83852
+ MENU_REPAIR="维修",
83853
+ MENU_PACK_CRATES="打包货箱",
83854
+ MENU_PACK="打包",
83855
+ MENU_SCAN_PACKABLE_UNITS="扫描可打包单位",
83856
+ MENU_NO_PACKABLE_UNITS_FOUND_RESCAN="未发现可打包单位,重新扫描?",
83857
+ MENU_PACK_ALL="打包附近单位",
83858
+ MENU_PACK_AND_LOAD="打包并装载",
83859
+ MENU_PACK_AND_LOAD_ALL="打包并装载附近",
83860
+ MENU_PACK_AND_REMOVE="打包并移除",
83861
+ MENU_PACK_AND_REMOVE_ALL="打包并移除附近",
83862
+ MENU_REMOVE_CRATES="移除货箱",
83863
+ MENU_REMOVE_CRATES_NEARBY="删除附近货箱",
83864
+ MENU_LIST_CRATES_NEARBY="显示附近货箱",
83865
+ MENU_CRATES_NEEDED="%d 个货箱%s %s(%d 公斤)",
83866
+ MENU_CRATE_SINGLE="%s(%d 公斤)",
83867
+ MENU_GET_UNITS="获取单位",
83868
+ MENU_REMOVE_UNITS_NEARBY="移除附近单位",
83869
+ MENU_LIST_BOARDED_CARGO="查看已装载货物",
83870
+ MENU_INVENTORY="库存",
83871
+ MENU_LIST_ZONE_BEACONS="显示区域信标",
83872
+ MENU_SMOKES_FLARES_BEACONS="烟雾、照明弹、信标",
83873
+ MENU_SMOKE_ZONES_NEARBY="标记附近区域",
83874
+ MENU_DROP_SMOKE_NOW="立即释放烟雾",
83875
+ MENU_RED_SMOKE="红色烟雾",
83876
+ MENU_BLUE_SMOKE="蓝色烟雾",
83877
+ MENU_GREEN_SMOKE="绿色烟雾",
83878
+ MENU_ORANGE_SMOKE="橙色烟雾",
83879
+ MENU_WHITE_SMOKE="白色烟雾",
83880
+ MENU_FLARE_ZONES_NEARBY="标记附近区域(照明弹)",
83881
+ MENU_FIRE_FLARE_NOW="立即发射照明弹",
83882
+ MENU_DROP_BEACON_NOW="立即投放信标",
83883
+ MENU_SHOW_FLIGHT_PARAMS="显示飞行参数",
83884
+ MENU_SHOW_HOVER_PARAMS="显示悬停参数",
83885
+ STOCK_NONE="无",
83886
+ STOCK_UNLIMITED="无限制",
83887
+ BUILD_YES="是",
83888
+ BUILD_NO="否",
83889
+ },
82876
83890
  }
82877
83891
  do
82878
83892
  CTLD_HERCULES={
@@ -83474,6 +84488,9 @@ CSAR.AircraftType["OH58D"]=2
83474
84488
  CSAR.AircraftType["CH-47Fbl1"]=31
83475
84489
  CSAR.AircraftType["AH-6J"]=2
83476
84490
  CSAR.AircraftType["MH-6J"]=2
84491
+ CSAR.AircraftType["Ka-50_3"]=0
84492
+ CSAR.AircraftType["Ka-50"]=0
84493
+ CSAR.AircraftType["AV8BNA"]=0
83477
84494
  CSAR.version="1.1.39"
83478
84495
  function CSAR:New(Coalition,Template,Alias)
83479
84496
  local self=BASE:Inherit(self,FSM:New())
@@ -84828,11 +85845,14 @@ for _key,_group in pairs(_allHeliGroups)do
84828
85845
  local _unit=_group:GetFirstUnitAlive()
84829
85846
  if _unit then
84830
85847
  if _unit:IsAlive()and _unit:IsPlayer()then
85848
+ local _maxUnits=self.AircraftType[_unit:GetTypeName()]
85849
+ if _maxUnits==nil or _maxUnits>0 then
84831
85850
  local unitName=_unit:GetName()
84832
85851
  _UnitList[unitName]=unitName
84833
85852
  end
84834
85853
  end
84835
85854
  end
85855
+ end
84836
85856
  self.csarUnits=_UnitList
84837
85857
  for _,_unitName in pairs(self.csarUnits)do
84838
85858
  local _unit=self:_GetSARHeli(_unitName)
@@ -89995,7 +91015,7 @@ local ScanUnitSet=self.engageZone:GetScannedSetUnit()
89995
91015
  local SeadUnitSet=SET_UNIT:New()
89996
91016
  for _,_unit in pairs(ScanUnitSet.Set)do
89997
91017
  local unit=_unit
89998
- if unit and unit:IsAlive()and unit:HasSEAD()then
91018
+ if unit and unit:IsAlive()and unit.HasSEAD and unit:HasSEAD()then
89999
91019
  self:T("Adding UNIT for SEAD: "..unit:GetName())
90000
91020
  local task=CONTROLLABLE.TaskAttackUnit(nil,unit,GroupAttack,AI.Task.WeaponExpend.ALL,1,Direction,self.engageAltitude,2956984318)
90001
91021
  table.insert(DCStasks,task)
@@ -123551,7 +124571,7 @@ TARS_SESSION={}
123551
124571
  TARS_SESSION.debug=false
123552
124572
  TARS_SESSION.debugunitsearch=false
123553
124573
  TARS={}
123554
- TARS.version="v2.2.2"
124574
+ TARS.version="v2.3.1"
123555
124575
  TARS.locale=TARS.locale or"en"
123556
124576
  TARS.debug=false
123557
124577
  TARS.mooseScoring=true
@@ -123559,7 +124579,8 @@ TARS.valueScoring=100
123559
124579
  TARS.landingDelay=30
123560
124580
  TARS.debriefDelay=60
123561
124581
  TARS.landingDistance=2500
123562
- TARS._vAltMin=10
124582
+ TARS.PilotParameterHelper=false
124583
+ TARS._vAltMin=100
123563
124584
  TARS._vRangeMin=TARS._vAltMin*20
123564
124585
  TARS._vAltOpti=500
123565
124586
  TARS._vRangeOpti=TARS._vAltOpti*5
@@ -123593,22 +124614,22 @@ TARS.reconTypes={
123593
124614
  ["OH-6A"]=true,
123594
124615
  }
123595
124616
  TARS.parameters={}
123596
- TARS.parameters["F-4E-45MC"]={minAlt=100,maxAlt=6096,maxRoll=10,maxPitch=15,fov=23,duration=120,offset=math.rad(60),name="RF-4E with KS-87 Forward Oblique Camera"}
123597
- TARS.parameters["MiG-21Bis"]={minAlt=500,maxAlt=5000,maxRoll=10,maxPitch=15,fov=52,duration=140,offset=math.rad(10),name="MiG-21R with Day recce pod"}
123598
- TARS.parameters["AJS37"]={minAlt=15,maxAlt=1524,maxRoll=10,maxPitch=15,fov=25,duration=120,offset=math.rad(10),name="SF 37"}
123599
- TARS.parameters["Mirage-F1EE"]={minAlt=1524,maxAlt=4572,maxRoll=10,maxPitch=15,fov=20,duration=588,offset=math.rad(10),name="Mirage-F1CR with Omera 33"}
123600
- TARS.parameters["F-5E-3"]={minAlt=762,maxAlt=7620,maxRoll=15,maxPitch=15,fov=70,duration=300,offset=math.rad(40),name="F-5E Tigereye"}
123601
- TARS.parameters["F-14A-135-GR"]={minAlt=750,maxAlt=5000,maxRoll=10,maxPitch=20,fov=14,duration=400,offset=math.rad(45),name="F-14A TARPS KS-87D"}
123602
- TARS.parameters["F-14B"]={minAlt=228,maxAlt=1524,maxRoll=10,maxPitch=20,fov=85,duration=80,offset=math.rad(10),name="F-14B TARPS KA-99A"}
123603
- TARS.parameters["TF-51D"]={minAlt=250,maxAlt=5500,maxRoll=15,maxPitch=15,fov=60,duration=400,offset=math.rad(10),name="TF-51D Mustang RF-51D Photo Recon"}
123604
- TARS.parameters["P-51D"]={minAlt=250,maxAlt=5500,maxRoll=15,maxPitch=15,fov=60,duration=400,offset=math.rad(10),name="P-51D Mustang F-6D Photo Recon"}
123605
- TARS.parameters["P-51D-30-NA"]={minAlt=250,maxAlt=6000,maxRoll=15,maxPitch=15,fov=60,duration=400,offset=math.rad(10),name="P-51D-30 Mustang F-6D Photo Recon"}
123606
- TARS.parameters["SpitfireLFMkIX"]={minAlt=150,maxAlt=5000,maxRoll=15,maxPitch=15,fov=55,duration=350,offset=math.rad(10),name="Spitfire LF Mk IX PR Recon"}
123607
- TARS.parameters["FW-190A8"]={minAlt=200,maxAlt=5500,maxRoll=15,maxPitch=15,fov=60,duration=350,offset=math.rad(10),name="FW-190 A-8 Tactical Recon"}
123608
- TARS.parameters["FW-190D9"]={minAlt=250,maxAlt=6000,maxRoll=15,maxPitch=15,fov=60,duration=350,offset=math.rad(10),name="FW-190 D-9 Tactical Recon"}
123609
- TARS.parameters["SA342M"]={minAlt=20,maxAlt=1000,maxRoll=35,maxPitch=25,fov=18,duration=350,offset=math.rad(10),name="SA342M EO/IR LIGHT RECO"}
123610
- TARS.parameters["SA342L"]={minAlt=20,maxAlt=1000,maxRoll=35,maxPitch=25,fov=18,duration=350,offset=math.rad(10),name="SA342L EO/IR LIGHT RECO"}
123611
- TARS.parameters["OH58D"]={minAlt=30,maxAlt=1200,maxRoll=35,maxPitch=25,fov=12,duration=350,offset=math.rad(12),name="OH-58D MMS EO/IR RECO"}
124617
+ TARS.parameters["F-4E-45MC"]={minAlt=100,maxAlt=8000,maxRoll=10,maxPitch=15,fov=23,duration=120,offset=math.rad(40),overlap=0.25,min_interval=3,name="RF-4E with KS-87 Forward Oblique Camera"}
124618
+ TARS.parameters["MiG-21Bis"]={minAlt=500,maxAlt=8000,maxRoll=10,maxPitch=15,fov=52,duration=140,offset=math.rad(40),overlap=0.25,min_interval=3,name="MiG-21R with Day recce pod"}
124619
+ TARS.parameters["AJS37"]={minAlt=15,maxAlt=8000,maxRoll=10,maxPitch=15,fov=25,duration=120,offset=math.rad(40),overlap=0.25,min_interval=3,name="SF 37"}
124620
+ TARS.parameters["Mirage-F1EE"]={minAlt=1524,maxAlt=8000,maxRoll=10,maxPitch=15,fov=20,duration=400,offset=math.rad(40),overlap=0.25,min_interval=3,name="Mirage-F1CR with Omera 33"}
124621
+ TARS.parameters["F-5E-3"]={minAlt=762,maxAlt=8000,maxRoll=15,maxPitch=15,fov=70,duration=300,offset=math.rad(40),overlap=0.25,min_interval=3,name="F-5E Tigereye"}
124622
+ TARS.parameters["F-14A-135-GR"]={minAlt=750,maxAlt=8000,maxRoll=10,maxPitch=20,fov=14,duration=400,offset=math.rad(45),overlap=0.25,min_interval=3,name="F-14A TARPS KS-87D"}
124623
+ TARS.parameters["F-14B"]={minAlt=228,maxAlt=8000,maxRoll=10,maxPitch=20,fov=85,duration=400,offset=math.rad(40),overlap=0.25,min_interval=3,name="F-14B TARPS KA-99A"}
124624
+ TARS.parameters["TF-51D"]={minAlt=250,maxAlt=2500,maxRoll=15,maxPitch=15,fov=60,duration=400,offset=math.rad(10),overlap=0.5,min_interval=5,name="TF-51D Mustang RF-51D Photo Recon"}
124625
+ TARS.parameters["P-51D"]={minAlt=250,maxAlt=2500,maxRoll=15,maxPitch=15,fov=60,duration=400,offset=math.rad(10),overlap=0.5,min_interval=5,name="P-51D Mustang F-6D Photo Recon"}
124626
+ TARS.parameters["P-51D-30-NA"]={minAlt=250,maxAlt=2500,maxRoll=15,maxPitch=15,fov=60,duration=400,offset=math.rad(10),overlap=0.5,min_interval=5,name="P-51D-30 Mustang F-6D Photo Recon"}
124627
+ TARS.parameters["SpitfireLFMkIX"]={minAlt=150,maxAlt=2500,maxRoll=15,maxPitch=15,fov=55,duration=350,offset=math.rad(10),overlap=0.5,min_interval=5,name="Spitfire LF Mk IX PR Recon"}
124628
+ TARS.parameters["FW-190A8"]={minAlt=200,maxAlt=2500,maxRoll=15,maxPitch=15,fov=60,duration=350,offset=math.rad(10),overlap=0.5,min_interval=5,name="FW-190 A-8 Tactical Recon"}
124629
+ TARS.parameters["FW-190D9"]={minAlt=250,maxAlt=2500,maxRoll=15,maxPitch=15,fov=60,duration=350,offset=math.rad(10),overlap=0.5,min_interval=5,name="FW-190 D-9 Tactical Recon"}
124630
+ TARS.parameters["SA342M"]={minAlt=20,maxAlt=1000,maxRoll=35,maxPitch=25,fov=18,duration=350,offset=math.rad(10),overlap=0.5,min_interval=5,name="SA342M EO/IR LIGHT RECO"}
124631
+ TARS.parameters["SA342L"]={minAlt=20,maxAlt=1000,maxRoll=35,maxPitch=25,fov=18,duration=350,offset=math.rad(10),overlap=0.5,min_interval=5,name="SA342L EO/IR LIGHT RECO"}
124632
+ TARS.parameters["OH58D"]={minAlt=30,maxAlt=1200,maxRoll=35,maxPitch=25,fov=12,duration=350,offset=math.rad(12),overlap=0.5,min_interval=5,name="OH-58D MMS EO/IR RECO"}
123612
124633
  TARS.parameters["UH-1H"]={maxRoll=50,maxPitch=45,duration=900,offset=math.rad(6),name="UH-1H VISUAL/CREW RECO",minAlt=TARS._vAltMin,minRange=TARS._vRangeMin,optimalAlt=TARS._vAltOpti,optimalRange=TARS._vRangeOpti,maxAlt=TARS._vAltMax,maxRange=TARS._vRangeMax}
123613
124634
  TARS.parameters["Mi-8MT"]={maxRoll=50,maxPitch=45,duration=900,offset=math.rad(6),name="Mi-8MT VISUAL/CREW RECO",minAlt=TARS._vAltMin,minRange=TARS._vRangeMin,optimalAlt=TARS._vAltOpti,optimalRange=TARS._vRangeOpti,maxAlt=TARS._vAltMax,maxRange=TARS._vRangeMax}
123614
124635
  TARS.parameters["MH-6J"]={maxRoll=50,maxPitch=45,duration=900,offset=math.rad(6),name="MH-6J VISUAL CLOSE RECO",minAlt=TARS._vAltMin,minRange=TARS._vRangeMin,optimalAlt=TARS._vAltOpti,optimalRange=TARS._vRangeOpti,maxAlt=TARS._vAltMax,maxRange=TARS._vRangeMax}
@@ -123632,7 +124653,7 @@ TARS.scoring=nil
123632
124653
  TARS.locale="en"
123633
124654
  TARS.Messages={
123634
124655
  en={
123635
- TARS_FILM_START="[TARS] Session capture activated. Film remaining: %d seconds.",
124656
+ TARS_FILM_START="[TARS] Capture activated. Expositions remaining: %d",
123636
124657
  TARS_FILM_EXHAUSTED="[TARS] Film exhausted. Return to base for debrief.",
123637
124658
  TARS_FILM_STOP="[TARS] Session capture ended. Return to base for debrief.",
123638
124659
  TARS_FILM_TIME_UP="[TARS] Film time exhausted. Return to base.",
@@ -123640,12 +124661,12 @@ TARS_FILM_CAP_REACHED="[TARS] Maximum captures reached (%d). Return to base for
123640
124661
  TARS_FILM_STB_MANUAL="[TARS] <>Manual<> Film manual STB.",
123641
124662
  TARS_FILM_RESUME_MANUAL="[TARS] <>Manual<> Film manual resume.",
123642
124663
  TARS_FILM_STB_LAND="[TARS] <>Landing<> Film auto STB.",
123643
- TARS_FILM_RESUME_TO="[TARS] <>TakeOff<> Film auto resume. %d seconds",
124664
+ TARS_FILM_RESUME_TO="[TARS] <>TakeOff<> Film auto resume. %d expositions",
123644
124665
  TARS_FILM_STB_LOCKED="[TARS] Film is STB — takeoff to resume.",
123645
124666
  TARS_FILM_ALREADY_ACTIVE="[TARS] Film already active.",
123646
124667
  TARS_FILM_NO_CAPTURE="[TARS] No active film.",
123647
124668
  TARS_FILM_NO_CAPTURE_STOP="[TARS] No active film to stop.",
123648
- TARS_CAPTURE_TICK="FILM DURATION: %d seconds",
124669
+ TARS_CAPTURE_TICK="EXPOSITIONS REMAINING: %d",
123649
124670
  TARS_CAPTURE_HIT="[TARS] +1 Captured target (%d total)",
123650
124671
  TARS_CAPTURE_HIT_MAX="[TARS] +1 Captured target (%d total) / %d max",
123651
124672
  TARS_SESSION_ENDED="[TARS] Session ended. Return to base for debrief.",
@@ -123679,7 +124700,7 @@ TARS_MENU_STB="TARS mode : Standby & Resume",
123679
124700
  TARS_MENU_STOP="TARS mode : Stop filming",
123680
124701
  },
123681
124702
  de={
123682
- TARS_FILM_START="[TARS] Aufnahme aktiviert. Verbleibender Film: %d Sekunden.",
124703
+ TARS_FILM_START="[TARS] Aufnahme aktiviert. Verbleibende Aufnahmen: %d.",
123683
124704
  TARS_FILM_EXHAUSTED="[TARS] Film aufgebraucht. Kehren Sie zur Basis für das Briefing zurück.",
123684
124705
  TARS_FILM_STOP="[TARS] Aufnahmesitzung beendet. Kehren Sie zur Basis zurück.",
123685
124706
  TARS_FILM_TIME_UP="[TARS] Filmzeit abgelaufen. Kehren Sie zur Basis zurück.",
@@ -123687,12 +124708,12 @@ TARS_FILM_CAP_REACHED="[TARS] Maximale Aufnahmen erreicht (%d). Kehren Sie zur B
123687
124708
  TARS_FILM_STB_MANUAL="[TARS] <>Manuell<> Film manuell auf Standby.",
123688
124709
  TARS_FILM_RESUME_MANUAL="[TARS] <>Manuell<> Film manuell fortgesetzt.",
123689
124710
  TARS_FILM_STB_LAND="[TARS] <>Landung<> Film automatisch auf Standby.",
123690
- TARS_FILM_RESUME_TO="[TARS] <>Start<> Film automatisch fortgesetzt. %d Sekunden.",
124711
+ TARS_FILM_RESUME_TO="[TARS] <>Takeoff<> Film fortgesetzt. %d Aufnahmen.",
123691
124712
  TARS_FILM_STB_LOCKED="[TARS] Film ist auf Standby — starten Sie, um fortzufahren.",
123692
124713
  TARS_FILM_ALREADY_ACTIVE="[TARS] Aufnahme bereits aktiv.",
123693
124714
  TARS_FILM_NO_CAPTURE="[TARS] Keine aktive Aufnahme.",
123694
124715
  TARS_FILM_NO_CAPTURE_STOP="[TARS] Keine aktive Aufnahme zum Stoppen.",
123695
- TARS_CAPTURE_TICK="AUFNAHMEDAUER: %d Sekunden",
124716
+ TARS_CAPTURE_TICK="Verbleibende Aufnahmen: %d.",
123696
124717
  TARS_CAPTURE_HIT="[TARS] +1 Ziel erfasst (%d gesamt)",
123697
124718
  TARS_CAPTURE_HIT_MAX="[TARS] +1 Ziel erfasst (%d gesamt) / %d max",
123698
124719
  TARS_SESSION_ENDED="[TARS] Sitzung beendet. Kehren Sie zur Basis für das Briefing zurück.",
@@ -123726,7 +124747,7 @@ TARS_MENU_STB="TARS Modus : Standby & Fortsetzen",
123726
124747
  TARS_MENU_STOP="TARS Modus : Aufnahme stoppen",
123727
124748
  },
123728
124749
  fr={
123729
- TARS_FILM_START="[TARS] Session de capture activée. Film restant : %d seconds",
124750
+ TARS_FILM_START="[TARS] Capture activée. Expositions restantes : %d",
123730
124751
  TARS_FILM_EXHAUSTED="[TARS] Film épuisé. Retournez à la base pour le compte-rendu.",
123731
124752
  TARS_FILM_STOP="[TARS] Session de capture terminée. Retournez à la base.",
123732
124753
  TARS_FILM_TIME_UP="[TARS] Temps de film épuisé. Retournez à la base.",
@@ -123734,12 +124755,12 @@ TARS_FILM_CAP_REACHED="[TARS] Nombre maximum de captures atteint (%d). Retournez
123734
124755
  TARS_FILM_STB_MANUAL="[TARS] <>Manuel<> Film en STB manuel.",
123735
124756
  TARS_FILM_RESUME_MANUAL="[TARS] <>Manuel<> Reprise manuel du film.",
123736
124757
  TARS_FILM_STB_LAND="[TARS] <>Atterrissage<> Film en STB automatique.",
123737
- TARS_FILM_RESUME_TO="[TARS] <>Décollage<> Reprise automatique du film. %d seconds",
124758
+ TARS_FILM_RESUME_TO="[TARS] <>Décollage<> Film repris. %d expositions",
123738
124759
  TARS_FILM_STB_LOCKED="[TARS] Film en STB — décollez pour reprendre.",
123739
124760
  TARS_FILM_ALREADY_ACTIVE="[TARS] Film déjà activé.",
123740
124761
  TARS_FILM_NO_CAPTURE="[TARS] Aucun film activé.",
123741
124762
  TARS_FILM_NO_CAPTURE_STOP="[TARS] Aucun film actif à stopper.",
123742
- TARS_CAPTURE_TICK="DURÉE DU FILM : %d seconds",
124763
+ TARS_CAPTURE_TICK="[TARS] EXPOSITIONS RESTANTES : %d",
123743
124764
  TARS_CAPTURE_HIT="[TARS] +1 Cible capturée (%d au total)",
123744
124765
  TARS_CAPTURE_HIT_MAX="[TARS] +1 Cible capturée (%d au total) / %d max",
123745
124766
  TARS_SESSION_ENDED="[TARS] Session terminée. Retournez à la base pour le debriefing.",
@@ -123830,8 +124851,9 @@ function TARS_SESSION:New(unit,Callback)
123830
124851
  local self=BASE:Inherit(self,BASE:New())
123831
124852
  self.lid=string.format("TARS_SESSION %s | ",TARS.version)
123832
124853
  self.Callback=Callback
124854
+ self.PilotParameterHelper=Callback.PilotParameterHelper
123833
124855
  self:SetObjectParams(unit)
123834
- self:I("TARS_SESSION created — unit="..tostring(self.objectName)
124856
+ self:T("TARS_SESSION created — unit="..tostring(self.objectName)
123835
124857
  .." type="..tostring(self.type))
123836
124858
  return self
123837
124859
  end
@@ -123887,7 +124909,7 @@ end
123887
124909
  self.capturing=true
123888
124910
  self.loop=true
123889
124911
  self.standby=false
123890
- self:I("FILM START — film="..self.duration.."s")
124912
+ self:T("FILM START — film="..self.duration.."s")
123891
124913
  self.Callback:_MsgUnit(
123892
124914
  self.Callback:_Txt("TARS_FILM_START",self.duration),5,self.playerName)
123893
124915
  timer.scheduleFunction(TARS_SESSION.CaptureLoop,self,timer.getTime()+2)
@@ -123922,37 +124944,51 @@ end
123922
124944
  snap.playername=self.playerName
123923
124945
  return snap
123924
124946
  end
123925
- function TARS_SESSION:_OffsetCalc(unit,params)
124947
+ function TARS_SESSION:_OffsetCalc(unit,params,center_shift)
124948
+ center_shift=center_shift or 0
123926
124949
  local pos=unit:GetPosition()
123927
124950
  local vec3=unit:GetVec3()
123928
- local rad=math.atan2(pos.x.z,pos.x.x)+2*math.pi
123929
124951
  local MSL=land.getHeight({x=vec3.x,y=vec3.z})
123930
124952
  local alt=vec3.y-MSL
123931
- local dist=math.tan(params.offset)*alt
123932
- return{x=vec3.x+math.cos(rad)*dist,z=vec3.z+math.sin(rad)*dist}
124953
+ local rad=math.atan2(pos.x.x,pos.x.z)
124954
+ local dist=(alt/math.tan(params.offset))+center_shift
124955
+ return{
124956
+ x=vec3.x+math.sin(rad)*dist,
124957
+ z=vec3.z+math.cos(rad)*dist,
124958
+ MSL=MSL,
124959
+ alt=alt,
124960
+ rad=rad,
124961
+ }
123933
124962
  end
123934
124963
  function TARS_SESSION:_ValidateObjectFound(_Object)
123935
- self:I(self.lid.."_ValidateObjectFound "..tostring(_Object:GetName()))
124964
+ self:T(self.lid.."_ValidateObjectFound "..tostring(_Object:GetName()))
123936
124965
  if not(_Object and _Object:IsAlive())then return false end
123937
124966
  if _Object:GetCoalition()==self.coa then return false end
123938
124967
  if self.Callback.targetNameFilter.enabled then
123939
124968
  local keywords=self.Callback.targetNameFilter.keywords[_Object:GetCoalition()]
123940
124969
  local targetName=string.lower(_Object:GetName()or"")
124970
+ local targetGroup
124971
+ local targetGroupName
124972
+ if _Object:IsInstanceOf("UNIT")then
124973
+ targetGroup=_Object:GetGroup()
124974
+ if targetGroup then targetGroupName=string.lower(targetGroup:GetName())end
124975
+ end
123941
124976
  if type(keywords)=="string"then keywords={keywords}end
123942
124977
  local matched=false
123943
124978
  for _,kw in pairs(keywords or{})do
123944
124979
  if string.find(targetName,string.lower(kw))then matched=true;break end
124980
+ if targetGroupName and string.find(targetName,string.lower(kw))then matched=true;break end
123945
124981
  end
123946
124982
  if not matched then return false end
123947
124983
  end
123948
124984
  local typeName=_Object:GetTypeName()
123949
124985
  local typeNameLower=string.lower(typeName)
123950
124986
  local objCat=_Object:GetCategory()
123951
- self:I(self.lid.."_ValidateObjectFound Name Filter Passed!")
124987
+ self:T(self.lid.."_ValidateObjectFound Name Filter Passed!")
123952
124988
  if objCat==Object.Category.UNIT then
123953
124989
  local desc=_Object:GetDesc()
123954
124990
  local unitCat=desc and desc.category
123955
- self:I(self.lid.."_ValidateObjectFound Name Category Check "..tostring(unitCat))
124991
+ self:T(self.lid.."_ValidateObjectFound Name Category Check "..tostring(unitCat))
123956
124992
  if unitCat==Unit.Category.AIRPLANE or unitCat==Unit.Category.HELICOPTER then
123957
124993
  return self.Callback.units.air
123958
124994
  elseif unitCat==Unit.Category.GROUND_UNIT then
@@ -123981,10 +125017,12 @@ timer.scheduleFunction(TARS_SESSION.CaptureLoop,self,timer.getTime()+10)
123981
125017
  return
123982
125018
  end
123983
125019
  if self.capturing and self.duration>0 then
123984
- self.duration=self.duration-10
125020
+ local params=self.Callback.parameters[self.type]
125021
+ local interval=self:_CalcInterval(self.unit,params)
125022
+ self.duration=self.duration-1
123985
125023
  self.Callback:_MsgUnit(
123986
- self.Callback:_Txt("TARS_CAPTURE_TICK",math.max(0,self.duration)),
123987
- 9,self.playerName)
125024
+ self.Callback:_Txt("TARS_CAPTURE_TICK",math.max(0,math.floor(self.duration))),
125025
+ math.min(interval,9),self.playerName,true)
123988
125026
  self:AddToTargetList(self:FindTargets())
123989
125027
  if self.Callback.filmLimitEnabled
123990
125028
  and self.captureCount>=self.Callback.filmLimitMax then
@@ -123994,7 +125032,11 @@ self.Callback:_Txt("TARS_FILM_CAP_REACHED",self.Callback.filmLimitMax),
123994
125032
  self.Callback:StopCapture(self)
123995
125033
  return
123996
125034
  end
123997
- timer.scheduleFunction(TARS_SESSION.CaptureLoop,self,timer.getTime()+10)
125035
+ if self.debugunitsearch then
125036
+ self:T(self.lid..string.format(
125037
+ "CaptureLoop interval=%.1fs duration=%.0fs",interval,self.duration))
125038
+ end
125039
+ timer.scheduleFunction(TARS_SESSION.CaptureLoop,self,timer.getTime()+interval)
123998
125040
  end
123999
125041
  if self.duration<=0 and self.loop then
124000
125042
  self.loop=false
@@ -124016,61 +125058,134 @@ else
124016
125058
  return params.maxRange
124017
125059
  end
124018
125060
  end
125061
+ function TARS_SESSION:_CalcInterval(unit,params)
125062
+ local vec3=unit:GetVec3()
125063
+ local alt=vec3.y-land.getHeight({x=vec3.x,y=vec3.z})
125064
+ alt=math.max(alt,1)
125065
+ local elev=params.offset
125066
+ local half_fov=math.rad(params.fov/2)
125067
+ local d_ground=alt/math.tan(elev)
125068
+ local b=d_ground*math.tan(half_fov)
125069
+ local diameter=2*b
125070
+ local vel=unit:GetVelocityVec3()
125071
+ local speed=math.sqrt(vel.x*vel.x+vel.y*vel.y+vel.z*vel.z)
125072
+ speed=math.max(speed,10)
125073
+ local overlap=params.overlap or 0.5
125074
+ local interval=(diameter*(1-overlap))/speed
125075
+ local min_interval=params.min_interval or 2
125076
+ return math.max(min_interval,math.min(120,interval))
125077
+ end
125078
+ function TARS_SESSION.isInEllipse(ox,oz,cx,cz,a,b,heading_rad)
125079
+ local dx=ox-cx
125080
+ local dz=oz-cz
125081
+ local cos_h=math.cos(heading_rad)
125082
+ local sin_h=math.sin(heading_rad)
125083
+ local lx=dx*sin_h+dz*cos_h
125084
+ local ly=-dx*cos_h+dz*sin_h
125085
+ return(lx/a)^2+(ly/b)^2<=1
125086
+ end
124019
125087
  function TARS_SESSION:FindTargets()
124020
125088
  local unit=self.unit
124021
- local vec3=unit:GetVec3()
124022
- local alt=unit:GetAltitude(true)
124023
125089
  local params=self.Callback.parameters[self.type]
124024
125090
  local roll=math.abs(TARS.getRoll(unit))
124025
125091
  local pitch=math.abs(TARS.getPitch(unit))
124026
125092
  local isFlat=roll<params.maxRoll and pitch<params.maxPitch
124027
- local radius=params.optimalAlt
124028
- and self:_CalcVisualRange(params,alt)
124029
- or alt*math.tan(math.rad(params.fov/2))
124030
- local offset=self:_OffsetCalc(unit,params)
124031
- local coordinate=self.coordinate or COORDINATE:New(offset.x,MSL,offset.z)
124032
- coordinate=coordinate:UpdateFromVec3({x=offset.x,y=MSL,z=offset.z})
125093
+ local elev=params.offset
125094
+ local half_fov=math.rad(params.fov/2)
125095
+ local center_shift=0
125096
+ local a,b
125097
+ local offset_data=self:_OffsetCalc(unit,params,0)
125098
+ local alt=offset_data.alt
125099
+ local MSL=offset_data.MSL
125100
+ local d_ground=alt/math.tan(elev)
125101
+ b=d_ground*math.tan(half_fov)
125102
+ if(elev-half_fov)>math.rad(2)then
125103
+ local d_near=alt/math.tan(elev+half_fov)
125104
+ local d_far=alt/math.tan(elev-half_fov)
125105
+ a=(d_far-d_near)/2
125106
+ center_shift=(d_far+d_near)/2-d_ground
125107
+ else
125108
+ a=b
125109
+ center_shift=0
125110
+ self:T(self.lid.."FindTargets: elev-fov margin too small, fallback to circle")
125111
+ end
125112
+ local offset=self:_OffsetCalc(unit,params,center_shift)
125113
+ local unit_pos=unit:GetVec3()
125114
+ local hdg=unit:GetHeading()
125115
+ local expected_x=unit_pos.x+math.sin(math.rad(hdg))*(d_ground+center_shift)
125116
+ local expected_z=unit_pos.z+math.cos(math.rad(hdg))*(d_ground+center_shift)
125117
+ self:T(string.format(
125118
+ "OFFSET DRIFT: _OffsetCalc=(%.0f,%.0f) expected=(%.0f,%.0f) drift=(Δx=%.0f,Δz=%.0f)",
125119
+ offset.x,offset.z,
125120
+ expected_x,expected_z,
125121
+ offset.x-expected_x,
125122
+ offset.z-expected_z))
125123
+ local coordinate=self.coordinate
125124
+ or COORDINATE:New(offset.x,offset.MSL,offset.z)
125125
+ coordinate=coordinate:UpdateFromVec3({x=offset.x,y=offset.MSL,z=offset.z})
124033
125126
  self.coordinate=coordinate
125127
+ local scan_radius=math.max(a,b)
125128
+ local heading=unit:GetHeading()
124034
125129
  if self.debugunitsearch then
124035
- local searchzone=self.searchzone or ZONE_RADIUS:New("TARS Debug",coordinate:GetVec2(),radius,true)
124036
- if searchzone then
124037
- searchzone:UndrawZone()
124038
- searchzone:UpdateFromVec2(coordinate:GetVec2(),radius)
124039
- self.searchzone=searchzone
125130
+ local searchzone=self.searchzone
125131
+ or ZONE_RADIUS:New("TARS Debug",coordinate:GetVec2(),scan_radius)
125132
+ if searchzone.DrawID then searchzone:UndrawZone()end
125133
+ searchzone:UpdateFromVec2(coordinate:GetVec2(),scan_radius)
124040
125134
  searchzone:DrawZone(-1,{0,0,1},1,{0,1,0},.2,2,true)
125135
+ self.searchzone=searchzone
125136
+ self:ScheduleOnce(30,ZONE_BASE.UndrawZone,searchzone)
124041
125137
  end
124042
- if params and unit and unit:IsAlive()then
124043
- self:I({Roll=roll,Pitch=pitch,AGL=alt})
125138
+ if self.PilotParameterHelper==true then
125139
+ self:T({Roll=roll,Pitch=pitch,AGL=alt,a=a,b=b,shift=center_shift})
124044
125140
  if roll>params.maxRoll then
124045
- MESSAGE:New(string.format("Roll - NOK out of parameters (%d°)!",roll or 0),9,"PARAM"):ToUnit(unit)
125141
+ MESSAGE:New(string.format("Roll - NOK out of parameters (%d°)!",roll),9,"PARAM"):ToUnit(unit)
124046
125142
  elseif pitch>params.maxPitch then
124047
- MESSAGE:New(string.format("Pitch - NOK out of parameters (%d°)!",pitch or 0),9,"PARAM"):ToUnit(unit)
125143
+ MESSAGE:New(string.format("Pitch - NOK out of parameters (%d°)!",pitch),9,"PARAM"):ToUnit(unit)
124048
125144
  elseif alt<params.minAlt or alt>params.maxAlt then
124049
- MESSAGE:New(string.format("AGL - NOK too high or too low (%dm)!",alt or 0),9,"PARAM"):ToUnit(unit)
125145
+ MESSAGE:New(string.format("AGL - NOK too high or too low (%dm)!",alt),9,"PARAM"):ToUnit(unit)
124050
125146
  else
124051
- MESSAGE:New("Params - OK!",9,"PARAM"):ToUnit(unit)
125147
+ MESSAGE:New(string.format("Params OK | a=%.0fm b=%.0fm shift=%.0fm",a,b,center_shift),9,"PARAM"):ToUnit(unit)
124052
125148
  end
124053
125149
  end
124054
- end
124055
- local debugunitset
124056
- if self.debug==true then
124057
- self:I(self.lid.."FindTargets Debug SET_UNIT created")
124058
- debugunitset=SET_UNIT:New():FilterCategories("ground"):FilterCoalitions("red"):FilterOnce()
124059
- end
124060
- local ScannedUnits=self.Callback.detectUnits and coordinate:ScanUnits(radius)or nil
124061
- local ScannedStatics=self.Callback.detectStatics and coordinate:ScanStatics(radius)or nil
125150
+ local ScannedUnits=self.Callback.detectUnits and coordinate:ScanUnits(scan_radius)or nil
125151
+ local ScannedStatics=self.Callback.detectStatics and coordinate:ScanStatics(scan_radius)or nil
124062
125152
  local targetList={}
124063
125153
  if alt>params.minAlt and alt<params.maxAlt and isFlat then
124064
125154
  for _,u in pairs(ScannedUnits and ScannedUnits.Set or{})do
124065
- if self:_ValidateObjectFound(u)then targetList[u:GetName()]=u end
125155
+ if self:_ValidateObjectFound(u)then
125156
+ local uv=u:GetVec3()
125157
+ local dx=uv.x-offset.x
125158
+ local dz=uv.z-offset.z
125159
+ local cos_h=math.cos(offset.rad)
125160
+ local sin_h=math.sin(offset.rad)
125161
+ local lx=dx*sin_h+dz*cos_h
125162
+ local ly=-dx*cos_h+dz*sin_h
125163
+ local ellipse_val=(lx/a)^2+(ly/b)^2
125164
+ self:T(string.format(
125165
+ "ELLIPSE CHECK '%s': dx=%.0f dz=%.0f lx=%.0f ly=%.0f val=%.2f %s",
125166
+ u:GetName(),dx,dz,lx,ly,ellipse_val,
125167
+ ellipse_val<=1 and"HIT ✓"or"MISS (außerhalb)"))
125168
+ if ellipse_val<=1 then
125169
+ targetList[u:GetName()]=u
125170
+ end
125171
+ end
124066
125172
  end
124067
125173
  for _,s in pairs(ScannedStatics and ScannedStatics.Set or{})do
124068
- if self:_ValidateObjectFound(s)then targetList[s:GetName()]=s end
125174
+ if self:_ValidateObjectFound(s)then
125175
+ local sv=s:GetVec3()
125176
+ if TARS_SESSION.isInEllipse(sv.x,sv.z,offset.x,offset.z,a,b,offset.rad)then
125177
+ targetList[s:GetName()]=s
124069
125178
  end
124070
125179
  end
124071
- if debugunitset then
125180
+ end
125181
+ end
125182
+ if self.debug==true then
125183
+ self:T(self.lid.."FindTargets Debug SET_UNIT created")
125184
+ local debugunitset=SET_UNIT:New():FilterCategories("ground"):FilterCoalitions("red"):FilterOnce()
124072
125185
  for _,u in pairs(debugunitset and debugunitset.Set or{})do
124073
- if self:_ValidateObjectFound(u)then targetList[u:GetName()]=u end
125186
+ if self:_ValidateObjectFound(u)then
125187
+ targetList[u:GetName()]=u
125188
+ end
124074
125189
  end
124075
125190
  end
124076
125191
  return targetList
@@ -124100,6 +125215,9 @@ local unit=CLIENT:FindByPlayerName(playerName)
124100
125215
  if unit then
124101
125216
  MESSAGE:New(text,seconds,"TARS"):ToUnit(unit)
124102
125217
  end
125218
+ if self.debug==true then
125219
+ MESSAGE:New(text,seconds,"TARS"):ToAll()
125220
+ end
124103
125221
  if unit and self.SRS and(not Silent)then
124104
125222
  local srsText=string.gsub(text,"^%[TARS%] ?",playerName..", ")
124105
125223
  srsText=string.gsub(srsText,"[<>]","")
@@ -124212,7 +125330,7 @@ TARS.groundMenus[playerName]=TARS.groundMenus[playerName]or{}
124212
125330
  TARS.groundMenus[playerName].approved=reconOk
124213
125331
  TARS.groundMenus[playerName].playerName=playerName
124214
125332
  if reconOk then
124215
- self:I("VALIDATE OK — "..unit:GetName().." / "..tostring(playerName))
125333
+ self:T("VALIDATE OK — "..unit:GetName().." / "..tostring(playerName))
124216
125334
  self:_MenuRemoveValidation(playerName)
124217
125335
  local msg=self:_Txt("TARS_VALID_OK_HDR")
124218
125336
  self:_MsgUnit(msg,15,playerName)
@@ -124223,7 +125341,7 @@ local msg=""
124223
125341
  ..self:_Txt("TARS_PLATFORM_FILM").." : "..params.duration.." expositions"
124224
125342
  self:_MsgUnit(msg,15,playerName,true)
124225
125343
  else
124226
- self:I("VALIDATE REFUSED — "..unit:GetName().." ammo="..tostring(refusedWeapon))
125344
+ self:T("VALIDATE REFUSED — "..unit:GetName().." ammo="..tostring(refusedWeapon))
124227
125345
  local msg=self:_Txt("TARS_VALID_REFUSED_WPN")
124228
125346
  if refusedWeapon then
124229
125347
  msg=msg.."\n"..self:_Txt("TARS_VALID_REFUSED_AMMO",refusedWeapon)
@@ -124410,7 +125528,7 @@ if d.menuHandle then d.menuHandle:RefreshAndOrderByTag()end
124410
125528
  self:T(self.lid.."MENU -film controls — "..tostring(playerName))
124411
125529
  end
124412
125530
  function TARS:AddBaseMenu(unit,playerName)
124413
- self:I(self.lid.."AddBaseMenu — "..unit:GetName()
125531
+ self:T(self.lid.."AddBaseMenu — "..unit:GetName()
124414
125532
  .." / "..tostring(playerName))
124415
125533
  local typeName=unit:GetTypeName()
124416
125534
  if not TARS.reconTypes[typeName]then return end
@@ -124461,7 +125579,7 @@ playerName=displayName,
124461
125579
  group=grp,
124462
125580
  }
124463
125581
  self:_MenuAddValidation(playerName)
124464
- self:I(self.lid.."MENU created — "..tostring(playerName)
125582
+ self:T(self.lid.."MENU created — "..tostring(playerName)
124465
125583
  .." group="..grp:GetName())
124466
125584
  end
124467
125585
  function TARS:RemoveGroundMenu(playerName)
@@ -126576,7 +127694,7 @@ ConfigLoaded=false,
126576
127694
  poptions={},
126577
127695
  UsePowerShell=false,
126578
127696
  }
126579
- MSRS.version="0.3.6"
127697
+ MSRS.version="0.3.7"
126580
127698
  MSRS.Voices={
126581
127699
  Amazon={
126582
127700
  Generative={
@@ -127612,14 +128730,14 @@ end
127612
128730
  )
127613
128731
  return
127614
128732
  end
127615
- Frequencies=UTILS.EnsureTable(Frequencies)
127616
- Modulations=UTILS.EnsureTable(Modulations)
128733
+ Frequencies=UTILS.EnsureTable(Frequencies or self.frequencies)
128734
+ Modulations=UTILS.EnsureTable(Modulations or self.modulations)
127617
128735
  local ffs={}
127618
- for _,_f in pairs(Frequencies or self.frequencies)do
128736
+ for _,_f in pairs(Frequencies)do
127619
128737
  table.insert(ffs,string.format("%.1f",_f))
127620
128738
  end
127621
128739
  local freqs=table.concat(ffs,",")
127622
- local modus=table.concat(Modulations or self.modulations,",")
128740
+ local modus=table.concat(Modulations,",")
127623
128741
  local coal=Coalition or self.coalition
127624
128742
  local gender=Gender or self.gender
127625
128743
  local voice=Voice or self:GetVoice(self.provider)or self.voice
@@ -127696,6 +128814,40 @@ if not parameters.language then parameters.language="de"end
127696
128814
  HoundTTS.Translate(text,parameters,callback)
127697
128815
  return
127698
128816
  end
128817
+ function MSRS:RadioJammerOn(Frequencies,Modulations,Coalition,Noisetype,Volume,Seconds,Label,Vec3,Encrypt,EncKey)
128818
+ self:T(self.lid.."RadioJammerOn")
128819
+ Frequencies=UTILS.EnsureTable(Frequencies)
128820
+ Modulations=UTILS.EnsureTable(Modulations)
128821
+ local ffs={}
128822
+ for _,_f in pairs(Frequencies or self.frequencies)do
128823
+ table.insert(ffs,string.format("%.1f",_f))
128824
+ end
128825
+ local freqs=table.concat(ffs,",")
128826
+ local modus=table.concat(Modulations or self.modulations,",")
128827
+ modus=modus:gsub("0","AM")
128828
+ modus=modus:gsub("1","FM")
128829
+ local coal=Coalition or self.coalition or coalition.side.RED
128830
+ local secs=Seconds or 30
128831
+ local TransmissionP={}
128832
+ local ProviderP={}
128833
+ TransmissionP.transmitter="srs"
128834
+ TransmissionP.freqs=freqs
128835
+ TransmissionP.modulations=modus
128836
+ TransmissionP.coalition=coal or self.coalition
128837
+ TransmissionP.name=Label or self.Label
128838
+ TransmissionP.point=Vec3
128839
+ TransmissionP.encrypt=Encrypt
128840
+ TransmissionP.encKey=EncKey
128841
+ ProviderP.noiseType=Noisetype or"white"
128842
+ ProviderP.volume=Volume or 1
128843
+ local ID=HoundTTS.TransmitNoise(TransmissionP,ProviderP)
128844
+ self.NoiseID=ID
128845
+ self:ScheduleOnce(secs,MSRS.RadioJammerOff,self,ID)
128846
+ return ID
128847
+ end
128848
+ function MSRS:RadioJammerOff(ID)
128849
+ return HoundTTS.KillSession(ID or self.NoiseID)
128850
+ end
127699
128851
  function MSRS:LoadConfigFile(Path,Filename)
127700
128852
  if lfs==nil then
127701
128853
  env.info("*****Note - lfs and os need to be desanitized for MSRS to work!")