DEADSOFTWARE

i10n: fix menu translations
[d2df-editor.git] / src / editor / g_language.pas
1 Unit g_language;
3 {$INCLUDE ../shared/a_modes.inc}
5 Interface
7 uses g_Basic, MAPDEF, Classes;
9 resourcestring
10 MsgNotAccessible = 'N/A';
12 MsgArrayBoolFalse = 'No';
13 MsgArrayBoolTrue = 'Yes';
15 MsgArrayDirLeft = 'Left';
16 MsgArrayDirRight = 'Right';
17 MsgArrayDirSame = 'Don''t change';
18 MsgArrayDirReversed = 'Reversed';
20 MsgArrayDirbtnLeft = 'Left';
21 MsgArrayDirbtnRight = 'Right';
22 MsgArrayDirbtnUp = 'Up';
23 MsgArrayDirbtnDown = 'Down';
25 MsgArrayPanelWall = 'Wall';
26 MsgArrayPanelBack = 'Background';
27 MsgArrayPanelFront = 'Foreground';
28 MsgArrayPanelDoorOpen = 'Open Door';
29 MsgArrayPanelDoorClose = 'Closed Door';
30 MsgArrayPanelStair = 'Step';
31 MsgArrayPanelWater = 'Water';
32 MsgArrayPanelAcid1 = 'Acid 1';
33 MsgArrayPanelAcid2 = 'Acid 2';
34 MsgArrayPanelLiftUp = 'Stream Up';
35 MsgArrayPanelLiftDown = 'Stream Down';
36 MsgArrayPanelLiftLeft = 'Stream Left';
37 MsgArrayPanelLiftRight = 'Stream Right';
38 MsgArrayPanelBlockmon = 'Monster Boundary';
40 MsgArrayFxNone = 'None';
41 MsgArrayFxTeleport = 'Teleport';
42 MsgArrayFxRespawn = 'Respawn';
43 MsgArrayFxFire = 'Arch-Vile Fire';
45 MsgArrayItemMedkit = 'Stimpack';
46 MsgArrayItemLargeMedkit = 'Medikit';
47 MsgArrayItemBlackMedkit = 'Berserk Pack';
48 MsgArrayItemGreenArmor = 'Green Armor';
49 MsgArrayItemBlueArmor = 'Blue Armor';
50 MsgArrayItemBlueSphere = 'Soulsphere';
51 MsgArrayItemMegasphere = 'Megasphere';
52 MsgArrayItemHazSuit = 'Envirosuit';
53 MsgArrayItemOxygen = 'Scuba';
54 MsgArrayItemInvulnerability = 'Invulnerability';
55 MsgArrayItemChainsaw = 'Chainsaw';
56 MsgArrayItemShotgun = 'Shotgun';
57 MsgArrayItemDbShotgun = 'Super Shotgun';
58 MsgArrayItemChaingun = 'Chaingun';
59 MsgArrayItemRocketLauncher = 'Rocket Launcher';
60 MsgArrayItemPlasmaRifle = 'Plasma Rifle';
61 MsgArrayItemBfg = 'BFG9000';
62 MsgArrayItemSuperMinigun = 'Super Chaingun';
63 MsgArrayItemFlamethrower = 'Flamethrower';
64 MsgArrayItemClip = 'Clip';
65 MsgArrayItemAmmoBox = 'Box of Bullets';
66 MsgArrayItem4Shells = '4 Shells';
67 MsgArrayItem25Shells = 'Box of Shells';
68 MsgArrayItem1Rocket = 'Rocket';
69 MsgArrayItemRocketBox = 'Box of Rockets';
70 MsgArrayItemCell = 'Energy Cell';
71 MsgArrayItemLargeCell = 'Energy Cell Pack';
72 MsgArrayItemFuelcan = 'Fuel Canister';
73 MsgArrayItemBackpack = 'Backpack';
74 MsgArrayItemKeyRed = 'Red Key';
75 MsgArrayItemKeyGreen = 'Green Key';
76 MsgArrayItemKeyBlue = 'Blue Key';
77 MsgArrayItemBottle = 'Health Globe';
78 MsgArrayItemHelmet = 'Armor Shard';
79 MsgArrayItemJetpack = 'Jetpack';
80 MsgArrayItemInvis = 'Invisibility';
82 MsgArrayShotPistol = 'Pistol shot';
83 MsgArrayShotBullet = 'Chaingun shot';
84 MsgArrayShotShotgun = 'Shotgun shot';
85 MsgArrayShotSsg = 'Super Shotgun shot';
86 MsgArrayShotImp = 'Imp fireball';
87 MsgArrayShotPlasma = 'Blue plasma';
88 MsgArrayShotSpider = 'Arachnotron plasma';
89 MsgArrayShotCaco = 'Cacodemon fireball';
90 MsgArrayShotBaron = 'Hell Baron projectile';
91 MsgArrayShotMancub = 'Mancubus gunshot';
92 MsgArrayShotRev = 'Revenant projectile';
93 MsgArrayShotRocket = 'Rocket';
94 MsgArrayShotBfg = 'BFG ball';
95 MsgArrayShotExpl = 'Explosion';
96 MsgArrayShotBfgexpl = 'BFG explosion';
97 MsgArrayShotFlame = 'Flame';
99 MsgArrayMonDemon = 'Pinky';
100 MsgArrayMonImp = 'Imp';
101 MsgArrayMonZombie = 'Zombie';
102 MsgArrayMonSergeant = 'Sergeant';
103 MsgArrayMonCyber = 'Cyberdemon';
104 MsgArrayMonCgun = 'Commando';
105 MsgArrayMonHellBaron = 'Hell Baron';
106 MsgArrayMonHellKnight = 'Hell Knight';
107 MsgArrayMonCacodemon = 'Cacodemon';
108 MsgArrayMonLostSoul = 'Lost Soul';
109 MsgArrayMonPainElemental = 'Pain Elemental';
110 MsgArrayMonMastermind = 'Spider Mastermind';
111 MsgArrayMonArachnatron = 'Arachnotron';
112 MsgArrayMonMancubus = 'Mancubus';
113 MsgArrayMonRevenant = 'Revenant';
114 MsgArrayMonArchvile = 'Arch-Vile';
115 MsgArrayMonFish = 'Piranha';
116 MsgArrayMonBarrel = 'Barrel';
117 MsgArrayMonRobot = 'Robot';
118 MsgArrayMonPrikolist = 'Prikolist';
120 MsgArrayAreaPlayerOne = 'Player 1';
121 MsgArrayAreaPlayerTwo = 'Player 2';
122 MsgArrayAreaDm = 'DM Spawn Point';
123 MsgArrayAreaFlagRed = 'Red Flag';
124 MsgArrayAreaFlagBlue = 'Blue Flag';
125 MsgArrayAreaFlagDom = 'Domination Flag';
126 MsgArrayAreaTeamRed = 'Red Team';
127 MsgArrayAreaTeamBlue = 'Blue Team';
129 MsgArrayTrExit = 'Exit';
130 MsgArrayTrTeleport = 'Teleport';
131 MsgArrayTrDoorOpen = 'Open Door';
132 MsgArrayTrDoorClose = 'Close Door';
133 MsgArrayTrDoorSwitch = 'Door';
134 MsgArrayTrDoor5Sec = 'Door (5 sec)';
135 MsgArrayTrTrapClose = 'Close Trap';
136 MsgArrayTrTrap = 'Trap';
137 MsgArrayTrExtend = 'Extender';
138 MsgArrayTrSecret = 'Secret';
139 MsgArrayTrLiftUp = 'Turn stream up/left';
140 MsgArrayTrLiftDown = 'Turn stream down/right';
141 MsgArrayTrLiftSwitch = 'Revert stream';
142 MsgArrayTrTexture = 'Change Texture';
143 MsgArrayTrOn = 'Enable Trigger';
144 MsgArrayTrOff = 'Disable Trigger';
145 MsgArrayTrSwitch = 'Trigger Toggle';
146 MsgArrayTrSound = 'Play Sound';
147 MsgArrayTrSpawnMonster = 'Spawn Monster';
148 MsgArrayTrSpawnItem = 'Spawn Item';
149 MsgArrayTrMusic = 'Play Music';
150 MsgArrayTrPush = 'Push';
151 MsgArrayTrScore = 'Team Score';
152 MsgArrayTrMessage = 'Message';
153 MsgArrayTrDamage = 'Damage';
154 MsgArrayTrHealth = 'Healer';
155 MsgArrayTrShot = 'Turret';
156 MsgArrayTrEffect = 'Effect';
158 MsgPropId = 'ID';
159 MsgPropX = 'X';
160 MsgPropY = 'Y';
161 MsgPropWidth = 'Width';
162 MsgPropHeight = 'Height';
163 MsgPropPanelType = 'Panel Type';
164 MsgPropPanelTex = 'Texture';
165 MsgPropPanelAlpha = 'Transparency';
166 MsgPropPanelBlend = 'Blending';
167 MsgPropDmOnly = 'DM Only';
168 MsgPropItemFalls = 'Falls';
169 MsgPropDirection = 'Direction';
171 MsgPropTrType = 'Trigger Type';
172 MsgPropTrEnabled = 'Enabled';
173 MsgPropTrTexturePanel = 'Textured Panel';
174 MsgPropTrActivation = 'Activation Type';
175 MsgPropTrKeys = 'Keys';
176 MsgPropTrD2d = 'D2D-like';
177 MsgPropTrSilent = 'Silent';
178 MsgPropTrCount = 'Count';
179 MsgPropTrInterval = 'Interval (in ticks)';
180 MsgPropTrHealth = 'Health';
181 MsgPropTrNextMap = 'Next Map';
182 MsgPropTrTeleportTo = 'Teleport to';
183 MsgPropTrTeleportSilent = 'Silent';
184 MsgPropTrTeleportDir = 'New Direction';
185 MsgPropTrDoorPanel = 'Door Panel';
186 MsgPropTrTrapPanel = 'Trap Panel';
187 MsgPropTrExArea = 'Action Area';
188 MsgPropTrExDelay = 'Delay';
189 MsgPropTrExCount = 'Count';
190 MsgPropTrExMonster = 'Monster ID';
191 MsgPropTrExRandom = 'Random';
192 MsgPropTrLiftPanel = 'Stream Panel';
193 MsgPropTrTextureOnce = 'Once';
194 MsgPropTrTextureAnimOnce = 'Animate Once';
195 MsgPropTrSoundName = 'Sound (snd)';
196 MsgPropTrSoundVolume = 'Volume';
197 MsgPropTrSoundPan = 'Pan';
198 MsgPropTrSoundCount = 'Loops';
199 MsgPropTrSoundLocal = 'Local';
200 MsgPropTrSoundSwitch = 'Switch';
201 MsgPropTrFxType = 'Effect';
202 MsgPropTrSpawnTo = 'Spawn at';
203 MsgPropTrSpawnMax = 'Maximum';
204 MsgPropTrSpawnDelay = 'Autospawn (in ticks)';
205 MsgPropTrMonsterType = 'Monster';
206 MsgPropTrMonsterActive = 'Active';
207 MsgPropTrMonsterBehaviour = 'Behaviour';
208 MsgPropTrMonsterBehaviour0 = 'Normal';
209 MsgPropTrMonsterBehaviour1 = 'Killer';
210 MsgPropTrMonsterBehaviour2 = 'Maniac';
211 MsgPropTrMonsterBehaviour3 = 'Insane';
212 MsgPropTrMonsterBehaviour4 = 'Cannibal';
213 MsgPropTrMonsterBehaviour5 = 'Good';
214 MsgPropTrItemType = 'Item';
215 MsgPropTrMusicName = 'Music';
216 MsgPropTrMusicAct = 'Action (m)';
217 MsgPropTrMusicOn = 'Play';
218 MsgPropTrMusicOff = 'Pause';
219 MsgPropTrPushAngle = 'Angle';
220 MsgPropTrPushForce = 'Force';
221 MsgPropTrPushReset = 'Reset velocity';
222 MsgPropTrScoreAct = 'Action (s)';
223 MsgPropTrScoreAct0 = 'Add points';
224 MsgPropTrScoreAct1 = 'Subtract points';
225 MsgPropTrScoreAct2 = 'Team Wins';
226 MsgPropTrScoreAct3 = 'Team Loses';
227 MsgPropTrScoreTeam = 'Team';
228 MsgPropTrScoreTeam0 = 'My';
229 MsgPropTrScoreTeam1 = 'Enemy';
230 MsgPropTrScoreTeam2 = 'Red';
231 MsgPropTrScoreTeam3 = 'Blue';
232 MsgPropTrScoreCon = 'Console message';
233 MsgPropTrScoreMsg = 'Game message';
234 MsgPropTrDamageValue = 'Damage';
235 MsgPropTrDamageKind = 'Damage type';
236 MsgPropTrDamageKind0 = 'HIT_SOME';
237 MsgPropTrDamageKind3 = 'HIT_TRAP';
238 MsgPropTrDamageKind4 = 'HIT_FALL';
239 MsgPropTrDamageKind5 = 'HIT_WATER';
240 MsgPropTrDamageKind6 = 'HIT_ACID';
241 MsgPropTrDamageKind7 = 'HIT_ELECTRO';
242 MsgPropTrDamageKind8 = 'HIT_FLAME';
243 MsgPropTrHealthMax = 'To maximum';
244 MsgPropTrShotType = 'Projectile';
245 MsgPropTrShotSound = 'Shot sound';
246 MsgPropTrShotAngle = 'Angle';
247 MsgPropTrShotAcc = 'Spread';
248 MsgPropTrShotTo = 'Auto targeting';
249 MsgPropTrShotTo0 = 'None';
250 MsgPropTrShotTo1 = 'Monsters';
251 MsgPropTrShotTo2 = 'Players';
252 MsgPropTrShotTo3 = 'Red team';
253 MsgPropTrShotTo4 = 'Blue team';
254 MsgPropTrShotTo5 = 'Monsters, players';
255 MsgPropTrShotTo6 = 'Players, monsters';
256 MsgPropTrShotAim = 'Auto-aiming mode';
257 MsgPropTrShotAim0 = 'Trigger area';
258 MsgPropTrShotAim1 = 'Entire map';
259 MsgPropTrShotAim2 = 'Trace trigger area';
260 MsgPropTrShotAim3 = 'Trace entire map';
261 MsgPropTrShotAmmo = 'Ammo limit';
262 MsgPropTrShotReload = 'Reload interval (in ticks)';
263 MsgPropTrShotSight = 'Sight interval (in ticks)';
264 MsgPropTrShotPanel = 'Indicator panel';
265 MsgPropTrMessageKind = 'Message kind';
266 MsgPropTrMessageKind0 = 'Console message';
267 MsgPropTrMessageKind1 = 'Event message';
268 MsgPropTrMessageTo = 'Send to';
269 MsgPropTrMessageTo0 = 'Me';
270 MsgPropTrMessageTo1 = 'My team';
271 MsgPropTrMessageTo2 = 'Enemy team';
272 MsgPropTrMessageTo3 = 'Red team';
273 MsgPropTrMessageTo4 = 'Blue team';
274 MsgPropTrMessageTo5 = 'Everyone';
275 MsgPropTrMessageText = 'Message text';
276 MsgPropTrMessageTime = 'Time (in ticks)';
277 MsgPropTrEffectType = 'Effect type';
278 MsgPropTrEffectSubtype = 'Effect subtype';
279 MsgPropTrEffectColor = 'Effect color';
280 MsgPropTrEffectCenter = 'Trigger center';
281 MsgPropTrEffectVelx = 'Horizontal speed';
282 MsgPropTrEffectVely = 'Vertical speed';
283 MsgPropTrEffectSpl = 'Speed variance left';
284 MsgPropTrEffectSpr = 'Speed variance right';
285 MsgPropTrEffectSpu = 'Speed variance up';
286 MsgPropTrEffectSpd = 'Speed variance down';
287 MsgPropTrEffectParticle = 'Particle generator';
288 MsgPropTrEffectAnimation = 'Animation';
289 MsgPropTrEffectSliquid = 'Water splash';
290 MsgPropTrEffectLliquid = 'Light colored splash';
291 MsgPropTrEffectDliquid = 'Dark colored splash';
292 MsgPropTrEffectBlood = 'Blood';
293 MsgPropTrEffectSpark = 'Sparks';
294 MsgPropTrEffectBubble = 'Bubbles';
296 MsgMsgError = 'Error';
297 MsgMsgWrongTexwidth = 'Panel Width must be a multiple of Texture Width (%d)';
298 MsgMsgWrongTexheight = 'Panel Height must be a multiple of Texture Height (%d)';
299 MsgMsgWrongAlpha = 'Transparency must be in [0..255] interval';
300 MsgMsgWrongSize = 'Width and Height must be greater than 0';
301 MsgMsgWrongXy = 'X or Y coordinate hasn''t been set';
302 MsgMsgTextureAlready = 'Texture "%s" already exists';
303 MsgMsgResName64 = 'Resource "%s" name must not be longer than 64 chars';
304 MsgMsgChooseItem = 'Select Item';
305 MsgMsgChooseMonster = 'Select Monster';
306 MsgMsgChooseArea = 'Select Area';
307 MsgMsgChooseTexture = 'Select Texture';
308 MsgMsgChooseRes = 'Resource hasn''t been selected';
309 MsgMsgExit = 'Exit';
310 MsgMsgExitPromt = 'Leaving so soon?';
311 MsgMsgDelTexture = 'Delete the texture';
312 MsgMsgDelTexturePromt = 'Delete the texture "%s" ?';
313 MsgMsgDelTextureCant = 'Can''t delete texture in use. Replace it on all panels with this texture.';
314 MsgMsgDelRecent = 'File does not longer exist';
315 MsgMsgDelRecentPromt = 'Remove entry from recent list?';
316 MsgMsgClearMap = 'New map';
317 MsgMsgClearMapPromt = 'Clear the entire map?';
318 MsgMsgDeleteMap = 'Delete the map';
319 MsgMsgDeleteMapPromt = 'Delete the map "%s" from "%s" ?';
320 MsgMsgMapDeleted = 'Map is deleted';
321 MsgMsgMapDeletedPromt = 'Map "%s" is deleted';
322 MsgMsgReopenMapPromt = 'Reopen this map?';
323 MsgMsgExecError = 'Game start error';
324 MsgMsgSoundError = 'Can''t play sound';
325 MsgMsgWadError = 'Can''t open WAD: %s';
326 MsgMsgResError = 'Can''t read resource: %s:%s\%s';
327 MsgMsgPacked = 'Map "%s" with resources saved to "%s"';
328 MsgMsgMapExists = 'Map "%s" already exists. Overwrite?';
329 MsgMsgSaveMap = 'Save the map';
331 MsgHintTeleport = 'Choose destination of Teleport';
332 MsgHintSpawn = 'Choose Spawn point';
333 MsgHintPanelDoor = 'Choose Door';
334 MsgHintPanelTexture = 'Choose textured Panel';
335 MsgHintPanelShot = 'Choose textured shot indicator Panel';
336 MsgHintPanelLift = 'Choose Stream Panel';
337 MsgHintMonster = 'Choose Monster';
338 MsgHintExtArea = 'Specify action Area';
339 MsgHintWidth = 'Width: %d';
340 MsgHintHeight = 'Height: %d';
342 MsgMenuAppleAbout = 'About Editor';
343 MsgMenuApplePref = 'Preferences...';
345 MsgMenuFile = 'File';
346 MsgMenuFileNew = 'New';
347 MsgMenuFileOpen = 'Open...';
348 MsgMenuFileRecentMac = 'Open Recent';
349 MsgMenuFileRecentClearMac = 'Clear Recent';
350 MsgMenuFileSave = 'Save';
351 MsgMenuFileSaveAs = 'Save As...';
352 MsgMenuFileOpenWad = 'Select Map...';
353 MsgMenuFileReopen = 'Revert to Saved';
354 MsgMenuFileSaveMini = 'Save Minimap...';
355 MsgMenuFileDelete = 'Remove from WAD...';
356 MsgMenuFilePackMap = 'Pack to WAD...';
357 MsgMenuFileRecentWin = 'Recent Files';
358 MsgMenuFileExitWin = 'Exit';
360 MsgMenuEdit = 'Edit';
361 MsgMenuEditUndo = 'Undo';
362 MsgMenuEditCopy = 'Copy';
363 MsgMenuEditCut = 'Cut';
364 MsgMenuEditPaste = 'Paste';
365 MsgMenuEditSelectAll = 'Select All';
366 MsgMenuEditSnapGrid = 'Snap to Grid';
367 MsgMenuEditStepGrid = 'Switch Grid Granularity';
368 MsgMenuEditToFore = 'Bring to Front';
369 MsgMenuEditToBack = 'Send to Back';
370 MsgMenuEditMapProps = 'Map Properties...';
371 MsgMenuEditPrefWin = 'Preferences...';
373 MsgMenuView = 'View';
374 MsgMenuViewLayers = 'Layers';
375 MsgMenuViewMinimap = 'Show Minimap';
376 MsgMenuViewBounds = 'Show Map Bounds';
377 MsgMenuViewPreview = 'Preview Mode';
379 MsgMenuServ = 'Service';
380 MsgMenuServTest = 'Analyse Map...';
381 MsgMenuServOpt = 'Optimize Map...';
382 MsgMenuServLaunch = 'Run Test';
384 MsgMenuWindow = 'Window';
385 MsgMenuWindowMinimize = 'Minimize';
386 MsgMenuWindowZoom = 'Zoom';
388 MsgMenuHelp = 'Help';
389 MsgMenuHelpAboutWin = 'About Editor';
391 MsgMenuLayerBack = '1. Background';
392 MsgMenuLayerWall = '2. Walls';
393 MsgMenuLayerFore = '3. Foreground';
394 MsgMenuLayerStair = '4. Steps';
395 MsgMenuLayerWater = '5. Liquids';
396 MsgMenuLayerItem = '6. Items';
397 MsgMenuLayerMonster = '7. Monsters';
398 MsgMenuLayerArea = '8. Areas';
399 MsgMenuLayerTrigger = '9. Triggers';
401 MsgMenuTbNew = 'New Map';
402 MsgMenuTbOpen = 'Open Map';
403 MsgMenuTbSave = 'Save Map';
404 MsgMenuTbOpenWad = 'Open another Map from same WAD';
405 MsgMenuTbMinimap = 'Show Mini-map';
406 MsgMenuTbLayers = 'Show/Hide Objects';
407 MsgMenuTbGrid = 'Grid On/Off';
408 MsgMenuTbGridStep = 'Switch Grid step';
409 MsgMenuTbLaunch = 'Run Test';
411 MsgMenuLaunchSets = 'Settings...';
413 MsgCapFxType = 'Select Effect type';
414 MsgCapMonsterType = 'Select Monster type';
415 MsgCapItemType = 'Select Item type';
416 MsgCapAbout = 'About Map Editor';
417 MsgCapAct = 'Activation type';
418 MsgCapAddSky = 'Select Sky Texture';
419 MsgCapAddSound = 'Select Sound/Music';
420 MsgCapAddTexture = 'Select Texture';
421 MsgCapKeys = 'Keys';
422 MsgCapTest = 'Analyse Map';
423 MsgCapOpt = 'Optimize Map';
424 MsgCapSets = 'Map Properties';
425 MsgCapLaunch = 'In-game test Settings';
426 MsgCapEs = 'Editor Preferences';
427 MsgCapPack = 'Pack Map';
428 MsgCapSave = 'Save Map';
429 MsgCapMini = 'Save Minimap';
430 MsgCapSelect = 'Select Map';
431 MsgCapOpen = 'Open Map';
432 MsgCapRemove = 'Remove Map';
433 MsgCapTexture = 'Texture: %dx%d';
434 MsgCapAnimation = 'Animation: %dx%d, %d frames';
435 MsgCapStatSelected = 'Selected objects: %d';
437 MsgCtrlPropKey = 'Property';
438 MsgCtrlPropValue = 'Value';
440 MsgCtrlPanels = 'Panels';
441 MsgCtrlItems = 'Items';
442 MsgCtrlMonsters = 'Monsters';
443 MsgCtrlAreas = 'Areas';
444 MsgCtrlTriggers = 'Triggers';
446 MsgCtrlListTexture = 'Texture List';
447 MsgCtrlListItem = 'Item List';
448 MsgCtrlListMonster = 'Monster List';
449 MsgCtrlListArea = 'Area List';
450 MsgCtrlListTrigger = 'Trigger List';
451 MsgCtrlListActive = 'Activation Type';
452 MsgCtrlListKeys = 'Keys Needed';
454 MsgCtrlPreview = 'Texture Preview';
455 MsgCtrlItemDm = 'DM Only';
456 MsgCtrlItemFalls = 'Falls';
457 MsgCtrlLeft = 'Left';
458 MsgCtrlRight = 'Right';
460 MsgCtrlActPlayerClose = 'Player Collides';
461 MsgCtrlActMonsterClose = 'Monster Collides';
462 MsgCtrlActPlayerPress = 'Player Pressed';
463 MsgCtrlActMonsterPress = 'Monster Pressed';
464 MsgCtrlActShot = 'Shot';
465 MsgCtrlActNoMonster = 'No Monsters';
467 MsgCtrlKeysRed = 'Red Key';
468 MsgCtrlKeysGreen = 'Green Key';
469 MsgCtrlKeysBlue = 'Blue Key';
470 MsgCtrlKeysTeamRed = 'Red Team';
471 MsgCtrlKeysTeamBlue = 'Blue Team';
473 MsgCtrlOptGb = 'Optimization';
474 MsgCtrlOptTexture = 'Texture Optimization';
475 MsgCtrlOptPanel = 'Panel Optimization';
476 MsgCtrlOptWall = 'Walls';
477 MsgCtrlOptFore = 'Foreground';
478 MsgCtrlOptBack = 'Background';
479 MsgCtrlOptStair = 'Steps';
480 MsgCtrlOptWater = 'Water';
481 MsgCtrlOptAcid1 = 'Acid 1';
482 MsgCtrlOptAcid2 = 'Acid 2';
483 MsgCtrlOptLift = 'Streams';
484 MsgCtrlOptBlockmon = 'Monster Boundary';
485 MsgCtrlOptDescTexture = 'Deletes unused textures from texture list.';
486 MsgCtrlOptDescPanel = 'Merges nearby panels of same type. Increases game performance.';
487 MsgCtrlSetsStats = 'Statistics:';
488 MsgCtrlSetsSizes = 'Map Size:';
490 MsgCtrlLaunchDm = 'Deathmatch';
491 MsgCtrlLaunchTdm = 'Team Deathmatch';
492 MsgCtrlLaunchCtf = 'Capture the Flag';
493 MsgCtrlLaunchCoop = 'Cooperative';
494 MsgCtrlLaunch2p = 'Two Players';
495 MsgCtrlLaunchFf = 'Friendly Fire';
496 MsgCtrlLaunchExit = 'Enable Exit';
497 MsgCtrlLaunchWeapons = 'Weapons Stay';
498 MsgCtrlLaunchMonsters = 'Enable Monsters';
499 MsgCtrlLaunchClose = 'Close the game after exiting the map';
500 MsgCtrlLaunchOpen = 'Select Doom 2D: Forever executable';
502 MsgCtrlEsGrid = 'Show Grid';
503 MsgCtrlEsTexture = 'Show Panel Texture';
504 MsgCtrlEsPanelSize = 'Show Panel Size';
505 MsgCtrlEsCheckerboard = 'Use Checkerboard';
507 MsgCtrlPackTextures = 'Textures';
508 MsgCtrlPackSky = 'Sky';
509 MsgCtrlPackMusic = 'Music';
510 MsgCtrlPackAdd = 'Don''t overwrite WAD';
511 MsgCtrlPackNonStd = 'Non-standard Resources only';
513 MsgLabTexWidth = 'Texture Width:';
514 MsgLabTexHeight = 'Texture Height:';
516 MsgLabSpectrum = 'Show the Spectrum';
518 MsgLabAboutVer = 'Version 2.1.5';
519 MsgLabAboutAuthor = 'Author: rs.falcon';
520 MsgLabAboutAuthor2 = 'Additions: Pss';
521 MsgLabAboutMail = 'rmw.falcon@mail.ru';
522 MsgLabAboutMail2 = 'pssxx@mail.ru';
523 MsgLabAboutSite = 'Doom 2D: Forever Web-site';
524 MsgLabAboutHttp = 'www.doom2d.org';
526 MsgLabAddWads = 'WAD Files:';
527 MsgLabAddSections = 'WAD Sections:';
529 MsgLabSetsName = 'Map Name:';
530 MsgLabSetsDesc = 'Map Description';
531 MsgLabSetsAuthor = 'Author:';
532 MsgLabSetsBack = 'Background/Sky:';
533 MsgLabSetsMusic = 'Music:';
534 MsgLabSetsTextures = 'Textures:';
535 MsgLabSetsPanels = 'Panels:';
536 MsgLabSetsItems = 'Items:';
537 MsgLabSetsMonsters = 'Monsters:';
538 MsgLabSetsAreas = 'Areas:';
539 MsgLabSetsTriggers = 'Triggers:';
540 MsgLabSetsSizes = 'Current:';
541 MsgLabSetsWidth = 'Width:';
542 MsgLabSetsHeight = 'Height:';
543 MsgLabSetsMapmove = 'Direction to shift map objects:';
544 MsgLabSetsSnapping = 'Preserve snapping';
546 MsgLabLaunchTime = 'Time Limit:';
547 MsgLabLaunchSecs = 'seconds';
548 MsgLabLaunchScore = 'Score Limit:';
549 MsgLabLaunchPath = 'Path to Doom2DF.exe:';
550 MsgLabLaunchArgs = 'Launch Arguments:';
552 MsgLabEsGrid = 'Grid Step:';
553 MsgLabEsGridColor = 'Grid Color:';
554 MsgLabEsGridSize = 'Grid Dot Size:';
555 MsgLabEsBack = 'Background Color:';
556 MsgLabEsPreview = 'Texture Preview Background Color:';
557 MsgLabEsMinimap = 'Mini-map Scale:';
558 MsgLabEsRecent = 'Recent Maps List Contains:';
559 MsgLabEsLanguage = 'Language:';
560 MsgLabEsCompress = 'Compress archive when save';
561 MsgLabEsBackup = 'Make backup before save';
563 MsgLabPackSaveTo = 'Save to:';
564 MsgLabPackMapName = 'Map Resource Name:';
565 MsgLabPackTextures = 'Texture Section:';
566 MsgLabPackSky = 'Sky Section:';
567 MsgLabPackMusic = 'Music Section:';
569 MsgLabMiniScale = 'Scale:';
571 MsgBtnApplyProps = 'Apply Properties';
572 MsgBtnOk = 'OK';
573 MsgBtnCancel = 'Cancel';
574 MsgBtnAdd = 'Add';
575 MsgBtnClose = 'Close';
576 MsgBtnAddClose = 'Add and Close';
577 MsgBtnTestAgain = 'Check';
578 MsgBtnStart = 'Run';
579 MsgBtnPack = 'Pack';
580 MsgBtnSave = 'Save';
581 MsgBtnNoSound = 'No sound';
582 MsgBtnTextureAdd = 'Add texture to the list';
583 MsgBtnTextureDelete = 'Delete texture from the list';
584 MsgBtnTextureEmpty = 'Deselect texture';
586 MsgLoadWad = 'Reading WAD';
587 MsgLoadMap = 'Loading Map';
588 MsgLoadTextures = 'Reading Textures';
589 MsgLoadPanels = 'Reading Panels';
590 MsgLoadItems = 'Reading Items';
591 MsgLoadMonsters = 'Reading Monsters';
592 MsgLoadAreas = 'Reading Areas';
593 MsgLoadTriggers = 'Reading Triggers';
595 MsgTestAreaWall = 'Player collides with the wall and will be stuck.';
596 MsgTestAreaWallStr = 'Area #%d collides with Map (%d:%d)';
597 MsgTestSpawns1 = 'There are several spawn points for First Player on the map';
598 MsgTestSpawns2 = 'There are several spawn points for Second Player on the map';
599 MsgTestSpawns = 'There are several spawn points on the map. Random one will be used.';
600 MsgTestNoDm = 'There are no DM spawn points on the map';
601 MsgTestNoDmEx = 'There are no DM spawn points on the map. Only "Single Player" mode available.';
602 MsgTestMonsterWall = 'Monster collides with the wall and will be stuck.';
603 MsgTestMonsterWallStr = 'Monster #%d collides with a map (%d:%d)';
605 MsgOptNoTextures = 'Texture list is empty';
606 MsgOptDeletedTextures = 'Deleted Textures:';
607 MsgOptTotalTextures = 'Textures Total:';
608 MsgOptTexDeleted = 'Textures Deleted:';
609 MsgOptPanelsOpt = 'Panels Optimized:';
610 MsgOptWalls = 'Walls Optimization...';
611 MsgOptFores = 'Foreground Optimization...';
612 MsgOptBacks = 'Background Optimization...';
613 MsgOptStairs = 'Steps Optimization...';
614 MsgOptWater = 'Water Optimization...';
615 MsgOptAcid1 = 'Acid 1 Optimization...';
616 MsgOptAcid2 = 'Acid 2 Optimization...';
617 MsgOptLifts = 'Streams Optimization...';
618 MsgOptBlockmon = 'Monster Boundaries Optimization...';
619 MsgOptTotalPanels = 'Panels Total:';
620 MsgOptPanelsAfter = 'Panels after Optimization:';
622 MsgWadSpecialMap = '<MAP WAD-FILE>';
623 MsgWadSpecialTexs = '<EXTRA TEXTURES>';
625 MsgFileFilterAll = 'Doom 2D: Forever Maps (*.dfz, *.dfzip, *.zip, *.wad)|*.dfz;*.dfzip;*.zip;*.wad|Doom 2D: Forever 0.30 Maps (*.ini)|*.ini|All Files (*.*)|*.*';
626 MsgFileFilterWad = 'Doom 2D: Forever Maps (*.dfz)|*.dfz|Doom 2D: Forever Maps (*.dfzip)|*.dfzip|Doom 2D: Forever Maps (*.zip)|*.zip|Doom 2D: Forever Maps (*.wad)|*.wad|All Files (*.*)|*.*';
628 MsgEditorTitle = 'Doom 2D: Forever Map Editor';
630 Var
631 BoolNames: Array [False..True] of String;
632 DirNames: Array [D_LEFT..D_RIGHT] of String;
633 DirNamesAdv: Array [0..3] of String;
634 DirButtonNames: Array [1..4] of String;
635 PANELNAMES: Array[0..13] of String;
636 EffectNames: Array [EFFECT_NONE..EFFECT_FIRE] of String;
637 ItemNames: Array [ITEM_MEDKIT_SMALL..ITEM_MAX] of String;
638 ShotNames: Array [TRIGGER_SHOT_PISTOL..TRIGGER_SHOT_MAX] of String;
639 MonsterNames: Array [MONSTER_DEMON..MONSTER_MAN] of String;
640 AreaNames: Array [AREA_PLAYERPOINT1..AREA_BLUETEAMPOINT] of String;
641 TriggerNames: Array [TRIGGER_EXIT..TRIGGER_MAX] of String;
643 function g_Language_GetList (): TStringList;
644 procedure g_Language_Set(lang: String);
646 Implementation
648 Uses
649 g_options, IniFiles, gettext, LazFileUtils,
650 SysUtils, e_log, f_main, f_about, f_activationtype,
651 f_addresource_sky, f_addresource_sound,
652 f_addresource_texture, f_choosetype, f_keys, f_mapcheck,
653 f_mapoptions, f_mapoptimization, f_options,
654 f_packmap, f_savemap, f_saveminimap, f_selectmap, Forms, utils;
656 const
657 InSourceLanguage = 'en_US';
659 procedure SetupArrays();
660 var
661 i: Integer;
663 begin
664 // Да/Нет:
665 BoolNames[False] := MsgArrayBoolFalse;
666 BoolNames[True] := MsgArrayBoolTrue;
668 // Направления:
669 DirNames[D_LEFT] := MsgArrayDirLeft;
670 DirNames[D_RIGHT] := MsgArrayDirRight;
672 // Смены направления:
673 DirNamesAdv[0] := MsgArrayDirSame;
674 DirNamesAdv[1] := MsgArrayDirLeft;
675 DirNamesAdv[2] := MsgArrayDirRight;
676 DirNamesAdv[3] := MsgArrayDirReversed;
678 // Направление (на кнопках):
679 DirButtonNames[1] := MsgArrayDirbtnLeft;
680 DirButtonNames[2] := MsgArrayDirbtnRight;
681 DirButtonNames[3] := MsgArrayDirbtnUp;
682 DirButtonNames[4] := MsgArrayDirbtnDown;
684 // Названия панелей:
685 PANELNAMES[0] := MsgArrayPanelWall;
686 PANELNAMES[1] := MsgArrayPanelBack;
687 PANELNAMES[2] := MsgArrayPanelFront;
688 PANELNAMES[3] := MsgArrayPanelDoorOpen;
689 PANELNAMES[4] := MsgArrayPanelDoorClose;
690 PANELNAMES[5] := MsgArrayPanelStair;
691 PANELNAMES[6] := MsgArrayPanelWater;
692 PANELNAMES[7] := MsgArrayPanelAcid1;
693 PANELNAMES[8] := MsgArrayPanelAcid2;
694 PANELNAMES[9] := MsgArrayPanelLiftUp;
695 PANELNAMES[10] := MsgArrayPanelLiftDown;
696 PANELNAMES[11] := MsgArrayPanelLiftLeft;
697 PANELNAMES[12] := MsgArrayPanelLiftRight;
698 PANELNAMES[13] := MsgArrayPanelBlockmon;
700 // Названия эффектов:
701 EffectNames[EFFECT_NONE] := MsgArrayFxNone;
702 EffectNames[EFFECT_TELEPORT] := MsgArrayFxTeleport;
703 EffectNames[EFFECT_RESPAWN] := MsgArrayFxRespawn;
704 EffectNames[EFFECT_FIRE] := MsgArrayFxFire;
706 // Названия предметов:
707 ItemNames[ITEM_MEDKIT_SMALL] := MsgArrayItemMedkit;
708 ItemNames[ITEM_MEDKIT_LARGE] := MsgArrayItemLargeMedkit;
709 ItemNames[ITEM_MEDKIT_BLACK] := MsgArrayItemBlackMedkit;
710 ItemNames[ITEM_ARMOR_GREEN] := MsgArrayItemGreenArmor;
711 ItemNames[ITEM_ARMOR_BLUE] := MsgArrayItemBlueArmor;
712 ItemNames[ITEM_SPHERE_BLUE] := MsgArrayItemBlueSphere;
713 ItemNames[ITEM_SPHERE_WHITE] := MsgArrayItemMegasphere;
714 ItemNames[ITEM_SUIT] := MsgArrayItemHazSuit;
715 ItemNames[ITEM_OXYGEN] := MsgArrayItemOxygen;
716 ItemNames[ITEM_INVUL] := MsgArrayItemInvulnerability;
717 ItemNames[ITEM_WEAPON_SAW] := MsgArrayItemChainsaw;
718 ItemNames[ITEM_WEAPON_SHOTGUN1] := MsgArrayItemShotgun;
719 ItemNames[ITEM_WEAPON_SHOTGUN2] := MsgArrayItemDbShotgun;
720 ItemNames[ITEM_WEAPON_CHAINGUN] := MsgArrayItemChaingun;
721 ItemNames[ITEM_WEAPON_ROCKETLAUNCHER] := MsgArrayItemRocketLauncher;
722 ItemNames[ITEM_WEAPON_PLASMA] := MsgArrayItemPlasmaRifle;
723 ItemNames[ITEM_WEAPON_BFG] := MsgArrayItemBfg;
724 ItemNames[ITEM_WEAPON_SUPERPULEMET] := MsgArrayItemSuperMinigun;
725 ItemNames[ITEM_WEAPON_FLAMETHROWER] := MsgArrayItemFlamethrower;
726 ItemNames[ITEM_AMMO_BULLETS] := MsgArrayItemClip;
727 ItemNames[ITEM_AMMO_BULLETS_BOX] := MsgArrayItemAmmoBox;
728 ItemNames[ITEM_AMMO_SHELLS] := MsgArrayItem4Shells;
729 ItemNames[ITEM_AMMO_SHELLS_BOX] := MsgArrayItem25Shells;
730 ItemNames[ITEM_AMMO_ROCKET] := MsgArrayItem1Rocket;
731 ItemNames[ITEM_AMMO_ROCKET_BOX] := MsgArrayItemRocketBox;
732 ItemNames[ITEM_AMMO_CELL] := MsgArrayItemCell;
733 ItemNames[ITEM_AMMO_CELL_BIG] := MsgArrayItemLargeCell;
734 ItemNames[ITEM_AMMO_FUELCAN] := MsgArrayItemFuelcan;
735 ItemNames[ITEM_AMMO_BACKPACK] := MsgArrayItemBackpack;
736 ItemNames[ITEM_KEY_RED] := MsgArrayItemKeyRed;
737 ItemNames[ITEM_KEY_GREEN] := MsgArrayItemKeyGreen;
738 ItemNames[ITEM_KEY_BLUE] := MsgArrayItemKeyBlue;
739 ItemNames[ITEM_WEAPON_KASTET] := '?';
740 ItemNames[ITEM_WEAPON_PISTOL] := '??';
741 ItemNames[ITEM_BOTTLE] := MsgArrayItemBottle;
742 ItemNames[ITEM_HELMET] := MsgArrayItemHelmet;
743 ItemNames[ITEM_JETPACK] := MsgArrayItemJetpack;
744 ItemNames[ITEM_INVIS] := MsgArrayItemInvis;
746 // Названия снарядов:
747 ShotNames[TRIGGER_SHOT_PISTOL] := MsgArrayShotPistol;
748 ShotNames[TRIGGER_SHOT_BULLET] := MsgArrayShotBullet;
749 ShotNames[TRIGGER_SHOT_SHOTGUN] := MsgArrayShotShotgun;
750 ShotNames[TRIGGER_SHOT_SSG] := MsgArrayShotSsg;
751 ShotNames[TRIGGER_SHOT_IMP] := MsgArrayShotImp;
752 ShotNames[TRIGGER_SHOT_PLASMA] := MsgArrayShotPlasma;
753 ShotNames[TRIGGER_SHOT_SPIDER] := MsgArrayShotSpider;
754 ShotNames[TRIGGER_SHOT_CACO] := MsgArrayShotCaco;
755 ShotNames[TRIGGER_SHOT_BARON] := MsgArrayShotBaron;
756 ShotNames[TRIGGER_SHOT_MANCUB] := MsgArrayShotMancub;
757 ShotNames[TRIGGER_SHOT_REV] := MsgArrayShotRev;
758 ShotNames[TRIGGER_SHOT_ROCKET] := MsgArrayShotRocket;
759 ShotNames[TRIGGER_SHOT_BFG] := MsgArrayShotBfg;
760 ShotNames[TRIGGER_SHOT_EXPL] := MsgArrayShotExpl;
761 ShotNames[TRIGGER_SHOT_BFGEXPL] := MsgArrayShotBfgexpl;
762 ShotNames[TRIGGER_SHOT_FLAME] := MsgArrayShotFlame;
764 // Названия монстров:
765 MonsterNames[MONSTER_DEMON] := MsgArrayMonDemon;
766 MonsterNames[MONSTER_IMP] := MsgArrayMonImp;
767 MonsterNames[MONSTER_ZOMBY] := MsgArrayMonZombie;
768 MonsterNames[MONSTER_SERG] := MsgArrayMonSergeant;
769 MonsterNames[MONSTER_CYBER] := MsgArrayMonCyber;
770 MonsterNames[MONSTER_CGUN] := MsgArrayMonCgun;
771 MonsterNames[MONSTER_BARON] := MsgArrayMonHellBaron;
772 MonsterNames[MONSTER_KNIGHT] := MsgArrayMonHellKnight;
773 MonsterNames[MONSTER_CACO] := MsgArrayMonCacodemon;
774 MonsterNames[MONSTER_SOUL] := MsgArrayMonLostSoul;
775 MonsterNames[MONSTER_PAIN] := MsgArrayMonPainElemental;
776 MonsterNames[MONSTER_SPIDER] := MsgArrayMonMastermind;
777 MonsterNames[MONSTER_BSP] := MsgArrayMonArachnatron;
778 MonsterNames[MONSTER_MANCUB] := MsgArrayMonMancubus;
779 MonsterNames[MONSTER_SKEL] := MsgArrayMonRevenant;
780 MonsterNames[MONSTER_VILE] := MsgArrayMonArchvile;
781 MonsterNames[MONSTER_FISH] := MsgArrayMonFish;
782 MonsterNames[MONSTER_BARREL] := MsgArrayMonBarrel;
783 MonsterNames[MONSTER_ROBO] := MsgArrayMonRobot;
784 MonsterNames[MONSTER_MAN] := MsgArrayMonPrikolist;
786 // Названия областей:
787 AreaNames[AREA_PLAYERPOINT1] := MsgArrayAreaPlayerOne;
788 AreaNames[AREA_PLAYERPOINT2] := MsgArrayAreaPlayerTwo;
789 AreaNames[AREA_DMPOINT] := MsgArrayAreaDm;
790 AreaNames[AREA_REDFLAG] := MsgArrayAreaFlagRed;
791 AreaNames[AREA_BLUEFLAG] := MsgArrayAreaFlagBlue;
792 AreaNames[AREA_DOMFLAG] := MsgArrayAreaFlagDom;
793 AreaNames[AREA_REDTEAMPOINT] := MsgArrayAreaTeamRed;
794 AreaNames[AREA_BLUETEAMPOINT] := MsgArrayAreaTeamBlue;
796 // Названия триггеров:
797 TriggerNames[TRIGGER_EXIT] := MsgArrayTrExit;
798 TriggerNames[TRIGGER_TELEPORT] := MsgArrayTrTeleport;
799 TriggerNames[TRIGGER_OPENDOOR] := MsgArrayTrDoorOpen;
800 TriggerNames[TRIGGER_CLOSEDOOR] := MsgArrayTrDoorClose;
801 TriggerNames[TRIGGER_DOOR] := MsgArrayTrDoorSwitch;
802 TriggerNames[TRIGGER_DOOR5] := MsgArrayTrDoor5Sec;
803 TriggerNames[TRIGGER_CLOSETRAP] := MsgArrayTrTrapClose;
804 TriggerNames[TRIGGER_TRAP] := MsgArrayTrTrap;
805 TriggerNames[TRIGGER_PRESS] := MsgArrayTrExtend;
806 TriggerNames[TRIGGER_SECRET] := MsgArrayTrSecret;
807 TriggerNames[TRIGGER_LIFTUP] := MsgArrayTrLiftUp;
808 TriggerNames[TRIGGER_LIFTDOWN] := MsgArrayTrLiftDown;
809 TriggerNames[TRIGGER_LIFT] := MsgArrayTrLiftSwitch;
810 TriggerNames[TRIGGER_TEXTURE] := MsgArrayTrTexture;
811 TriggerNames[TRIGGER_ON] := MsgArrayTrOn;
812 TriggerNames[TRIGGER_OFF] := MsgArrayTrOff;
813 TriggerNames[TRIGGER_ONOFF] := MsgArrayTrSwitch;
814 TriggerNames[TRIGGER_SOUND] := MsgArrayTrSound;
815 TriggerNames[TRIGGER_SPAWNMONSTER] := MsgArrayTrSpawnMonster;
816 TriggerNames[TRIGGER_SPAWNITEM] := MsgArrayTrSpawnItem;
817 TriggerNames[TRIGGER_MUSIC] := MsgArrayTrMusic;
818 TriggerNames[TRIGGER_PUSH] := MsgArrayTrPush;
819 TriggerNames[TRIGGER_SCORE] := MsgArrayTrScore;
820 TriggerNames[TRIGGER_MESSAGE] := MsgArrayTrMessage;
821 TriggerNames[TRIGGER_DAMAGE] := MsgArrayTrDamage;
822 TriggerNames[TRIGGER_HEALTH] := MsgArrayTrHealth;
823 TriggerNames[TRIGGER_SHOT] := MsgArrayTrShot;
824 TriggerNames[TRIGGER_EFFECT] := MsgArrayTrEffect;
826 // Установка значений в панели выбора объектов:
827 with MainForm do
828 begin
829 lbPanelType.Items.Clear();
830 for i := 0 to High(PANELNAMES) do
831 lbPanelType.Items.Add(PANELNAMES[i]);
832 lbPanelType.ItemIndex := 0;
834 lbItemList.Clear();
835 for i := ITEM_MEDKIT_SMALL to ITEM_KEY_BLUE do
836 lbItemList.Items.Add(ItemNames[i]);
837 lbItemList.Items.Add(ItemNames[ITEM_BOTTLE]);
838 lbItemList.Items.Add(ItemNames[ITEM_HELMET]);
839 lbItemList.Items.Add(ItemNames[ITEM_JETPACK]);
840 lbItemList.Items.Add(ItemNames[ITEM_INVIS]);
841 lbItemList.Items.Add(ItemNames[ITEM_WEAPON_FLAMETHROWER]);
842 lbItemList.Items.Add(ItemNames[ITEM_AMMO_FUELCAN]);
844 lbMonsterList.Clear();
845 for i := MONSTER_DEMON to MONSTER_MAN do
846 lbMonsterList.Items.Add(MonsterNames[i]);
848 lbAreasList.Clear();
849 for i := AREA_PLAYERPOINT1 to AREA_BLUETEAMPOINT do
850 lbAreasList.Items.Add(AreaNames[i]);
852 lbTriggersList.Clear();
853 for i := Low(TriggerNames) to High(TriggerNames) do
854 lbTriggersList.Items.Add(TriggerNames[i]);
856 clbActivationType.Clear();
857 clbActivationType.Items.Add(MsgCtrlActPlayerClose);
858 clbActivationType.Items.Add(MsgCtrlActMonsterClose);
859 clbActivationType.Items.Add(MsgCtrlActPlayerPress);
860 clbActivationType.Items.Add(MsgCtrlActMonsterPress);
861 clbActivationType.Items.Add(MsgCtrlActShot);
862 clbActivationType.Items.Add(MsgCtrlActNoMonster);
864 clbKeys.Clear();
865 clbKeys.Items.Add(MsgCtrlKeysRed);
866 clbKeys.Items.Add(MsgCtrlKeysGreen);
867 clbKeys.Items.Add(MsgCtrlKeysBlue);
868 clbKeys.Items.Add(MsgCtrlKeysTeamRed);
869 clbKeys.Items.Add(MsgCtrlKeysTeamBlue);
870 end;
871 end;
873 procedure SetupCaptions();
874 var i: Integer; s: AnsiString;
875 begin
876 // Главная форма:
877 with MainForm do
878 begin
879 // Заголовок:
880 s := g_GetBuildHash(false);
881 if s = 'custom build' then
882 s := s + ' by ' + g_GetBuilderName() + ' ' + EDITOR_BUILDDATE + ' ' + EDITOR_BUILDTIME;
883 FormCaption := MsgEditorTitle + ' (' + s + ')';
884 i := Pos('-', Caption);
885 if i > 0 then
886 begin
887 Caption := FormCaption + ' ' + Copy(Caption, i, Length(Caption)-i+1);
888 end
889 else
890 Caption := FormCaption;
892 // Apple menu:
893 miAppleAbout.Caption := MsgMenuAppleAbout;
894 miApplePref.Caption := MsgMenuApplePref;
895 // File menu:
896 miMenuFile.Caption := MsgMenuFile;
897 miNewMap.Caption := MsgMenuFileNew;
898 miOpenMap.Caption := MsgMenuFileOpen;
899 miMacRecentSubMenu.Caption := MsgMenuFileRecentMac;
900 miMacRecentClear.Caption := MsgMenuFileRecentClearMac;
901 miSaveMap.Caption := MsgMenuFileSave;
902 miSaveMapAs.Caption := MsgMenuFileSaveAs;
903 miOpenWadMap.Caption := MsgMenuFileOpenWad;
904 miReopenMap.Caption := MsgMenuFileReopen;
905 miSaveMiniMap.Caption := MsgMenuFileSaveMini;
906 miDeleteMap.Caption := MsgMenuFileDelete;
907 miPackMap.Caption := MsgMenuFilePackMap;
908 miWinRecent.Caption := MsgMenuFileRecentWin;
909 miExit.Caption := MsgMenuFileExitWin;
910 // Edit menu:
911 miMenuEdit.Caption := MsgMenuEdit;
912 miUndo.Caption := MsgMenuEditUndo;
913 miCopy.Caption := MsgMenuEditCopy;
914 miCut.Caption := MsgMenuEditCut;
915 miPaste.Caption := MsgMenuEditPaste;
916 miSelectAll.Caption := MsgMenuEditSelectAll;
917 miSnapToGrid.Caption := MsgMenuEditSnapGrid;
918 miSwitchGrid.Caption := MsgMenuEditStepGrid;
919 miToFore.Caption := MsgMenuEditToFore;
920 miToBack.Caption := MsgMenuEditToBack;
921 miMapOptions.Caption := MsgMenuEditMapProps;
922 miOptions.Caption := MsgMenuEditPrefWin;
923 // View menu:
924 miMenuView.Caption := MsgMenuView;
925 miLayers.Caption := MsgMenuViewLayers;
926 miLayer1.Caption := MsgMenuLayerBack;
927 miLayer2.Caption := MsgMenuLayerWall;
928 miLayer3.Caption := MsgMenuLayerFore;
929 miLayer4.Caption := MsgMenuLayerStair;
930 miLayer5.Caption := MsgMenuLayerWater;
931 miLayer6.Caption := MsgMenuLayerItem;
932 miLayer7.Caption := MsgMenuLayerMonster;
933 miLayer8.Caption := MsgMenuLayerArea;
934 miLayer9.Caption := MsgMenuLayerTrigger;
935 miMiniMap.Caption := MsgMenuViewMinimap;
936 miShowEdges.Caption := MsgMenuViewBounds;
937 miMapPreview.Caption := MsgMenuViewPreview;
938 // Service menu:
939 miMenuService.Caption := MsgMenuServ;
940 miCheckMap.Caption := MsgMenuServTest;
941 miOptimmization.Caption := MsgMenuServOpt;
942 miTestMap.Caption := MsgMenuServLaunch;
943 // Window menu:
944 miMenuWindow.Caption := MsgMenuWindow;
945 miMacMinimize.Caption := MsgMenuWindowMinimize;
946 miMacZoom.Caption := MsgMenuWindowZoom;
947 // Help menu:
948 miMenuHelp.Caption := MsgMenuHelp;
949 miAbout.Caption := MsgMenuHelpAboutWin;
951 // Toolbar:
952 tbNewMap.Hint := MsgMenuTbNew;
953 tbOpenMap.Hint := MsgMenuTbOpen;
954 tbSaveMap.Hint := MsgMenuTbSave;
955 tbOpenWadMap.Hint := MsgMenuTbOpenWad;
956 tbShowMap.Hint := MsgMenuTbMinimap;
957 tbShow.Hint := MsgMenuTbLayers;
958 miLayerP1.Caption := MsgMenuLayerBack;
959 miLayerP2.Caption := MsgMenuLayerWall;
960 miLayerP3.Caption := MsgMenuLayerFore;
961 miLayerP4.Caption := MsgMenuLayerStair;
962 miLayerP5.Caption := MsgMenuLayerWater;
963 miLayerP6.Caption := MsgMenuLayerItem;
964 miLayerP7.Caption := MsgMenuLayerMonster;
965 miLayerP8.Caption := MsgMenuLayerArea;
966 miLayerP9.Caption := MsgMenuLayerTrigger;
967 tbGridOn.Hint := MsgMenuTbGrid;
968 tbGrid.Hint := MsgMenuTbGridStep;
969 tbTestMap.Hint := MsgMenuTbLaunch;
971 // Object property editor:
972 bApplyProperty.Caption := MsgBtnApplyProps;
973 vleObjectProperty.TitleCaptions[0] := MsgCtrlPropKey;
974 vleObjectProperty.TitleCaptions[1] := MsgCtrlPropValue;
976 // Panels Tab:
977 tsPanels.Caption := MsgCtrlPanels;
978 lbPanelType.Hint := MsgPropPanelType;
979 lbTextureList.Hint := MsgCtrlListTexture;
980 LabelTxW.Caption := MsgLabTexWidth;
981 LabelTxH.Caption := MsgLabTexHeight;
982 cbPreview.Caption := MsgCtrlPreview;
983 bbAddTexture.Hint := MsgBtnTextureAdd;
984 bbRemoveTexture.Hint := MsgBtnTextureDelete;
985 bClearTexture.Hint := MsgBtnTextureEmpty;
987 // Items Tab:
988 tsItems.Caption := MsgCtrlItems;
989 lbItemList.Hint := MsgCtrlListItem;
990 cbOnlyDM.Caption := MsgCtrlItemDm;
991 cbFall.Caption := MsgCtrlItemFalls;
993 // Monters Tab:
994 tsMonsters.Caption := MsgCtrlMonsters;
995 lbMonsterList.Hint := MsgCtrlListMonster;
996 rbMonsterLeft.Caption := MsgCtrlLeft;
997 rbMonsterRight.Caption := MsgCtrlRight;
999 // Areas Tab:
1000 tsAreas.Caption := MsgCtrlAreas;
1001 lbAreasList.Hint := MsgCtrlListArea;
1002 rbAreaLeft.Caption := MsgCtrlLeft;
1003 rbAreaRight.Caption := MsgCtrlRight;
1005 // Triggers Tab:
1006 tsTriggers.Caption := MsgCtrlTriggers;
1007 lbTriggersList.Hint := MsgCtrlListTrigger;
1008 clbActivationType.Hint := MsgCtrlListActive;
1009 clbKeys.Hint := MsgCtrlListKeys;
1010 end;
1012 // Форма "О программе":
1013 with AboutForm do
1014 begin
1015 Caption := MsgCapAbout;
1016 LabelTitle.Caption := MsgEditorTitle;
1017 LabelVer.Caption := MsgLabAboutVer;
1018 LabelAuthor.Caption := MsgLabAboutAuthor;
1019 LabelAuthor2.Caption := MsgLabAboutAuthor2;
1020 LabelMail.Caption := MsgLabAboutMail;
1021 LabelMail2.Caption := MsgLabAboutMail2;
1022 LabelSite.Caption := MsgLabAboutSite;
1023 LabelHttp.Caption := MsgLabAboutHttp;
1024 end;
1026 // Форма "Тип активации":
1027 with ActivationTypeForm do
1028 begin
1029 Caption := MsgCapAct;
1030 cbPlayerCollide.Caption := MsgCtrlActPlayerClose;
1031 cbMonsterCollide.Caption := MsgCtrlActMonsterClose;
1032 cbPlayerPress.Caption := MsgCtrlActPlayerPress;
1033 cbMonsterPress.Caption := MsgCtrlActMonsterPress;
1034 cbShot.Caption := MsgCtrlActShot;
1035 cbNoMonster.Caption := MsgCtrlActNoMonster;
1036 bOK.Caption := MsgBtnOk;
1037 end;
1039 // Форма "Выбор текстуры для неба":
1040 with AddSkyForm do
1041 begin
1042 Caption := MsgCapAddSky;
1043 LabelWADs.Caption := MsgLabAddWads;
1044 LabelSections.Caption := MsgLabAddSections;
1045 bOK.Caption := MsgBtnOk;
1046 bCancel.Caption := MsgBtnCancel;
1047 end;
1049 // Форма "Выбор звука или музыки":
1050 with AddSoundForm do
1051 begin
1052 Caption := MsgCapAddSound;
1053 LabelWADs.Caption := MsgLabAddWads;
1054 LabelSections.Caption := MsgLabAddSections;
1055 bOK.Caption := MsgBtnOk;
1056 bCancel.Caption := MsgBtnCancel;
1057 bEmpty.Caption := MsgBtnNoSound;
1058 end;
1060 // Форма "Выбор текстуры":
1061 with AddTextureForm do
1062 begin
1063 Caption := MsgCapAddTexture;
1064 LabelWADs.Caption := MsgLabAddWads;
1065 LabelSections.Caption := MsgLabAddSections;
1066 bAddTexture.Caption := MsgBtnAdd;
1067 bClose.Caption := MsgBtnClose;
1068 bAddClose.Caption := MsgBtnAddClose;
1069 end;
1071 // Форма "Выбор типа монстра" / "Выбор типа предмета":
1072 ChooseTypeForm.bOK.Caption := MsgBtnOk;
1074 // Форма "Ключи":
1075 with KeysForm do
1076 begin
1077 Caption := MsgCapKeys;
1078 cbRedKey.Caption := MsgCtrlKeysRed;
1079 cbGreenKey.Caption := MsgCtrlKeysGreen;
1080 cbBlueKey.Caption := MsgCtrlKeysBlue;
1081 cbRedTeam.Caption := MsgCtrlKeysTeamRed;
1082 cbBlueTeam.Caption := MsgCtrlKeysTeamBlue;
1083 bOK.Caption := MsgBtnOk;
1084 end;
1086 // Форма "Проверка карты":
1087 with MapCheckForm do
1088 begin
1089 Caption := MsgCapTest;
1090 bCheckMap.Caption := MsgBtnTestAgain;
1091 bClose.Caption := MsgBtnClose;
1092 end;
1094 // Форма "Оптимизация карты":
1095 with MapOptimizationForm do
1096 begin
1097 Caption := MsgCapOpt;
1098 // Выбор оптимизации:
1099 GroupBoxOpt.Caption := MsgCtrlOptGb;
1100 rbTexturesOptimization.Caption := MsgCtrlOptTexture;
1101 rbPanelsOptimization.Caption := MsgCtrlOptPanel;
1102 // Оптимизация текстур:
1103 bBeginTextureOptimization.Caption := MsgBtnStart;
1104 // Оптимизация панелей:
1105 cbOptimizeWalls.Caption := MsgCtrlOptWall;
1106 cbOptimizeForeGround.Caption := MsgCtrlOptFore;
1107 cbOptimizeBackGround.Caption := MsgCtrlOptBack;
1108 cbOptimizeSteps.Caption := MsgCtrlOptStair;
1109 cbOptimizeWater.Caption := MsgCtrlOptWater;
1110 cbOptimizeAcid1.Caption := MsgCtrlOptAcid1;
1111 cbOptimizeAcid2.Caption := MsgCtrlOptAcid2;
1112 cbOptimizeLift.Caption := MsgCtrlOptLift;
1113 cbOptimizeBlockMon.Caption := MsgCtrlOptBlockmon;
1114 bBeginPanelsOptimization.Caption := MsgBtnStart;
1115 end;
1117 // Форма "Параметры карты":
1118 with MapOptionsForm do
1119 begin
1120 Caption := MsgCapSets;
1121 // Основные параметры:
1122 LabelName.Caption := MsgLabSetsName;
1123 LabelDesc.Caption := MsgLabSetsDesc;
1124 LabelAuthor.Caption := MsgLabSetsAuthor;
1125 LabelBack.Caption := MsgLabSetsBack;
1126 LabelMusic.Caption := MsgLabSetsMusic;
1127 // Статистика:
1128 GBStats.Caption := MsgCtrlSetsStats;
1129 LabelTexs.Caption := MsgLabSetsTextures;
1130 LabelPanels.Caption := MsgLabSetsPanels;
1131 LabelItems.Caption := MsgLabSetsItems;
1132 LabelMonsters.Caption := MsgLabSetsMonsters;
1133 LabelAreas.Caption := MsgLabSetsAreas;
1134 LabelTriggers.Caption := MsgLabSetsTriggers;
1135 // Размеры:
1136 GBSizes.Caption := MsgCtrlSetsSizes;
1137 LabelWidth.Caption := MsgLabSetsWidth;
1138 LabelHeight.Caption := MsgLabSetsHeight;
1139 LabelCurSize.Caption := MsgLabSetsSizes;
1140 LabelMapMove.Caption := MsgLabSetsMapmove;
1141 cbSnapping.Caption := MsgLabSetsSnapping;
1142 // Кнопки:
1143 bOK.Caption := MsgBtnOk;
1144 bCancel.Caption := MsgBtnCancel;
1145 end;
1147 // From "Editor settings":
1148 with OptionsForm do
1149 begin
1150 Caption := MsgCapEs;
1151 bOK.Caption := MsgBtnOk;
1152 bCancel.Caption := MsgBtnCancel;
1153 // TabGeneral:
1154 cbShowDots.Caption := MsgCtrlEsGrid;
1155 cbShowTexture.Caption := MsgCtrlEsTexture;
1156 cbShowSize.Caption := MsgCtrlEsPanelSize;
1157 cbCheckerboard.Caption := MsgCtrlEsCheckerboard;
1158 LabelGrid.Caption := MsgLabEsGrid;
1159 LabelGridCol.Caption := MsgLabEsGridColor;
1160 LabelGridSize.Caption := MsgLabEsGridSize;
1161 LabelBack.Caption := MsgLabEsBack;
1162 LabelPreview.Caption := MsgLabEsPreview;
1163 LabelMinimap.Caption := MsgLabEsMinimap;
1164 LabelLanguage.Caption := MsgLabEsLanguage;
1165 // TabFiles:
1166 cbCompress.Caption := MsgLabEsCompress;
1167 cbBackup.Caption := MsgLabEsBackup;
1168 LabelRecent.Caption := MsgLabEsRecent;
1169 // TabTesting:
1170 rbDM.Caption := MsgCtrlLaunchDm;
1171 rbTDM.Caption := MsgCtrlLaunchTdm;
1172 rbCTF.Caption := MsgCtrlLaunchCtf;
1173 rbCOOP.Caption := MsgCtrlLaunchCoop;
1174 cbTwoPlayers.Caption := MsgCtrlLaunch2p;
1175 cbTeamDamage.Caption := MsgCtrlLaunchFf;
1176 cbAllowExit.Caption := MsgCtrlLaunchExit;
1177 cbWeaponStay.Caption := MsgCtrlLaunchWeapons;
1178 cbMonstersDM.Caption := MsgCtrlLaunchMonsters;
1179 cbMapOnce.Caption := MsgCtrlLaunchClose;
1180 LabelTime.Caption := MsgLabLaunchTime;
1181 LabelSecs.Caption := MsgLabLaunchSecs;
1182 LabelScore.Caption := MsgLabLaunchScore;
1183 LabelPath.Caption := MsgLabLaunchPath;
1184 FindD2dDialog.Title := MsgCtrlLaunchOpen;
1185 LabelArgs.Caption := MsgLabLaunchArgs;
1186 end;
1188 // Форма "Упаковать карту":
1189 with PackMapForm do
1190 begin
1191 Caption := MsgCapPack;
1192 bPack.Caption := MsgBtnPack;
1193 LabelSaveTo.Caption := MsgLabPackSaveTo;
1194 LabelMapName.Caption := MsgLabPackMapName;
1195 // Что упаковывать:
1196 cbTextrures.Caption := MsgCtrlPackTextures;
1197 LabelTextures.Caption := MsgLabPackTextures;
1198 cbSky.Caption := MsgCtrlPackSky;
1199 LabelSky.Caption := MsgLabPackSky;
1200 cbMusic.Caption := MsgCtrlPackMusic;
1201 LabelMusic.Caption := MsgLabPackMusic;
1202 cbAdd.Caption := MsgCtrlPackAdd;
1203 cbNonStandart.Caption := MsgCtrlPackNonStd;
1204 end;
1206 // Форма "Сохранить карту":
1207 with SaveMapForm do
1208 begin
1209 Caption := MsgCapSave;
1210 bOK.Caption := MsgBtnOk;
1211 bCancel.Caption := MsgBtnCancel;
1212 end;
1214 // Форма "Сохранить мини-карту":
1215 with SaveMiniMapForm do
1216 begin
1217 Caption := MsgCapMini;
1218 LabelScale.Caption := MsgLabMiniScale;
1219 bSave.Caption := MsgBtnSave;
1220 bClose.Caption := MsgBtnClose;
1221 end;
1223 // Форма "Выбор карты":
1224 with SelectMapForm do
1225 begin
1226 Caption := MsgCapSelect;
1227 bOK.Caption := MsgBtnOk;
1228 bCancel.Caption := MsgBtnCancel;
1229 end;
1231 // Заголовок приложения:
1232 Application.Title := MsgEditorTitle;
1233 end;
1235 type
1236 TResArg = record
1237 ini: TIniFile;
1238 ignored: TStringList;
1239 end;
1240 PResArg = ^TResArg;
1242 function gResourceItarator (name, value: AnsiString; hash: LongInt; arg: Pointer): AnsiString;
1243 var res: PResArg; orig: AnsiString;
1244 begin
1245 res := PResArg(arg);
1246 orig := res.ini.ReadString('resourcestring', name + '$', '');
1247 if (orig = '') or (orig = value) then
1248 begin
1249 if res.ini.ValueExists('resourcestring', name) then
1250 begin
1251 result := res.ini.ReadString('resourcestring', name, '');
1252 end
1253 else
1254 begin
1255 result := value;
1256 if res.ignored.IndexOf(Copy(name, 1, Pos('.', name) - 1)) < 0 then
1257 e_WriteLog(' Seems that key ' + name + ' not translated', MSG_NOTIFY);
1258 end;
1259 end
1260 else
1261 begin
1262 e_WriteLog(' Original resource string for ' + name + ' do not match, translation are outdated?', MSG_WARNING);
1263 e_WriteLog(' [' + value + '] -> [' + orig + ']', MSG_WARNING);
1264 result := value;
1265 end;
1266 end;
1268 procedure gSetLanguageFormStream (const lang: AnsiString; stream: TStream; out ok: Boolean);
1269 var res: TResArg;
1270 begin
1271 ok := False;
1272 try
1273 res.ini := TIniFile.Create(stream, [ifoStripComments, ifoStripQuotes, ifoEscapeLineFeeds]);
1274 except
1275 res.ini := nil;
1276 end;
1277 if res.ini <> nil then
1278 begin
1279 try
1280 ok := res.ini.SectionExists('resourcestring');
1281 if ok then
1282 begin
1283 res.ignored := TStringList.Create;
1284 res.ignored.CaseSensitive := False;
1285 res.ini.ReadSection('ignore', res.ignored);
1286 res.ignored.Sort;
1287 SetResourceStrings(gResourceItarator, @res);
1288 res.ignored.Free();
1289 end;
1290 finally
1291 res.ini.Free();
1292 end;
1293 end;
1294 if not ok then e_WriteLog('Translation file for ' + lang + ' are invalid ', MSG_FATALERROR);
1295 end;
1297 procedure gSetLanguageFromFile (const lang: AnsiString; out ok: Boolean);
1298 const langfilename = 'editor';
1299 var stream: TFileStream; name: AnsiString;
1300 begin
1301 name := LangDir + DirectorySeparator + langfilename + '.' + lang + '.lng';
1302 try
1303 stream := TFileStream.Create(name, fmOpenRead);
1304 try
1305 gSetLanguageFormStream(lang, stream, ok);
1306 finally
1307 stream.Free();
1308 end;
1309 except on E: EFOpenError do
1310 ok := False;
1311 end;
1312 end;
1314 procedure gSetLanguage (const lang: AnsiString; out ok: Boolean);
1315 begin
1316 gSetLanguageFromFile(lang, ok);
1317 end;
1319 function g_Language_GetList (): TStringList;
1320 const langfilename = 'editor';
1321 var list: TStringList; info: TSearchRec;
1322 begin
1323 list := TStringList.Create;
1324 list.Duplicates := dupIgnore;
1325 list.Add(InSourceLanguage);
1326 if FindFirst(LangDir + DirectorySeparator + langfilename + '.*.lng', faAnyFile, info) = 0 then
1327 begin
1328 repeat
1329 list.Add(Copy(ExtractFileNameWithoutExt(info.Name), Length(langfilename) + 2));
1330 until FindNext(info) <> 0;
1331 FindClose(info);
1332 end;
1333 list.Sort;
1334 result := list;
1335 end;
1337 procedure g_Language_Set(lang: String);
1338 var syslang, fallbacklang: String; ok: Boolean;
1339 begin
1340 ResetResourceTables;
1342 if lang = '' then
1343 begin
1344 GetLanguageIDs(syslang, fallbacklang); // TODO: remove dependency on gettext
1345 e_WriteLog('g_Language_Set: try strings "' + syslang + '" (system)', MSG_NOTIFY);
1346 gSetLanguage(syslang, ok);
1347 if not ok then
1348 begin
1349 e_WriteLog('g_Language_Set: try strings "' + fallbacklang + '" (fallback)', MSG_NOTIFY);
1350 gSetLanguage(syslang, ok);
1351 end;
1352 end
1353 else
1354 begin
1355 e_WriteLog('g_Language_Set: try strings "' + lang + '" (user specified)', MSG_NOTIFY);
1356 gSetLanguage(lang, ok);
1357 end;
1358 if not ok then e_WriteLog('g_Language_Set: use default strings "' + InSourceLanguage + '" (in-source)', MSG_NOTIFY);
1360 SetupArrays();
1361 SetupCaptions();
1362 RemoveSelectFromObjects();
1363 end;
1365 End.