DEADSOFTWARE

i10n: use custom format for translations instead of gettext
[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 MsgMenuFile = 'File';
343 MsgMenuFileNew = 'New';
344 MsgMenuFileOpen = 'Open...';
345 MsgMenuFileSave = 'Save';
346 MsgMenuFileSaveAs = 'Save As...';
347 MsgMenuFileOpenWad = 'Select Map...';
348 MsgMenuFileReopen = 'Revert to Saved';
349 MsgMenuFileSaveMini = 'Save Minimap...';
350 MsgMenuFileDelete = 'Delete from WAD...';
351 MsgMenuFilePackMap = 'Pack to WAD...';
352 MsgMenuFileExit = 'Exit';
354 MsgMenuEdit = 'Edit';
355 MsgMenuEditUndo = 'Undo';
356 MsgMenuEditCopy = 'Copy';
357 MsgMenuEditCut = 'Cut';
358 MsgMenuEditPaste = 'Paste';
359 MsgMenuEditSelectAll = 'Select All';
360 MsgMenuEditToFore = 'Bring to Front';
361 MsgMenuEditToBack = 'Send to Back';
363 MsgMenuTools = 'Tools';
364 MsgMenuToolsSnapGrid = 'Snap to Grid';
365 MsgMenuToolsMinimap = 'Show Minimap';
366 MsgMenuToolsStepGrid = 'Switch Grid Granularity';
367 MsgMenuToolsShowEdges = 'Show Map Bounds';
368 MsgMenuToolsLayers = 'Layers';
370 MsgMenuServ = 'Service';
371 MsgMenuServTest = 'Analyse Map...';
372 MsgMenuServOpt = 'Optimize Map...';
373 MsgMenuServPreview = 'Preview Mode';
374 MsgMenuServLaunch = 'Run Test';
376 MsgMenuSets = 'Settings';
377 MsgMenuSetsMap = 'Map Properties...';
378 MsgMenuSetsEditor = 'Preferences...';
379 MsgMenuSetsLaunch = 'In-game test settings';
381 MsgMenuHelp = 'Help';
382 MsgMenuHelpAbout = 'About';
384 MsgMenuLayerBack = '1. Background';
385 MsgMenuLayerWall = '2. Walls';
386 MsgMenuLayerFore = '3. Foreground';
387 MsgMenuLayerStair = '4. Steps';
388 MsgMenuLayerWater = '5. Liquids';
389 MsgMenuLayerItem = '6. Items';
390 MsgMenuLayerMonster = '7. Monsters';
391 MsgMenuLayerArea = '8. Areas';
392 MsgMenuLayerTrigger = '9. Triggers';
394 MsgMenuTbNew = 'New Map';
395 MsgMenuTbOpen = 'Open Map';
396 MsgMenuTbSave = 'Save Map';
397 MsgMenuTbOpenWad = 'Open another Map from same WAD';
398 MsgMenuTbMinimap = 'Show Mini-map';
399 MsgMenuTbLayers = 'Show/Hide Objects';
400 MsgMenuTbGrid = 'Grid On/Off';
401 MsgMenuTbGridStep = 'Switch Grid step';
402 MsgMenuTbLaunch = 'Run Test';
404 MsgMenuLaunchSets = 'Settings...';
406 MsgCapFxType = 'Select Effect type';
407 MsgCapMonsterType = 'Select Monster type';
408 MsgCapItemType = 'Select Item type';
409 MsgCapAbout = 'About Map Editor';
410 MsgCapAct = 'Activation type';
411 MsgCapAddSky = 'Select Sky Texture';
412 MsgCapAddSound = 'Select Sound/Music';
413 MsgCapAddTexture = 'Select Texture';
414 MsgCapKeys = 'Keys';
415 MsgCapTest = 'Analyse Map';
416 MsgCapOpt = 'Optimize Map';
417 MsgCapSets = 'Map Properties';
418 MsgCapLaunch = 'In-game test Settings';
419 MsgCapEs = 'Editor Preferences';
420 MsgCapPack = 'Pack Map';
421 MsgCapSave = 'Save Map';
422 MsgCapMini = 'Save Minimap';
423 MsgCapSelect = 'Select Map';
424 MsgCapOpen = 'Open Map';
425 MsgCapRemove = 'Remove Map';
426 MsgCapTexture = 'Texture: %dx%d';
427 MsgCapAnimation = 'Animation: %dx%d, %d frames';
428 MsgCapStatSelected = 'Selected objects: %d';
430 MsgCtrlPropKey = 'Property';
431 MsgCtrlPropValue = 'Value';
433 MsgCtrlPanels = 'Panels';
434 MsgCtrlItems = 'Items';
435 MsgCtrlMonsters = 'Monsters';
436 MsgCtrlAreas = 'Areas';
437 MsgCtrlTriggers = 'Triggers';
439 MsgCtrlListTexture = 'Texture List';
440 MsgCtrlListItem = 'Item List';
441 MsgCtrlListMonster = 'Monster List';
442 MsgCtrlListArea = 'Area List';
443 MsgCtrlListTrigger = 'Trigger List';
444 MsgCtrlListActive = 'Activation Type';
445 MsgCtrlListKeys = 'Keys Needed';
447 MsgCtrlPreview = 'Texture Preview';
448 MsgCtrlItemDm = 'DM Only';
449 MsgCtrlItemFalls = 'Falls';
450 MsgCtrlLeft = 'Left';
451 MsgCtrlRight = 'Right';
453 MsgCtrlActPlayerClose = 'Player Collides';
454 MsgCtrlActMonsterClose = 'Monster Collides';
455 MsgCtrlActPlayerPress = 'Player Pressed';
456 MsgCtrlActMonsterPress = 'Monster Pressed';
457 MsgCtrlActShot = 'Shot';
458 MsgCtrlActNoMonster = 'No Monsters';
460 MsgCtrlKeysRed = 'Red Key';
461 MsgCtrlKeysGreen = 'Green Key';
462 MsgCtrlKeysBlue = 'Blue Key';
463 MsgCtrlKeysTeamRed = 'Red Team';
464 MsgCtrlKeysTeamBlue = 'Blue Team';
466 MsgCtrlOptGb = 'Optimization';
467 MsgCtrlOptTexture = 'Texture Optimization';
468 MsgCtrlOptPanel = 'Panel Optimization';
469 MsgCtrlOptWall = 'Walls';
470 MsgCtrlOptFore = 'Foreground';
471 MsgCtrlOptBack = 'Background';
472 MsgCtrlOptStair = 'Steps';
473 MsgCtrlOptWater = 'Water';
474 MsgCtrlOptAcid1 = 'Acid 1';
475 MsgCtrlOptAcid2 = 'Acid 2';
476 MsgCtrlOptLift = 'Streams';
477 MsgCtrlOptBlockmon = 'Monster Boundary';
478 MsgCtrlOptDescTexture = 'Deletes unused textures from texture list.';
479 MsgCtrlOptDescPanel = 'Merges nearby panels of same type. Increases game performance.';
480 MsgCtrlSetsStats = 'Statistics:';
481 MsgCtrlSetsSizes = 'Map Size:';
483 MsgCtrlLaunchDm = 'Deathmatch';
484 MsgCtrlLaunchTdm = 'Team Deathmatch';
485 MsgCtrlLaunchCtf = 'Capture the Flag';
486 MsgCtrlLaunchCoop = 'Cooperative';
487 MsgCtrlLaunch2p = 'Two Players';
488 MsgCtrlLaunchFf = 'Friendly Fire';
489 MsgCtrlLaunchExit = 'Enable Exit';
490 MsgCtrlLaunchWeapons = 'Weapons Stay';
491 MsgCtrlLaunchMonsters = 'Enable Monsters';
492 MsgCtrlLaunchClose = 'Close the game after exiting the map';
493 MsgCtrlLaunchOpen = 'Select Doom 2D: Forever executable';
495 MsgCtrlEsGrid = 'Show Grid';
496 MsgCtrlEsTexture = 'Show Panel Texture';
497 MsgCtrlEsPanelSize = 'Show Panel Size';
498 MsgCtrlEsCheckerboard = 'Use Checkerboard';
500 MsgCtrlPackTextures = 'Textures';
501 MsgCtrlPackSky = 'Sky';
502 MsgCtrlPackMusic = 'Music';
503 MsgCtrlPackAdd = 'Don''t overwrite WAD';
504 MsgCtrlPackNonStd = 'Non-standard Resources only';
506 MsgLabTexWidth = 'Texture Width:';
507 MsgLabTexHeight = 'Texture Height:';
509 MsgLabSpectrum = 'Show the Spectrum';
511 MsgLabAboutVer = 'Version 2.1.5';
512 MsgLabAboutAuthor = 'Author: rs.falcon';
513 MsgLabAboutAuthor2 = 'Additions: Pss';
514 MsgLabAboutMail = 'rmw.falcon@mail.ru';
515 MsgLabAboutMail2 = 'pssxx@mail.ru';
516 MsgLabAboutSite = 'Doom 2D: Forever Web-site';
517 MsgLabAboutHttp = 'www.doom2d.org';
519 MsgLabAddWads = 'WAD Files:';
520 MsgLabAddSections = 'WAD Sections:';
522 MsgLabSetsName = 'Map Name:';
523 MsgLabSetsDesc = 'Map Description';
524 MsgLabSetsAuthor = 'Author:';
525 MsgLabSetsBack = 'Background/Sky:';
526 MsgLabSetsMusic = 'Music:';
527 MsgLabSetsTextures = 'Textures:';
528 MsgLabSetsPanels = 'Panels:';
529 MsgLabSetsItems = 'Items:';
530 MsgLabSetsMonsters = 'Monsters:';
531 MsgLabSetsAreas = 'Areas:';
532 MsgLabSetsTriggers = 'Triggers:';
533 MsgLabSetsSizes = 'Current:';
534 MsgLabSetsWidth = 'Width:';
535 MsgLabSetsHeight = 'Height:';
536 MsgLabSetsMapmove = 'Direction to shift map objects:';
537 MsgLabSetsSnapping = 'Preserve snapping';
539 MsgLabLaunchTime = 'Time Limit:';
540 MsgLabLaunchSecs = 'seconds';
541 MsgLabLaunchScore = 'Score Limit:';
542 MsgLabLaunchPath = 'Path to Doom2DF.exe:';
543 MsgLabLaunchArgs = 'Launch Arguments:';
545 MsgLabEsGrid = 'Grid Step:';
546 MsgLabEsGridColor = 'Grid Color:';
547 MsgLabEsGridSize = 'Grid Dot Size:';
548 MsgLabEsBack = 'Background Color:';
549 MsgLabEsPreview = 'Texture Preview Background Color:';
550 MsgLabEsMinimap = 'Mini-map Scale:';
551 MsgLabEsRecent = 'Recent Maps List Contains:';
552 MsgLabEsLanguage = 'Language:';
553 MsgLabEsCompress = 'Compress archive when save';
554 MsgLabEsBackup = 'Make backup before save';
556 MsgLabPackSaveTo = 'Save to:';
557 MsgLabPackMapName = 'Map Resource Name:';
558 MsgLabPackTextures = 'Texture Section:';
559 MsgLabPackSky = 'Sky Section:';
560 MsgLabPackMusic = 'Music Section:';
562 MsgLabMiniScale = 'Scale:';
564 MsgBtnApplyProps = 'Apply Properties';
565 MsgBtnOk = 'OK';
566 MsgBtnCancel = 'Cancel';
567 MsgBtnAdd = 'Add';
568 MsgBtnClose = 'Close';
569 MsgBtnAddClose = 'Add and Close';
570 MsgBtnTestAgain = 'Check';
571 MsgBtnStart = 'Run';
572 MsgBtnPack = 'Pack';
573 MsgBtnSave = 'Save';
574 MsgBtnNoSound = 'No sound';
575 MsgBtnTextureAdd = 'Add texture to the list';
576 MsgBtnTextureDelete = 'Delete texture from the list';
577 MsgBtnTextureEmpty = 'Deselect texture';
579 MsgLoadWad = 'Reading WAD';
580 MsgLoadMap = 'Loading Map';
581 MsgLoadTextures = 'Reading Textures';
582 MsgLoadPanels = 'Reading Panels';
583 MsgLoadItems = 'Reading Items';
584 MsgLoadMonsters = 'Reading Monsters';
585 MsgLoadAreas = 'Reading Areas';
586 MsgLoadTriggers = 'Reading Triggers';
588 MsgTestAreaWall = 'Player collides with the wall and will be stuck.';
589 MsgTestAreaWallStr = 'Area #%d collides with Map (%d:%d)';
590 MsgTestSpawns1 = 'There are several spawn points for First Player on the map';
591 MsgTestSpawns2 = 'There are several spawn points for Second Player on the map';
592 MsgTestSpawns = 'There are several spawn points on the map. Random one will be used.';
593 MsgTestNoDm = 'There are no DM spawn points on the map';
594 MsgTestNoDmEx = 'There are no DM spawn points on the map. Only "Single Player" mode available.';
595 MsgTestMonsterWall = 'Monster collides with the wall and will be stuck.';
596 MsgTestMonsterWallStr = 'Monster #%d collides with a map (%d:%d)';
598 MsgOptNoTextures = 'Texture list is empty';
599 MsgOptDeletedTextures = 'Deleted Textures:';
600 MsgOptTotalTextures = 'Textures Total:';
601 MsgOptTexDeleted = 'Textures Deleted:';
602 MsgOptPanelsOpt = 'Panels Optimized:';
603 MsgOptWalls = 'Walls Optimization...';
604 MsgOptFores = 'Foreground Optimization...';
605 MsgOptBacks = 'Background Optimization...';
606 MsgOptStairs = 'Steps Optimization...';
607 MsgOptWater = 'Water Optimization...';
608 MsgOptAcid1 = 'Acid 1 Optimization...';
609 MsgOptAcid2 = 'Acid 2 Optimization...';
610 MsgOptLifts = 'Streams Optimization...';
611 MsgOptBlockmon = 'Monster Boundaries Optimization...';
612 MsgOptTotalPanels = 'Panels Total:';
613 MsgOptPanelsAfter = 'Panels after Optimization:';
615 MsgWadSpecialMap = '<MAP WAD-FILE>';
616 MsgWadSpecialTexs = '<EXTRA TEXTURES>';
618 MsgFileFilterAll = 'Doom 2D: Forever Maps (*.dfz, *.dfzip, *.zip, *.wad)|*.dfz;*.dfzip;*.zip;*.wad|Doom 2D: Forever 0.30 Maps (*.ini)|*.ini|All Files (*.*)|*.*';
619 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 (*.*)|*.*';
621 MsgEditorTitle = 'Doom 2D: Forever Map Editor';
623 Var
624 BoolNames: Array [False..True] of String;
625 DirNames: Array [D_LEFT..D_RIGHT] of String;
626 DirNamesAdv: Array [0..3] of String;
627 DirButtonNames: Array [1..4] of String;
628 PANELNAMES: Array[0..13] of String;
629 EffectNames: Array [EFFECT_NONE..EFFECT_FIRE] of String;
630 ItemNames: Array [ITEM_MEDKIT_SMALL..ITEM_MAX] of String;
631 ShotNames: Array [TRIGGER_SHOT_PISTOL..TRIGGER_SHOT_MAX] of String;
632 MonsterNames: Array [MONSTER_DEMON..MONSTER_MAN] of String;
633 AreaNames: Array [AREA_PLAYERPOINT1..AREA_BLUETEAMPOINT] of String;
634 TriggerNames: Array [TRIGGER_EXIT..TRIGGER_MAX] of String;
636 function g_Language_GetList (): TStringList;
637 procedure g_Language_Set(lang: String);
639 Implementation
641 Uses
642 g_options, IniFiles, gettext, LazFileUtils,
643 SysUtils, e_log, f_main, f_about, f_activationtype,
644 f_addresource_sky, f_addresource_sound,
645 f_addresource_texture, f_choosetype, f_keys, f_mapcheck,
646 f_mapoptions, f_mapoptimization, f_options,
647 f_packmap, f_savemap, f_saveminimap, f_selectmap, Forms, utils;
649 const
650 InSourceLanguage = 'en_US';
652 procedure SetupArrays();
653 var
654 i: Integer;
656 begin
657 // Да/Нет:
658 BoolNames[False] := MsgArrayBoolFalse;
659 BoolNames[True] := MsgArrayBoolTrue;
661 // Направления:
662 DirNames[D_LEFT] := MsgArrayDirLeft;
663 DirNames[D_RIGHT] := MsgArrayDirRight;
665 // Смены направления:
666 DirNamesAdv[0] := MsgArrayDirSame;
667 DirNamesAdv[1] := MsgArrayDirLeft;
668 DirNamesAdv[2] := MsgArrayDirRight;
669 DirNamesAdv[3] := MsgArrayDirReversed;
671 // Направление (на кнопках):
672 DirButtonNames[1] := MsgArrayDirbtnLeft;
673 DirButtonNames[2] := MsgArrayDirbtnRight;
674 DirButtonNames[3] := MsgArrayDirbtnUp;
675 DirButtonNames[4] := MsgArrayDirbtnDown;
677 // Названия панелей:
678 PANELNAMES[0] := MsgArrayPanelWall;
679 PANELNAMES[1] := MsgArrayPanelBack;
680 PANELNAMES[2] := MsgArrayPanelFront;
681 PANELNAMES[3] := MsgArrayPanelDoorOpen;
682 PANELNAMES[4] := MsgArrayPanelDoorClose;
683 PANELNAMES[5] := MsgArrayPanelStair;
684 PANELNAMES[6] := MsgArrayPanelWater;
685 PANELNAMES[7] := MsgArrayPanelAcid1;
686 PANELNAMES[8] := MsgArrayPanelAcid2;
687 PANELNAMES[9] := MsgArrayPanelLiftUp;
688 PANELNAMES[10] := MsgArrayPanelLiftDown;
689 PANELNAMES[11] := MsgArrayPanelLiftLeft;
690 PANELNAMES[12] := MsgArrayPanelLiftRight;
691 PANELNAMES[13] := MsgArrayPanelBlockmon;
693 // Названия эффектов:
694 EffectNames[EFFECT_NONE] := MsgArrayFxNone;
695 EffectNames[EFFECT_TELEPORT] := MsgArrayFxTeleport;
696 EffectNames[EFFECT_RESPAWN] := MsgArrayFxRespawn;
697 EffectNames[EFFECT_FIRE] := MsgArrayFxFire;
699 // Названия предметов:
700 ItemNames[ITEM_MEDKIT_SMALL] := MsgArrayItemMedkit;
701 ItemNames[ITEM_MEDKIT_LARGE] := MsgArrayItemLargeMedkit;
702 ItemNames[ITEM_MEDKIT_BLACK] := MsgArrayItemBlackMedkit;
703 ItemNames[ITEM_ARMOR_GREEN] := MsgArrayItemGreenArmor;
704 ItemNames[ITEM_ARMOR_BLUE] := MsgArrayItemBlueArmor;
705 ItemNames[ITEM_SPHERE_BLUE] := MsgArrayItemBlueSphere;
706 ItemNames[ITEM_SPHERE_WHITE] := MsgArrayItemMegasphere;
707 ItemNames[ITEM_SUIT] := MsgArrayItemHazSuit;
708 ItemNames[ITEM_OXYGEN] := MsgArrayItemOxygen;
709 ItemNames[ITEM_INVUL] := MsgArrayItemInvulnerability;
710 ItemNames[ITEM_WEAPON_SAW] := MsgArrayItemChainsaw;
711 ItemNames[ITEM_WEAPON_SHOTGUN1] := MsgArrayItemShotgun;
712 ItemNames[ITEM_WEAPON_SHOTGUN2] := MsgArrayItemDbShotgun;
713 ItemNames[ITEM_WEAPON_CHAINGUN] := MsgArrayItemChaingun;
714 ItemNames[ITEM_WEAPON_ROCKETLAUNCHER] := MsgArrayItemRocketLauncher;
715 ItemNames[ITEM_WEAPON_PLASMA] := MsgArrayItemPlasmaRifle;
716 ItemNames[ITEM_WEAPON_BFG] := MsgArrayItemBfg;
717 ItemNames[ITEM_WEAPON_SUPERPULEMET] := MsgArrayItemSuperMinigun;
718 ItemNames[ITEM_WEAPON_FLAMETHROWER] := MsgArrayItemFlamethrower;
719 ItemNames[ITEM_AMMO_BULLETS] := MsgArrayItemClip;
720 ItemNames[ITEM_AMMO_BULLETS_BOX] := MsgArrayItemAmmoBox;
721 ItemNames[ITEM_AMMO_SHELLS] := MsgArrayItem4Shells;
722 ItemNames[ITEM_AMMO_SHELLS_BOX] := MsgArrayItem25Shells;
723 ItemNames[ITEM_AMMO_ROCKET] := MsgArrayItem1Rocket;
724 ItemNames[ITEM_AMMO_ROCKET_BOX] := MsgArrayItemRocketBox;
725 ItemNames[ITEM_AMMO_CELL] := MsgArrayItemCell;
726 ItemNames[ITEM_AMMO_CELL_BIG] := MsgArrayItemLargeCell;
727 ItemNames[ITEM_AMMO_FUELCAN] := MsgArrayItemFuelcan;
728 ItemNames[ITEM_AMMO_BACKPACK] := MsgArrayItemBackpack;
729 ItemNames[ITEM_KEY_RED] := MsgArrayItemKeyRed;
730 ItemNames[ITEM_KEY_GREEN] := MsgArrayItemKeyGreen;
731 ItemNames[ITEM_KEY_BLUE] := MsgArrayItemKeyBlue;
732 ItemNames[ITEM_WEAPON_KASTET] := '?';
733 ItemNames[ITEM_WEAPON_PISTOL] := '??';
734 ItemNames[ITEM_BOTTLE] := MsgArrayItemBottle;
735 ItemNames[ITEM_HELMET] := MsgArrayItemHelmet;
736 ItemNames[ITEM_JETPACK] := MsgArrayItemJetpack;
737 ItemNames[ITEM_INVIS] := MsgArrayItemInvis;
739 // Названия снарядов:
740 ShotNames[TRIGGER_SHOT_PISTOL] := MsgArrayShotPistol;
741 ShotNames[TRIGGER_SHOT_BULLET] := MsgArrayShotBullet;
742 ShotNames[TRIGGER_SHOT_SHOTGUN] := MsgArrayShotShotgun;
743 ShotNames[TRIGGER_SHOT_SSG] := MsgArrayShotSsg;
744 ShotNames[TRIGGER_SHOT_IMP] := MsgArrayShotImp;
745 ShotNames[TRIGGER_SHOT_PLASMA] := MsgArrayShotPlasma;
746 ShotNames[TRIGGER_SHOT_SPIDER] := MsgArrayShotSpider;
747 ShotNames[TRIGGER_SHOT_CACO] := MsgArrayShotCaco;
748 ShotNames[TRIGGER_SHOT_BARON] := MsgArrayShotBaron;
749 ShotNames[TRIGGER_SHOT_MANCUB] := MsgArrayShotMancub;
750 ShotNames[TRIGGER_SHOT_REV] := MsgArrayShotRev;
751 ShotNames[TRIGGER_SHOT_ROCKET] := MsgArrayShotRocket;
752 ShotNames[TRIGGER_SHOT_BFG] := MsgArrayShotBfg;
753 ShotNames[TRIGGER_SHOT_EXPL] := MsgArrayShotExpl;
754 ShotNames[TRIGGER_SHOT_BFGEXPL] := MsgArrayShotBfgexpl;
755 ShotNames[TRIGGER_SHOT_FLAME] := MsgArrayShotFlame;
757 // Названия монстров:
758 MonsterNames[MONSTER_DEMON] := MsgArrayMonDemon;
759 MonsterNames[MONSTER_IMP] := MsgArrayMonImp;
760 MonsterNames[MONSTER_ZOMBY] := MsgArrayMonZombie;
761 MonsterNames[MONSTER_SERG] := MsgArrayMonSergeant;
762 MonsterNames[MONSTER_CYBER] := MsgArrayMonCyber;
763 MonsterNames[MONSTER_CGUN] := MsgArrayMonCgun;
764 MonsterNames[MONSTER_BARON] := MsgArrayMonHellBaron;
765 MonsterNames[MONSTER_KNIGHT] := MsgArrayMonHellKnight;
766 MonsterNames[MONSTER_CACO] := MsgArrayMonCacodemon;
767 MonsterNames[MONSTER_SOUL] := MsgArrayMonLostSoul;
768 MonsterNames[MONSTER_PAIN] := MsgArrayMonPainElemental;
769 MonsterNames[MONSTER_SPIDER] := MsgArrayMonMastermind;
770 MonsterNames[MONSTER_BSP] := MsgArrayMonArachnatron;
771 MonsterNames[MONSTER_MANCUB] := MsgArrayMonMancubus;
772 MonsterNames[MONSTER_SKEL] := MsgArrayMonRevenant;
773 MonsterNames[MONSTER_VILE] := MsgArrayMonArchvile;
774 MonsterNames[MONSTER_FISH] := MsgArrayMonFish;
775 MonsterNames[MONSTER_BARREL] := MsgArrayMonBarrel;
776 MonsterNames[MONSTER_ROBO] := MsgArrayMonRobot;
777 MonsterNames[MONSTER_MAN] := MsgArrayMonPrikolist;
779 // Названия областей:
780 AreaNames[AREA_PLAYERPOINT1] := MsgArrayAreaPlayerOne;
781 AreaNames[AREA_PLAYERPOINT2] := MsgArrayAreaPlayerTwo;
782 AreaNames[AREA_DMPOINT] := MsgArrayAreaDm;
783 AreaNames[AREA_REDFLAG] := MsgArrayAreaFlagRed;
784 AreaNames[AREA_BLUEFLAG] := MsgArrayAreaFlagBlue;
785 AreaNames[AREA_DOMFLAG] := MsgArrayAreaFlagDom;
786 AreaNames[AREA_REDTEAMPOINT] := MsgArrayAreaTeamRed;
787 AreaNames[AREA_BLUETEAMPOINT] := MsgArrayAreaTeamBlue;
789 // Названия триггеров:
790 TriggerNames[TRIGGER_EXIT] := MsgArrayTrExit;
791 TriggerNames[TRIGGER_TELEPORT] := MsgArrayTrTeleport;
792 TriggerNames[TRIGGER_OPENDOOR] := MsgArrayTrDoorOpen;
793 TriggerNames[TRIGGER_CLOSEDOOR] := MsgArrayTrDoorClose;
794 TriggerNames[TRIGGER_DOOR] := MsgArrayTrDoorSwitch;
795 TriggerNames[TRIGGER_DOOR5] := MsgArrayTrDoor5Sec;
796 TriggerNames[TRIGGER_CLOSETRAP] := MsgArrayTrTrapClose;
797 TriggerNames[TRIGGER_TRAP] := MsgArrayTrTrap;
798 TriggerNames[TRIGGER_PRESS] := MsgArrayTrExtend;
799 TriggerNames[TRIGGER_SECRET] := MsgArrayTrSecret;
800 TriggerNames[TRIGGER_LIFTUP] := MsgArrayTrLiftUp;
801 TriggerNames[TRIGGER_LIFTDOWN] := MsgArrayTrLiftDown;
802 TriggerNames[TRIGGER_LIFT] := MsgArrayTrLiftSwitch;
803 TriggerNames[TRIGGER_TEXTURE] := MsgArrayTrTexture;
804 TriggerNames[TRIGGER_ON] := MsgArrayTrOn;
805 TriggerNames[TRIGGER_OFF] := MsgArrayTrOff;
806 TriggerNames[TRIGGER_ONOFF] := MsgArrayTrSwitch;
807 TriggerNames[TRIGGER_SOUND] := MsgArrayTrSound;
808 TriggerNames[TRIGGER_SPAWNMONSTER] := MsgArrayTrSpawnMonster;
809 TriggerNames[TRIGGER_SPAWNITEM] := MsgArrayTrSpawnItem;
810 TriggerNames[TRIGGER_MUSIC] := MsgArrayTrMusic;
811 TriggerNames[TRIGGER_PUSH] := MsgArrayTrPush;
812 TriggerNames[TRIGGER_SCORE] := MsgArrayTrScore;
813 TriggerNames[TRIGGER_MESSAGE] := MsgArrayTrMessage;
814 TriggerNames[TRIGGER_DAMAGE] := MsgArrayTrDamage;
815 TriggerNames[TRIGGER_HEALTH] := MsgArrayTrHealth;
816 TriggerNames[TRIGGER_SHOT] := MsgArrayTrShot;
817 TriggerNames[TRIGGER_EFFECT] := MsgArrayTrEffect;
819 // Установка значений в панели выбора объектов:
820 with MainForm do
821 begin
822 lbPanelType.Items.Clear();
823 for i := 0 to High(PANELNAMES) do
824 lbPanelType.Items.Add(PANELNAMES[i]);
825 lbPanelType.ItemIndex := 0;
827 lbItemList.Clear();
828 for i := ITEM_MEDKIT_SMALL to ITEM_KEY_BLUE do
829 lbItemList.Items.Add(ItemNames[i]);
830 lbItemList.Items.Add(ItemNames[ITEM_BOTTLE]);
831 lbItemList.Items.Add(ItemNames[ITEM_HELMET]);
832 lbItemList.Items.Add(ItemNames[ITEM_JETPACK]);
833 lbItemList.Items.Add(ItemNames[ITEM_INVIS]);
834 lbItemList.Items.Add(ItemNames[ITEM_WEAPON_FLAMETHROWER]);
835 lbItemList.Items.Add(ItemNames[ITEM_AMMO_FUELCAN]);
837 lbMonsterList.Clear();
838 for i := MONSTER_DEMON to MONSTER_MAN do
839 lbMonsterList.Items.Add(MonsterNames[i]);
841 lbAreasList.Clear();
842 for i := AREA_PLAYERPOINT1 to AREA_BLUETEAMPOINT do
843 lbAreasList.Items.Add(AreaNames[i]);
845 lbTriggersList.Clear();
846 for i := Low(TriggerNames) to High(TriggerNames) do
847 lbTriggersList.Items.Add(TriggerNames[i]);
849 clbActivationType.Clear();
850 clbActivationType.Items.Add(MsgCtrlActPlayerClose);
851 clbActivationType.Items.Add(MsgCtrlActMonsterClose);
852 clbActivationType.Items.Add(MsgCtrlActPlayerPress);
853 clbActivationType.Items.Add(MsgCtrlActMonsterPress);
854 clbActivationType.Items.Add(MsgCtrlActShot);
855 clbActivationType.Items.Add(MsgCtrlActNoMonster);
857 clbKeys.Clear();
858 clbKeys.Items.Add(MsgCtrlKeysRed);
859 clbKeys.Items.Add(MsgCtrlKeysGreen);
860 clbKeys.Items.Add(MsgCtrlKeysBlue);
861 clbKeys.Items.Add(MsgCtrlKeysTeamRed);
862 clbKeys.Items.Add(MsgCtrlKeysTeamBlue);
863 end;
864 end;
866 procedure SetupCaptions();
867 var i: Integer; s: AnsiString;
868 begin
869 // Главная форма:
870 with MainForm do
871 begin
872 // Заголовок:
873 s := g_GetBuildHash(false);
874 if s = 'custom build' then
875 s := s + ' by ' + g_GetBuilderName() + ' ' + EDITOR_BUILDDATE + ' ' + EDITOR_BUILDTIME;
876 FormCaption := MsgEditorTitle + ' (' + s + ')';
877 i := Pos('-', Caption);
878 if i > 0 then
879 begin
880 Caption := FormCaption + ' ' + Copy(Caption, i, Length(Caption)-i+1);
881 end
882 else
883 Caption := FormCaption;
884 // Главное меню:
885 // "Файл":
886 miMenuFile.Caption := MsgMenuFile;
887 miNewMap.Caption := MsgMenuFileNew;
888 miOpenMap.Caption := MsgMenuFileOpen;
889 miSaveMap.Caption := MsgMenuFileSave;
890 miSaveMapAs.Caption := MsgMenuFileSaveAs;
891 miOpenWadMap.Caption := MsgMenuFileOpenWad;
892 miReopenMap.Caption := MsgMenuFileReopen;
893 miSaveMiniMap.Caption := MsgMenuFileSaveMini;
894 miDeleteMap.Caption := MsgMenuFileDelete;
895 miPackMap.Caption := MsgMenuFilePackMap;
896 miExit.Caption := MsgMenuFileExit;
897 // "Правка":
898 miMenuEdit.Caption := MsgMenuEdit;
899 miUndo.Caption := MsgMenuEditUndo;
900 miCopy.Caption := MsgMenuEditCopy;
901 miCut.Caption := MsgMenuEditCut;
902 miPaste.Caption := MsgMenuEditPaste;
903 miSelectAll.Caption := MsgMenuEditSelectAll;
904 miToFore.Caption := MsgMenuEditToFore;
905 miToBack.Caption := MsgMenuEditToBack;
906 // "Инструменты":
907 miSnapToGrid.Caption := MsgMenuToolsSnapGrid;
908 miMiniMap.Caption := MsgMenuToolsMinimap;
909 miSwitchGrid.Caption := MsgMenuToolsStepGrid;
910 miShowEdges.Caption := MsgMenuToolsShowEdges;
911 miLayers.Caption := MsgMenuToolsLayers;
912 miLayer1.Caption := MsgMenuLayerBack;
913 miLayer2.Caption := MsgMenuLayerWall;
914 miLayer3.Caption := MsgMenuLayerFore;
915 miLayer4.Caption := MsgMenuLayerStair;
916 miLayer5.Caption := MsgMenuLayerWater;
917 miLayer6.Caption := MsgMenuLayerItem;
918 miLayer7.Caption := MsgMenuLayerMonster;
919 miLayer8.Caption := MsgMenuLayerArea;
920 miLayer9.Caption := MsgMenuLayerTrigger;
921 miMapOptions.Caption := MsgMenuSetsMap;
922 miOptions.Caption := MsgMenuSetsEditor;
923 // "Сервис":
924 miMenuService.Caption := MsgMenuServ;
925 miCheckMap.Caption := MsgMenuServTest;
926 miOptimmization.Caption := MsgMenuServOpt;
927 miMapPreview.Caption := MsgMenuServPreview;
928 miTestMap.Caption := MsgMenuServLaunch;
929 // "Справка":
930 miMenuHelp.Caption := MsgMenuHelp;
931 miAbout.Caption := MsgMenuHelpAbout;
933 // Панель инструментов:
934 tbNewMap.Hint := MsgMenuTbNew;
935 tbOpenMap.Hint := MsgMenuTbOpen;
936 tbSaveMap.Hint := MsgMenuTbSave;
937 tbOpenWadMap.Hint := MsgMenuTbOpenWad;
938 tbShowMap.Hint := MsgMenuTbMinimap;
939 tbShow.Hint := MsgMenuTbLayers;
940 tbGridOn.Hint := MsgMenuTbGrid;
941 tbGrid.Hint := MsgMenuTbGridStep;
942 tbTestMap.Hint := MsgMenuTbLaunch;
943 // Всплывающее меню для кнопки слоев:
944 miLayerP1.Caption := MsgMenuLayerBack;
945 miLayerP2.Caption := MsgMenuLayerWall;
946 miLayerP3.Caption := MsgMenuLayerFore;
947 miLayerP4.Caption := MsgMenuLayerStair;
948 miLayerP5.Caption := MsgMenuLayerWater;
949 miLayerP6.Caption := MsgMenuLayerItem;
950 miLayerP7.Caption := MsgMenuLayerMonster;
951 miLayerP8.Caption := MsgMenuLayerArea;
952 miLayerP9.Caption := MsgMenuLayerTrigger;
954 // Кнопка применения свойств:
955 bApplyProperty.Caption := MsgBtnApplyProps;
956 // Редактор свойств объектов:
957 vleObjectProperty.TitleCaptions[0] := MsgCtrlPropKey;
958 vleObjectProperty.TitleCaptions[1] := MsgCtrlPropValue;
960 // Вкладка "Панели":
961 tsPanels.Caption := MsgCtrlPanels;
962 lbPanelType.Hint := MsgPropPanelType;
963 lbTextureList.Hint := MsgCtrlListTexture;
964 // Панель настройки текстур:
965 LabelTxW.Caption := MsgLabTexWidth;
966 LabelTxH.Caption := MsgLabTexHeight;
967 cbPreview.Caption := MsgCtrlPreview;
968 bbAddTexture.Hint := MsgBtnTextureAdd;
969 bbRemoveTexture.Hint := MsgBtnTextureDelete;
970 bClearTexture.Hint := MsgBtnTextureEmpty;
972 // Вкладка "Предметы":
973 tsItems.Caption := MsgCtrlItems;
974 lbItemList.Hint := MsgCtrlListItem;
975 cbOnlyDM.Caption := MsgCtrlItemDm;
976 cbFall.Caption := MsgCtrlItemFalls;
978 // Вкладка "Монстры":
979 tsMonsters.Caption := MsgCtrlMonsters;
980 lbMonsterList.Hint := MsgCtrlListMonster;
981 rbMonsterLeft.Caption := MsgCtrlLeft;
982 rbMonsterRight.Caption := MsgCtrlRight;
984 // Вкладка "Области":
985 tsAreas.Caption := MsgCtrlAreas;
986 lbAreasList.Hint := MsgCtrlListArea;
987 rbAreaLeft.Caption := MsgCtrlLeft;
988 rbAreaRight.Caption := MsgCtrlRight;
990 // Вкладка "Триггеры":
991 tsTriggers.Caption := MsgCtrlTriggers;
992 lbTriggersList.Hint := MsgCtrlListTrigger;
993 clbActivationType.Hint := MsgCtrlListActive;
994 clbKeys.Hint := MsgCtrlListKeys;
995 end;
997 // Форма "О программе":
998 with AboutForm do
999 begin
1000 Caption := MsgCapAbout;
1001 LabelTitle.Caption := MsgEditorTitle;
1002 LabelVer.Caption := MsgLabAboutVer;
1003 LabelAuthor.Caption := MsgLabAboutAuthor;
1004 LabelAuthor2.Caption := MsgLabAboutAuthor2;
1005 LabelMail.Caption := MsgLabAboutMail;
1006 LabelMail2.Caption := MsgLabAboutMail2;
1007 LabelSite.Caption := MsgLabAboutSite;
1008 LabelHttp.Caption := MsgLabAboutHttp;
1009 end;
1011 // Форма "Тип активации":
1012 with ActivationTypeForm do
1013 begin
1014 Caption := MsgCapAct;
1015 cbPlayerCollide.Caption := MsgCtrlActPlayerClose;
1016 cbMonsterCollide.Caption := MsgCtrlActMonsterClose;
1017 cbPlayerPress.Caption := MsgCtrlActPlayerPress;
1018 cbMonsterPress.Caption := MsgCtrlActMonsterPress;
1019 cbShot.Caption := MsgCtrlActShot;
1020 cbNoMonster.Caption := MsgCtrlActNoMonster;
1021 bOK.Caption := MsgBtnOk;
1022 end;
1024 // Форма "Выбор текстуры для неба":
1025 with AddSkyForm do
1026 begin
1027 Caption := MsgCapAddSky;
1028 LabelWADs.Caption := MsgLabAddWads;
1029 LabelSections.Caption := MsgLabAddSections;
1030 bOK.Caption := MsgBtnOk;
1031 bCancel.Caption := MsgBtnCancel;
1032 end;
1034 // Форма "Выбор звука или музыки":
1035 with AddSoundForm do
1036 begin
1037 Caption := MsgCapAddSound;
1038 LabelWADs.Caption := MsgLabAddWads;
1039 LabelSections.Caption := MsgLabAddSections;
1040 bOK.Caption := MsgBtnOk;
1041 bCancel.Caption := MsgBtnCancel;
1042 bEmpty.Caption := MsgBtnNoSound;
1043 end;
1045 // Форма "Выбор текстуры":
1046 with AddTextureForm do
1047 begin
1048 Caption := MsgCapAddTexture;
1049 LabelWADs.Caption := MsgLabAddWads;
1050 LabelSections.Caption := MsgLabAddSections;
1051 bAddTexture.Caption := MsgBtnAdd;
1052 bClose.Caption := MsgBtnClose;
1053 bAddClose.Caption := MsgBtnAddClose;
1054 end;
1056 // Форма "Выбор типа монстра" / "Выбор типа предмета":
1057 ChooseTypeForm.bOK.Caption := MsgBtnOk;
1059 // Форма "Ключи":
1060 with KeysForm do
1061 begin
1062 Caption := MsgCapKeys;
1063 cbRedKey.Caption := MsgCtrlKeysRed;
1064 cbGreenKey.Caption := MsgCtrlKeysGreen;
1065 cbBlueKey.Caption := MsgCtrlKeysBlue;
1066 cbRedTeam.Caption := MsgCtrlKeysTeamRed;
1067 cbBlueTeam.Caption := MsgCtrlKeysTeamBlue;
1068 bOK.Caption := MsgBtnOk;
1069 end;
1071 // Форма "Проверка карты":
1072 with MapCheckForm do
1073 begin
1074 Caption := MsgCapTest;
1075 bCheckMap.Caption := MsgBtnTestAgain;
1076 bClose.Caption := MsgBtnClose;
1077 end;
1079 // Форма "Оптимизация карты":
1080 with MapOptimizationForm do
1081 begin
1082 Caption := MsgCapOpt;
1083 // Выбор оптимизации:
1084 GroupBoxOpt.Caption := MsgCtrlOptGb;
1085 rbTexturesOptimization.Caption := MsgCtrlOptTexture;
1086 rbPanelsOptimization.Caption := MsgCtrlOptPanel;
1087 // Оптимизация текстур:
1088 bBeginTextureOptimization.Caption := MsgBtnStart;
1089 // Оптимизация панелей:
1090 cbOptimizeWalls.Caption := MsgCtrlOptWall;
1091 cbOptimizeForeGround.Caption := MsgCtrlOptFore;
1092 cbOptimizeBackGround.Caption := MsgCtrlOptBack;
1093 cbOptimizeSteps.Caption := MsgCtrlOptStair;
1094 cbOptimizeWater.Caption := MsgCtrlOptWater;
1095 cbOptimizeAcid1.Caption := MsgCtrlOptAcid1;
1096 cbOptimizeAcid2.Caption := MsgCtrlOptAcid2;
1097 cbOptimizeLift.Caption := MsgCtrlOptLift;
1098 cbOptimizeBlockMon.Caption := MsgCtrlOptBlockmon;
1099 bBeginPanelsOptimization.Caption := MsgBtnStart;
1100 end;
1102 // Форма "Параметры карты":
1103 with MapOptionsForm do
1104 begin
1105 Caption := MsgCapSets;
1106 // Основные параметры:
1107 LabelName.Caption := MsgLabSetsName;
1108 LabelDesc.Caption := MsgLabSetsDesc;
1109 LabelAuthor.Caption := MsgLabSetsAuthor;
1110 LabelBack.Caption := MsgLabSetsBack;
1111 LabelMusic.Caption := MsgLabSetsMusic;
1112 // Статистика:
1113 GBStats.Caption := MsgCtrlSetsStats;
1114 LabelTexs.Caption := MsgLabSetsTextures;
1115 LabelPanels.Caption := MsgLabSetsPanels;
1116 LabelItems.Caption := MsgLabSetsItems;
1117 LabelMonsters.Caption := MsgLabSetsMonsters;
1118 LabelAreas.Caption := MsgLabSetsAreas;
1119 LabelTriggers.Caption := MsgLabSetsTriggers;
1120 // Размеры:
1121 GBSizes.Caption := MsgCtrlSetsSizes;
1122 LabelWidth.Caption := MsgLabSetsWidth;
1123 LabelHeight.Caption := MsgLabSetsHeight;
1124 LabelCurSize.Caption := MsgLabSetsSizes;
1125 LabelMapMove.Caption := MsgLabSetsMapmove;
1126 cbSnapping.Caption := MsgLabSetsSnapping;
1127 // Кнопки:
1128 bOK.Caption := MsgBtnOk;
1129 bCancel.Caption := MsgBtnCancel;
1130 end;
1132 // From "Editor settings":
1133 with OptionsForm do
1134 begin
1135 Caption := MsgCapEs;
1136 bOK.Caption := MsgBtnOk;
1137 bCancel.Caption := MsgBtnCancel;
1138 // TabGeneral:
1139 cbShowDots.Caption := MsgCtrlEsGrid;
1140 cbShowTexture.Caption := MsgCtrlEsTexture;
1141 cbShowSize.Caption := MsgCtrlEsPanelSize;
1142 cbCheckerboard.Caption := MsgCtrlEsCheckerboard;
1143 LabelGrid.Caption := MsgLabEsGrid;
1144 LabelGridCol.Caption := MsgLabEsGridColor;
1145 LabelGridSize.Caption := MsgLabEsGridSize;
1146 LabelBack.Caption := MsgLabEsBack;
1147 LabelPreview.Caption := MsgLabEsPreview;
1148 LabelMinimap.Caption := MsgLabEsMinimap;
1149 LabelLanguage.Caption := MsgLabEsLanguage;
1150 // TabFiles:
1151 cbCompress.Caption := MsgLabEsCompress;
1152 cbBackup.Caption := MsgLabEsBackup;
1153 LabelRecent.Caption := MsgLabEsRecent;
1154 // TabTesting:
1155 rbDM.Caption := MsgCtrlLaunchDm;
1156 rbTDM.Caption := MsgCtrlLaunchTdm;
1157 rbCTF.Caption := MsgCtrlLaunchCtf;
1158 rbCOOP.Caption := MsgCtrlLaunchCoop;
1159 cbTwoPlayers.Caption := MsgCtrlLaunch2p;
1160 cbTeamDamage.Caption := MsgCtrlLaunchFf;
1161 cbAllowExit.Caption := MsgCtrlLaunchExit;
1162 cbWeaponStay.Caption := MsgCtrlLaunchWeapons;
1163 cbMonstersDM.Caption := MsgCtrlLaunchMonsters;
1164 cbMapOnce.Caption := MsgCtrlLaunchClose;
1165 LabelTime.Caption := MsgLabLaunchTime;
1166 LabelSecs.Caption := MsgLabLaunchSecs;
1167 LabelScore.Caption := MsgLabLaunchScore;
1168 LabelPath.Caption := MsgLabLaunchPath;
1169 FindD2dDialog.Title := MsgCtrlLaunchOpen;
1170 LabelArgs.Caption := MsgLabLaunchArgs;
1171 end;
1173 // Форма "Упаковать карту":
1174 with PackMapForm do
1175 begin
1176 Caption := MsgCapPack;
1177 bPack.Caption := MsgBtnPack;
1178 LabelSaveTo.Caption := MsgLabPackSaveTo;
1179 LabelMapName.Caption := MsgLabPackMapName;
1180 // Что упаковывать:
1181 cbTextrures.Caption := MsgCtrlPackTextures;
1182 LabelTextures.Caption := MsgLabPackTextures;
1183 cbSky.Caption := MsgCtrlPackSky;
1184 LabelSky.Caption := MsgLabPackSky;
1185 cbMusic.Caption := MsgCtrlPackMusic;
1186 LabelMusic.Caption := MsgLabPackMusic;
1187 cbAdd.Caption := MsgCtrlPackAdd;
1188 cbNonStandart.Caption := MsgCtrlPackNonStd;
1189 end;
1191 // Форма "Сохранить карту":
1192 with SaveMapForm do
1193 begin
1194 Caption := MsgCapSave;
1195 bOK.Caption := MsgBtnOk;
1196 bCancel.Caption := MsgBtnCancel;
1197 end;
1199 // Форма "Сохранить мини-карту":
1200 with SaveMiniMapForm do
1201 begin
1202 Caption := MsgCapMini;
1203 LabelScale.Caption := MsgLabMiniScale;
1204 bSave.Caption := MsgBtnSave;
1205 bClose.Caption := MsgBtnClose;
1206 end;
1208 // Форма "Выбор карты":
1209 with SelectMapForm do
1210 begin
1211 Caption := MsgCapSelect;
1212 bOK.Caption := MsgBtnOk;
1213 bCancel.Caption := MsgBtnCancel;
1214 end;
1216 // Заголовок приложения:
1217 Application.Title := MsgEditorTitle;
1218 end;
1220 type
1221 TResArg = record
1222 ini: TIniFile;
1223 ignored: TStringList;
1224 end;
1225 PResArg = ^TResArg;
1227 function gResourceItarator (name, value: AnsiString; hash: LongInt; arg: Pointer): AnsiString;
1228 var res: PResArg; orig: AnsiString;
1229 begin
1230 res := PResArg(arg);
1231 orig := res.ini.ReadString('resourcestring', name + '$', '');
1232 if (orig = '') or (orig = value) then
1233 begin
1234 if res.ini.ValueExists('resourcestring', name) then
1235 begin
1236 result := res.ini.ReadString('resourcestring', name, '');
1237 end
1238 else
1239 begin
1240 result := value;
1241 if res.ignored.IndexOf(Copy(name, 1, Pos('.', name) - 1)) < 0 then
1242 e_WriteLog(' Seems that key ' + name + ' not translated', MSG_NOTIFY);
1243 end;
1244 end
1245 else
1246 begin
1247 e_WriteLog(' Original resource string for ' + name + ' do not match, translation are outdated?', MSG_WARNING);
1248 e_WriteLog(' [' + value + '] -> [' + orig + ']', MSG_WARNING);
1249 result := value;
1250 end;
1251 end;
1253 procedure gSetLanguageFormStream (const lang: AnsiString; stream: TStream; out ok: Boolean);
1254 var res: TResArg;
1255 begin
1256 ok := False;
1257 try
1258 res.ini := TIniFile.Create(stream, [ifoStripComments, ifoStripQuotes, ifoEscapeLineFeeds]);
1259 except
1260 res.ini := nil;
1261 end;
1262 if res.ini <> nil then
1263 begin
1264 try
1265 ok := res.ini.SectionExists('resourcestring');
1266 if ok then
1267 begin
1268 res.ignored := TStringList.Create;
1269 res.ignored.CaseSensitive := False;
1270 res.ini.ReadSection('ignore', res.ignored);
1271 res.ignored.Sort;
1272 SetResourceStrings(gResourceItarator, @res);
1273 res.ignored.Free();
1274 end;
1275 finally
1276 res.ini.Free();
1277 end;
1278 end;
1279 if not ok then e_WriteLog('Translation file for ' + lang + ' are invalid ', MSG_FATALERROR);
1280 end;
1282 procedure gSetLanguageFromFile (const lang: AnsiString; out ok: Boolean);
1283 const langfilename = 'editor';
1284 var stream: TFileStream; name: AnsiString;
1285 begin
1286 name := LangDir + DirectorySeparator + langfilename + '.' + lang + '.lng';
1287 try
1288 stream := TFileStream.Create(name, fmOpenRead);
1289 try
1290 gSetLanguageFormStream(lang, stream, ok);
1291 finally
1292 stream.Free();
1293 end;
1294 except on E: EFOpenError do
1295 ok := False;
1296 end;
1297 end;
1299 procedure gSetLanguage (const lang: AnsiString; out ok: Boolean);
1300 begin
1301 gSetLanguageFromFile(lang, ok);
1302 end;
1304 function g_Language_GetList (): TStringList;
1305 const langfilename = 'editor';
1306 var list: TStringList; info: TSearchRec;
1307 begin
1308 list := TStringList.Create;
1309 list.Duplicates := dupIgnore;
1310 list.Add(InSourceLanguage);
1311 if FindFirst(LangDir + DirectorySeparator + langfilename + '.*.lng', faAnyFile, info) = 0 then
1312 begin
1313 repeat
1314 list.Add(Copy(ExtractFileNameWithoutExt(info.Name), Length(langfilename) + 2));
1315 until FindNext(info) <> 0;
1316 FindClose(info);
1317 end;
1318 list.Sort;
1319 result := list;
1320 end;
1322 procedure g_Language_Set(lang: String);
1323 var syslang, fallbacklang: String; ok: Boolean;
1324 begin
1325 ResetResourceTables;
1327 if lang = '' then
1328 begin
1329 GetLanguageIDs(syslang, fallbacklang); // TODO: remove dependency on gettext
1330 e_WriteLog('g_Language_Set: try strings "' + syslang + '" (system)', MSG_NOTIFY);
1331 gSetLanguage(syslang, ok);
1332 if not ok then
1333 begin
1334 e_WriteLog('g_Language_Set: try strings "' + fallbacklang + '" (fallback)', MSG_NOTIFY);
1335 gSetLanguage(syslang, ok);
1336 end;
1337 end
1338 else
1339 begin
1340 e_WriteLog('g_Language_Set: try strings "' + lang + '" (user specified)', MSG_NOTIFY);
1341 gSetLanguage(lang, ok);
1342 end;
1343 if not ok then e_WriteLog('g_Language_Set: use default strings "' + InSourceLanguage + '" (in-source)', MSG_NOTIFY);
1345 SetupArrays();
1346 SetupCaptions();
1347 RemoveSelectFromObjects();
1348 end;
1350 End.