Merge branch 'alliedmodders:master' into netprop-cache-clear

This commit is contained in:
Corey D 2023-03-31 09:13:28 +11:00 committed by GitHub
commit c68715440f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
647 changed files with 45397 additions and 69 deletions

View File

@ -12,7 +12,7 @@ jobs:
test: test:
strategy: strategy:
matrix: matrix:
os: [ubuntu-18.04, ubuntu-latest, windows-latest] os: [ubuntu-20.04, ubuntu-latest, windows-latest]
include: include:
- os: windows-latest - os: windows-latest
os_short: win os_short: win
@ -21,7 +21,7 @@ jobs:
os_short: linux os_short: linux
compiler_cc: clang compiler_cc: clang
compiler_cxx: clang++ compiler_cxx: clang++
- os: ubuntu-18.04 - os: ubuntu-20.04
os_short: linux os_short: linux
compiler_cc: clang-8 compiler_cc: clang-8
compiler_cxx: clang++-8 compiler_cxx: clang++-8

42
.github/workflows/translations.yml vendored Normal file
View File

@ -0,0 +1,42 @@
name: Update translation project
on:
push:
branches:
- master
paths:
- 'translations/**'
workflow_dispatch:
jobs:
update_translations:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- uses: actions/setup-python@v4
name: Setup Python 3.10
with:
python-version: "3.10"
- name: Install Python dependencies
working-directory: tools/language_check
run: |
python -m pip install --upgrade -r requirements.txt
- name: Generate token
id: generate_token
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PEM }}
- name: Update translation project
working-directory: tools/language_check
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
ORGANIZATION: alliedmodders
PROJECT_NUMBER: 1
run: |
python ./compare_translation_phrases.py

View File

@ -16,6 +16,7 @@ Development
- [SourcePawn scripting](https://wiki.alliedmods.net/Category:SourceMod_Scripting): SourcePawn examples and introduction to the language - [SourcePawn scripting](https://wiki.alliedmods.net/Category:SourceMod_Scripting): SourcePawn examples and introduction to the language
- [SourceMod plugin API](https://sm.alliedmods.net/new-api): Online SourceMod plugin API reference generated from the include files - [SourceMod plugin API](https://sm.alliedmods.net/new-api): Online SourceMod plugin API reference generated from the include files
- [SourceMod extension development](https://wiki.alliedmods.net/Category:SourceMod_Development): C++ examples and introduction to various extension interfaces - [SourceMod extension development](https://wiki.alliedmods.net/Category:SourceMod_Development): C++ examples and introduction to various extension interfaces
- [Translation project](https://github.com/orgs/alliedmodders/projects/1): Help [translate SourceMod](https://wiki.alliedmods.net/Translations_(SourceMod_Scripting)) into your language
Contact Contact
------- -------

View File

@ -1,4 +1,37 @@
"Languages" "Languages"
{ {
"en" "English" "en" "English" // English
"ar" "Arabic" // Arabic
"pt" "Brazilian" // Brazilian Portuguese
"bg" "Bulgarian" // Bulgarian
"cze" "Czech" // Czech
"da" "Danish" // Danish
"nl" "Dutch" // Dutch
"fi" "Finnish" // Finnish
"fr" "French" // French
"de" "German" // German
"el" "Greek" // Greek
"he" "Hebrew" // Hebrew
"hu" "Hungarian" // Hungarian
"it" "Italian" // Italian
"jp" "Japanese" // Japanese
"ko" "KoreanA" // Korean
"ko" "Korean" // Korean
"las" "LatAm" // Latin American Spanish
"lv" "Latvian" // Latvian
"lt" "Lithuanian" // Lithuanian
"no" "Norwegian" // Norwegian
"pl" "Polish" // Polish
"pt_p" "Portuguese" // Portuguese
"ro" "Romanian" // Romanian
"ru" "Russian" // Russian
"chi" "SChinese" // Chinese (Simplified)
"sk" "Slovak" // Slovak
"es" "Spanish" // Spanish
"sv" "Swedish" // Swedish
"zho" "TChinese" // Chinese (Traditional)
"th" "Thai" // Thai
"tr" "Turkish" // Turkish
"ua" "Ukrainian" // Ukrainian
"vi" "Vietnamese" // Vietnamese
} }

View File

@ -445,20 +445,25 @@ bool CHalfLife2::FindSendPropInfo(const char *classname, const char *offset, sm_
return false; return false;
} }
if (!pInfo->lookup.retrieve(offset, info)) DataTableInfo::SendPropInfo temp;
{
sm_sendprop_info_t temp_info;
if (!UTIL_FindInSendTable(pInfo->sc->m_pTable, offset, &temp_info, 0)) if (!pInfo->lookup.retrieve(offset, &temp))
{
bool found = UTIL_FindInSendTable(pInfo->sc->m_pTable, offset, &temp.info, 0);
temp.name = offset;
pInfo->lookup.insert(offset, temp);
if (found)
{ {
return false; *info = temp.info;
} }
pInfo->lookup.insert(offset, temp_info); return found;
*info = temp_info;
} }
return true; *info = temp.info;
return info->prop != nullptr;
} }
SendProp *CHalfLife2::FindInSendTable(const char *classname, const char *offset) SendProp *CHalfLife2::FindInSendTable(const char *classname, const char *offset)
@ -492,15 +497,25 @@ bool CHalfLife2::FindDataMapInfo(datamap_t *pMap, const char *offset, sm_datatab
m_Maps.add(i, pMap, new DataMapCache()); m_Maps.add(i, pMap, new DataMapCache());
DataMapCache *cache = i->value; DataMapCache *cache = i->value;
DataMapCacheInfo temp;
if (!cache->retrieve(offset, pDataTable)) if (!cache->retrieve(offset, &temp))
{ {
if (!UTIL_FindDataMapInfo(pMap, offset, pDataTable)) bool found = UTIL_FindDataMapInfo(pMap, offset, &temp.info);
return false; temp.name = offset;
cache->insert(offset, *pDataTable);
cache->insert(offset, temp);
if (found)
{
*pDataTable = temp.info;
}
return found;
} }
return true; *pDataTable = temp.info;
return pDataTable->prop != nullptr;
} }
void CHalfLife2::ClearDataTableCache() void CHalfLife2::ClearDataTableCache()

View File

@ -89,16 +89,24 @@ using namespace SourceMod;
struct DataTableInfo struct DataTableInfo
{ {
struct SendPropPolicy struct SendPropInfo
{ {
static inline bool matches(const char *name, const sm_sendprop_info_t &info) static inline bool matches(const char *name, const SendPropInfo &info)
{ {
return strcmp(name, info.prop->GetName()) == 0; return strcmp(name, info.name.c_str()) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key) static inline uint32_t hash(const detail::CharsAndLength &key)
{ {
return key.hash(); return key.hash();
} }
SendPropInfo()
: name(), info{nullptr, 0}
{
}
std::string name;
sm_sendprop_info_t info;
}; };
static inline bool matches(const char *name, const DataTableInfo *info) static inline bool matches(const char *name, const DataTableInfo *info)
@ -116,22 +124,30 @@ struct DataTableInfo
} }
ServerClass *sc; ServerClass *sc;
NameHashSet<sm_sendprop_info_t, SendPropPolicy> lookup; NameHashSet<SendPropInfo> lookup;
}; };
struct DataMapCachePolicy struct DataMapCacheInfo
{ {
static inline bool matches(const char *name, const sm_datatable_info_t &info) static inline bool matches(const char *name, const DataMapCacheInfo &info)
{ {
return strcmp(name, info.prop->fieldName) == 0; return strcmp(name, info.name.c_str()) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key) static inline uint32_t hash(const detail::CharsAndLength &key)
{ {
return key.hash(); return key.hash();
} }
DataMapCacheInfo()
: name(), info{nullptr, 0}
{
}
std::string name;
sm_datatable_info_t info;
}; };
typedef NameHashSet<sm_datatable_info_t, DataMapCachePolicy> DataMapCache; typedef NameHashSet<DataMapCacheInfo> DataMapCache;
struct DelayedFakeCliCmd struct DelayedFakeCliCmd
{ {

View File

@ -231,6 +231,13 @@ static cell_t sm_FloatFraction(IPluginContext *pCtx, const cell_t *params)
return sp_ftoc(val); return sp_ftoc(val);
} }
static cell_t sm_FloatMod(IPluginContext* pCtx, const cell_t* params)
{
float val = fmodf(sp_ctof(params[1]), sp_ctof(params[2]));
return sp_ftoc(val);
}
static cell_t sm_Sine(IPluginContext *pCtx, const cell_t *params) static cell_t sm_Sine(IPluginContext *pCtx, const cell_t *params)
{ {
float val = sp_ctof(params[1]); float val = sp_ctof(params[1]);
@ -358,6 +365,7 @@ REGISTER_NATIVES(floatnatives)
{"FloatAdd", sm_FloatAdd}, {"FloatAdd", sm_FloatAdd},
{"FloatSub", sm_FloatSub}, {"FloatSub", sm_FloatSub},
{"FloatFraction", sm_FloatFraction}, {"FloatFraction", sm_FloatFraction},
{"FloatMod", sm_FloatMod},
{"RoundToZero", sm_RoundToZero}, {"RoundToZero", sm_RoundToZero},
{"RoundToCeil", sm_RoundToCeil}, {"RoundToCeil", sm_RoundToCeil},
{"RoundToFloor", sm_RoundToFloor}, {"RoundToFloor", sm_RoundToFloor},

View File

@ -954,6 +954,21 @@ static cell_t CS_WeaponIDToItemDefIndex(IPluginContext *pContext, const cell_t *
#endif #endif
} }
static cell_t CS_WeaponIDToLoadoutSlot(IPluginContext *pContext, const cell_t *params)
{
#if SOURCE_ENGINE == SE_CSGO
WeaponIDMap::Result res = g_mapWeaponIDToDefIdx.find((SMCSWeapon)params[1]);
if (!res.found())
return pContext->ThrowNativeError("Invalid weapon id passed.");
return res->value.m_iLoadoutSlot;
#else
return pContext->ThrowNativeError("CS_WeaponIDToLoadoutSlot is not supported on this game");
#endif
}
sp_nativeinfo_t g_CSNatives[] = sp_nativeinfo_t g_CSNatives[] =
{ {
{"CS_RespawnPlayer", CS_RespawnPlayer}, {"CS_RespawnPlayer", CS_RespawnPlayer},
@ -978,6 +993,7 @@ sp_nativeinfo_t g_CSNatives[] =
{"CS_IsValidWeaponID", CS_IsValidWeaponID}, {"CS_IsValidWeaponID", CS_IsValidWeaponID},
{"CS_ItemDefIndexToID", CS_ItemDefIndexToID}, {"CS_ItemDefIndexToID", CS_ItemDefIndexToID},
{"CS_WeaponIDToItemDefIndex", CS_WeaponIDToItemDefIndex}, {"CS_WeaponIDToItemDefIndex", CS_WeaponIDToItemDefIndex},
{"CS_WeaponIDToLoadoutSlot", CS_WeaponIDToLoadoutSlot},
{NULL, NULL} {NULL, NULL}
}; };

View File

@ -70,7 +70,7 @@ public:
const DatabaseInfo &GetInfo(); const DatabaseInfo &GetInfo();
private: private:
MYSQL *m_mysql; MYSQL *m_mysql;
std::mutex m_FullLock; std::recursive_mutex m_FullLock;
/* ---------- */ /* ---------- */
DatabaseInfo m_Info; DatabaseInfo m_Info;

View File

@ -71,7 +71,7 @@ public:
void SetLastIDAndRows(unsigned int insertID, unsigned int affectedRows); void SetLastIDAndRows(unsigned int insertID, unsigned int affectedRows);
private: private:
PGconn *m_pgsql; PGconn *m_pgsql;
std::mutex m_FullLock; std::recursive_mutex m_FullLock;
unsigned int m_lastInsertID; unsigned int m_lastInsertID;
unsigned int m_lastAffectedRows; unsigned int m_lastAffectedRows;

View File

@ -56,7 +56,7 @@ void RegEx::Clear ()
re = nullptr; re = nullptr;
mFree = true; mFree = true;
if (subject) if (subject)
delete [] subject; free(subject);
subject = nullptr; subject = nullptr;
mMatchCount = 0; mMatchCount = 0;
} }

View File

@ -70,7 +70,7 @@ public:
} }
private: private:
sqlite3 *m_sq3; sqlite3 *m_sq3;
std::mutex m_FullLock; std::recursive_mutex m_FullLock;
bool m_Persistent; bool m_Persistent;
String m_LastError; String m_LastError;
int m_LastErrorCode; int m_LastErrorCode;

View File

@ -101,6 +101,21 @@
} }
} }
/* CBaseAnimating::LookupAttachment */
"#default"
{
"Signatures"
{
"LookupAttachment"
{
"library" "server"
"windows" "\x55\x8B\xEC\x56\x8B\xF1\x83\xBE\x2A\x2A\x2A\x2A\x00\x75\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x74\x2A\x8B\xCE\xE8\x2A\x2A\x2A\x2A\x8B\x86\x2A\x2A\x2A\x2A\x5E\x85\xC0\x74\x2A\x83\x38\x00\x74\x2A\xFF\x75"
"linux" "@_ZN14CBaseAnimating16LookupAttachmentEPKc"
"mac" "@_ZN14CBaseAnimating16LookupAttachmentEPKc"
}
}
}
/* SetUserInfo data */ /* SetUserInfo data */
"#default" "#default"
{ {

View File

@ -440,10 +440,19 @@ native CSWeaponID CS_ItemDefIndexToID(int iDefIndex);
* @return Returns item definition index value for the weapon id. * @return Returns item definition index value for the weapon id.
* @error Invalid weapon id. * @error Invalid weapon id.
* *
* @note In most cases the item deinition index will be the id. Works for CS:GO ONLY. * @note In most cases the item definition index will be the id. Works for CS:GO ONLY.
*/ */
native int CS_WeaponIDToItemDefIndex(CSWeaponID id); native int CS_WeaponIDToItemDefIndex(CSWeaponID id);
/**
* Returns the loadout slot based on the CSWeaponID. (CS:GO only)
*
* @param id CSWeaponID to get the loadout slot for.
* @return Returns loadout slot value for the weapon id.
* @error Invalid weapon id.
*/
native int CS_WeaponIDToLoadoutSlot(CSWeaponID id);
/** /**
* Do not edit below this line! * Do not edit below this line!
*/ */
@ -484,5 +493,6 @@ public void __ext_cstrike_SetNTVOptional()
MarkNativeAsOptional("CS_UpdateClientModel"); MarkNativeAsOptional("CS_UpdateClientModel");
MarkNativeAsOptional("CS_ItemDefIndexToID"); MarkNativeAsOptional("CS_ItemDefIndexToID");
MarkNativeAsOptional("CS_WeaponIDToItemDefIndex"); MarkNativeAsOptional("CS_WeaponIDToItemDefIndex");
MarkNativeAsOptional("CS_WeaponIDToLoadoutSlot");
} }
#endif #endif

View File

@ -959,6 +959,10 @@ native bool SQL_Execute(Handle statement);
* If the lock cannot be acquired, the main thread will pause until the * If the lock cannot be acquired, the main thread will pause until the
* threaded operation has concluded. * threaded operation has concluded.
* *
* Care should be taken to not lock an already-locked database. Internally,
* lock calls are nested recursively and must be paired with an equal amount
* of unlocks to be undone. This behaviour should not be relied on.
*
* @param database A database Handle. * @param database A database Handle.
* @error Invalid database Handle. * @error Invalid database Handle.
*/ */

View File

@ -97,6 +97,19 @@ native float FloatAdd(float oper1, float oper2);
#pragma deprecated This native is internal implementation. For subtraction use the '-' operator. #pragma deprecated This native is internal implementation. For subtraction use the '-' operator.
native float FloatSub(float oper1, float oper2); native float FloatSub(float oper1, float oper2);
/**
* Returns the modulus of oper1 and oper2.
*
* Note: This native is internal implementation. For modulo use the '%' operator.
*
* @param oper1 First value.
* @param oper2 Second value.
* @return oper1%oper2.
* @deprecated This native is internal implementation. For modulo use the '%' operator.
*/
#pragma deprecated This native is internal implementation. For modulo use the '%' operator.
native float FloatMod(float oper1, float oper2);
/** /**
* Returns the decimal part of a float. * Returns the decimal part of a float.
* *
@ -269,6 +282,7 @@ native float __FLOAT_MUL__(float a, float b) = FloatMul;
native float __FLOAT_DIV__(float a, float b) = FloatDiv; native float __FLOAT_DIV__(float a, float b) = FloatDiv;
native float __FLOAT_ADD__(float a, float b) = FloatAdd; native float __FLOAT_ADD__(float a, float b) = FloatAdd;
native float __FLOAT_SUB__(float a, float b) = FloatSub; native float __FLOAT_SUB__(float a, float b) = FloatSub;
native float __FLOAT_MOD__(float a, float b) = FloatMod;
native bool __FLOAT_GT__(float a, float b); native bool __FLOAT_GT__(float a, float b);
native bool __FLOAT_GE__(float a, float b); native bool __FLOAT_GE__(float a, float b);
@ -282,6 +296,7 @@ native float operator*(float oper1, float oper2) = FloatMul;
native float operator/(float oper1, float oper2) = FloatDiv; native float operator/(float oper1, float oper2) = FloatDiv;
native float operator+(float oper1, float oper2) = FloatAdd; native float operator+(float oper1, float oper2) = FloatAdd;
native float operator-(float oper1, float oper2) = FloatSub; native float operator-(float oper1, float oper2) = FloatSub;
native float operator%(float oper1, float oper2) = FloatMod;
native bool operator!(float oper1) = __FLOAT_NOT__; native bool operator!(float oper1) = __FLOAT_NOT__;
native bool operator>(float oper1, float oper2) = __FLOAT_GT__; native bool operator>(float oper1, float oper2) = __FLOAT_GT__;
native bool operator>=(float oper1, float oper2) = __FLOAT_GE__; native bool operator>=(float oper1, float oper2) = __FLOAT_GE__;
@ -387,12 +402,15 @@ stock bool operator<=(int oper1, float oper2)
return __FLOAT_LE__(float(oper1), oper2); return __FLOAT_LE__(float(oper1), oper2);
} }
/** stock float operator%(float oper1, int oper2)
* Forbidden operators. {
*/ return __FLOAT_MOD__(oper1, float(oper2));
forward float operator%(float oper1, float oper2); }
forward float operator%(float oper1, int oper2);
forward float operator%(int oper1, float oper2); stock float operator%(int oper1, float oper2)
{
return __FLOAT_MOD__(float(oper1), oper2);
}
#endif // __sourcepawn2__ #endif // __sourcepawn2__
#define FLOAT_PI 3.1415926535897932384626433832795 #define FLOAT_PI 3.1415926535897932384626433832795

View File

@ -241,7 +241,8 @@ methodmap KeyValues < Handle
// have the previous key saved for backwards traversal. // have the previous key saved for backwards traversal.
// //
// @param kv KeyValues Handle. // @param kv KeyValues Handle.
public native void SavePosition(); // @return True on success, false if there is no higher node.
public native bool SavePosition();
// Jumps back to the previous position. Returns false if there are no // Jumps back to the previous position. Returns false if there are no
// previous positions (i.e., at the root node). This should be called // previous positions (i.e., at the root node). This should be called
@ -523,9 +524,10 @@ native bool KvGotoNextKey(Handle kv, bool keyOnly=true);
* have the previous key saved for backwards traversal. * have the previous key saved for backwards traversal.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @return True on success, false if there is no higher node.
* @error Invalid Handle. * @error Invalid Handle.
*/ */
native void KvSavePosition(Handle kv); native bool KvSavePosition(Handle kv);
/** /**
* Removes the given key from the current position. * Removes the given key from the current position.

View File

@ -191,11 +191,11 @@ public Action Command_MapHistory(int client, int args)
int lastMapStartTime = g_CurrentMapStartTime; int lastMapStartTime = g_CurrentMapStartTime;
PrintToConsole(client, "Map History:\n"); PrintToConsole(client, "%t:\n", "Map History");
PrintToConsole(client, "Map : Started : Played Time : Reason for ending"); PrintToConsole(client, "%t : %t : %t : %t", "Map", "Started", "Played Time", "Reason");
GetCurrentMap(mapName, sizeof(mapName)); GetCurrentMap(mapName, sizeof(mapName));
PrintToConsole(client, "%02i. %s (Current Map)", 0, mapName); PrintToConsole(client, "%02i. %s (%t)", 0, mapName, "Current Map");
for (int i=0; i<mapCount; i++) for (int i=0; i<mapCount; i++)
{ {

View File

@ -145,7 +145,7 @@ public Action Command_Addmap(int client, int args)
int status; int status;
if (!g_mapTrie.GetValue(resolvedMap, status)) if (!g_mapTrie.GetValue(resolvedMap, status))
{ {
ReplyToCommand(client, "%t", "Map was not found", displayName); ReplyToCommand(client, "%t", "Map Not In Pool", displayName);
return Plugin_Handled; return Plugin_Handled;
} }
@ -300,7 +300,7 @@ void AttemptNominate(int client, const char[] map, int size)
int status; int status;
if (!g_mapTrie.GetValue(mapname, status)) if (!g_mapTrie.GetValue(mapname, status))
{ {
ReplyToCommand(client, "%t", "Map was not found", displayName); ReplyToCommand(client, "%t", "Map Not In Pool", displayName);
return; return;
} }

View File

@ -1,5 +1,6 @@
# vim: set ts=8 sts=2 sw=2 tw=99 et ft=python: # vim: set ts=8 sts=2 sw=2 tw=99 et ft=python:
import os import os
import re
builder.SetBuildFolder('package') builder.SetBuildFolder('package')
@ -126,3 +127,17 @@ helpers.CopyFiles('plugins/basevotes', 'addons/sourcemod/scripting/basevotes')
helpers.CopyFiles('plugins/basebans', 'addons/sourcemod/scripting/basebans') helpers.CopyFiles('plugins/basebans', 'addons/sourcemod/scripting/basebans')
helpers.CopyFiles('plugins/funcommands', 'addons/sourcemod/scripting/funcommands') helpers.CopyFiles('plugins/funcommands', 'addons/sourcemod/scripting/funcommands')
helpers.CopyFiles('plugins/playercommands', 'addons/sourcemod/scripting/playercommands') helpers.CopyFiles('plugins/playercommands', 'addons/sourcemod/scripting/playercommands')
with open(os.path.join(builder.sourcePath, 'configs/languages.cfg'), 'r') as f:
language_re = re.compile(r'^\s*"([^"]+)"\s+"[^"]+"')
added_languages = set(["en"])
for line in f.read().splitlines():
match = language_re.match(line)
if match:
lang_code = match.group(1)
if lang_code in added_languages:
continue
output_path = os.path.join('addons/sourcemod/translations', lang_code)
helpers.CreateFolders([output_path])
helpers.CopyFiles(os.path.join('translations', lang_code), output_path)
added_languages.add(lang_code)

View File

@ -36,27 +36,6 @@ require 'helpers.pm';
#Switch to the output folder. #Switch to the output folder.
chdir(Build::PathFormat('../../../OUTPUT/package')); chdir(Build::PathFormat('../../../OUTPUT/package'));
print "Downloading languages.cfg...\n";
# Don't check certificate. It will fail on the slaves and we're resolving to internal addressing anyway
system('wget --no-check-certificate -q -O addons/sourcemod/configs/languages.cfg "https://sm.alliedmods.net/translator/index.php?go=translate&op=export_langs"');
open(my $fh, '<', 'addons/sourcemod/configs/languages.cfg')
or die "Could not open languages.cfg' $!";
while (my $ln = <$fh>) {
if ($ln =~ /"([^"]+)"\s*"[^"]+.*\((\d+)\) /)
{
my $abbr = $1;
my $id = $2;
print "Downloading language pack $abbr.zip...\n";
# Don't check certificate. It will fail on the slaves and we're resolving to internal addressing anyway
system("wget --no-check-certificate -q -O $abbr.zip \"https://sm.alliedmods.net/translator/index.php?go=translate&op=export&lang_id=$id\"");
system("unzip -qo $abbr.zip -d addons/sourcemod/translations/");
unlink("$abbr.zip");
}
}
close($fh);
unless (-e '../GeoLite2-City_20191217.tar') unless (-e '../GeoLite2-City_20191217.tar')
{ {
print "Downloading GeoLite2-City.mmdb...\n"; print "Downloading GeoLite2-City.mmdb...\n";

View File

@ -0,0 +1,283 @@
#!/usr/bin/python3
# Copyright (c) 2023 Peace-Maker
from collections import defaultdict
from dataclasses import dataclass
import os
import pathlib
import re
from smc_parser import smc_string_to_dict
from typing import Dict, List, Union
from github_gql import GithubGQL
@dataclass
class Translation:
langid: str
translation: str
param_count: int
@dataclass
class Phrase:
key: str
format: Union[Translation, None]
translations: List[Translation]
@dataclass
class PhraseFile:
filename: str
phrases: List[Phrase]
error: Union[str, None] = None
@dataclass
class Language:
langid: str
name: str
files: List[PhraseFile]
@dataclass
class Report:
langid: str
filename: str
file_warning: str = ''
phrase_key: str = ''
phrase_warning: str = ''
def parse_translations(path: str):
param_regex = re.compile(r'\{[0-9]+\}', re.MULTILINE)
units = []
for file in pathlib.Path(path).glob('*.txt'):
if not file.is_file():
continue
try:
phrases = smc_string_to_dict(file.read_text('utf-8'))
except Exception as ex:
print(f'Error parsing {file.name}: {ex}')
units.append(PhraseFile(file.name, [], str(ex)))
continue
if 'Phrases' not in phrases:
print(f'File {file.name} does not start with a "Phrases" section')
continue
parsed_phrases = []
for phrase in phrases['Phrases']:
for phrase_ident, raw_translations in phrase.items():
translations = []
format_special = None
for child_langid, translation in raw_translations.items():
if child_langid == '#format':
format_special = Translation(
child_langid, translation,
translation.count(',') + 1)
else:
translations.append(
Translation(child_langid, translation,
len(param_regex.findall(translation))))
parsed_phrases.append(
Phrase(phrase_ident, format_special, translations))
units.append(PhraseFile(file.name, parsed_phrases))
return units
# Parse the languages.cfg file to know which languages could be available
print('Parsing languages.cfg...')
available_languages: Dict[str, Language] = {}
languages_cfg = smc_string_to_dict(
pathlib.Path('../../configs/languages.cfg').read_text('utf-8'))
for langid, lang in languages_cfg['Languages'][0].items():
available_languages[langid] = Language(langid, lang, [])
print(f'Available languages: {len(available_languages)}')
# Parse the english translation, since it doesn't use a subdirectory and is the baseline for all other translations
available_languages['en'].files = parse_translations('../../translations')
# Parse the other translations
for langid, lang in available_languages.items():
if langid == 'en':
continue
lang.files = parse_translations(f'../../translations/{langid}')
reports: Dict[str, Dict[str,
List[Report]]] = defaultdict(lambda: defaultdict(list))
# Compare the english translation with the other translations
english = available_languages['en']
for langid, lang in available_languages.items():
if langid == 'en':
continue
# See if this language has anything that English doesn't
for file in lang.files:
english_file = next(
(x for x in english.files if x.filename == file.filename), None)
if english_file is None:
reports[langid][file.filename].append(
Report(langid,
file.filename,
file_warning='File doesn\'t exist in English'))
continue
if not file.phrases:
reports[langid][file.filename].append(
Report(langid, file.filename, file_warning='File is empty'))
continue
for phrase in file.phrases:
if phrase.format:
reports[langid][file.filename].append(
Report(langid,
file.filename,
phrase_key=phrase.key,
phrase_warning='Includes a "#format" key'))
english_phrase = next(
(x for x in english_file.phrases if x.key == phrase.key), None)
if english_phrase is None:
# look for this phrase in a different english file
warning = 'Phrase doesn\'t exist in English'
for other_file in english.files:
other_phrase = next(
(x for x in other_file.phrases if x.key == phrase.key),
None)
if other_phrase:
warning = f'Phrase exists in a different file in English: {other_file.filename}'
break
reports[langid][file.filename].append(
Report(langid,
file.filename,
phrase_key=phrase.key,
phrase_warning=warning))
continue
translation_found = False
for translation in phrase.translations:
if translation.langid == langid:
translation_found = True
else:
reports[langid][file.filename].append(
Report(
langid,
file.filename,
phrase_key=phrase.key,
phrase_warning=
f'Includes a translation for language "{translation.langid}"'
))
if english_phrase.format and translation.param_count != english_phrase.format.param_count:
reports[langid][file.filename].append(
Report(
langid,
file.filename,
phrase_key=phrase.key,
phrase_warning=
f'Has {translation.param_count} format parameters, but English has {english_phrase.format.param_count}'
))
if not translation_found:
reports[langid][file.filename].append(
Report(langid,
file.filename,
phrase_key=phrase.key,
phrase_warning=
'Phrase available, but translation missing'))
# See if this language is missing anything that English has
for file in english.files:
lang_file = next(
(x for x in lang.files if x.filename == file.filename), None)
if lang_file is None:
reports[langid][file.filename].append(
Report(langid, file.filename, file_warning='File missing'))
continue
# The file doesn't contain any phrases. We reported that already, so don't spam every single missing phrase
if not lang_file.phrases:
continue
for phrase in file.phrases:
lang_phrase = next(
(x for x in lang_file.phrases if x.key == phrase.key), None)
if lang_phrase is None:
reports[langid][file.filename].append(
Report(langid,
file.filename,
phrase_key=phrase.key,
phrase_warning='Phrase missing'))
if langid not in reports:
print(f'No issues found for {lang.name} ({langid})')
else:
print(
f'Found {len(reports[langid])} issues for {lang.name} ({langid})')
GITHUB_TOKEN = os.environ.get('GITHUB_TOKEN')
if not GITHUB_TOKEN:
raise Exception('GITHUB_TOKEN environment variable not set')
ORGANIZATION = os.environ.get('ORGANIZATION')
if not ORGANIZATION:
raise Exception('ORGANIZATION environment variable not set')
PROJECT_NUMBER = os.environ.get('PROJECT_NUMBER')
if not PROJECT_NUMBER:
raise Exception('PROJECT_NUMBER environment variable not set')
# Get the project and its draft issues
print('Getting project and draft issues...')
githubgql = GithubGQL(GITHUB_TOKEN)
project = githubgql.get_project(ORGANIZATION, int(PROJECT_NUMBER))
project_id = project['id']
field_ids = project['fields']['nodes']
status_field = [field for field in field_ids if field['name'] == 'Status']
assert len(status_field) == 1, 'Status field not found'
status_field_id = status_field[0]['id']
status_field_option_ids = {
option['name']: option['id']
for option in status_field[0]['options']
}
if 'Incomplete' not in status_field_option_ids:
raise Exception('Incomplete status field option not found')
if 'Complete' not in status_field_option_ids:
raise Exception('Complete status field option not found')
draft_issues = project['items']['nodes']
# Generate the report markdown for the project draft issues
for langid, lang in available_languages.items():
markdown = ''
status = ''
if langid in reports:
print(f'Generating report for {lang.name} ({langid})...')
status = 'Incomplete'
for filename, problems in reports[langid].items():
markdown += f'## [{filename}](https://github.com/alliedmodders/sourcemod/blob/master/translations/{langid}/{filename})\n'
added_phrase_warning = False
for report in problems:
if report.file_warning:
markdown += f'**{report.file_warning}**\n'
print(f' {report.file_warning} ({report.filename})')
if report.phrase_warning:
if not added_phrase_warning:
markdown += '| Phrase | Issue |\n| ------- | --------- |\n'
added_phrase_warning = True
markdown += f'| `{report.phrase_key}` | {report.phrase_warning} |\n'
print(
f' {report.filename}: "{report.phrase_key}" -> {report.phrase_warning}'
)
markdown += '\n'
else:
status = 'Complete'
markdown = 'No issues found'
print(f'Updating draft issue for {lang.name} ({langid})...')
issue = next(
(x for x in draft_issues if x['content']['title'] == lang.name), None)
if issue is None:
issue = githubgql.add_draft_issue(project_id, lang.name, markdown)
else:
githubgql.update_draft_issue(issue['content']['id'], lang.name,
markdown)
githubgql.update_item_field_value_option(project_id, issue['id'],
status_field_id,
status_field_option_ids[status])

View File

@ -0,0 +1,156 @@
# Copyright (c) 2023 Peace-Maker
from gql import gql, Client
from gql.transport.aiohttp import AIOHTTPTransport
class GithubGQL:
def __init__(self, token):
transport = AIOHTTPTransport(
url="https://api.github.com/graphql",
headers={"Authorization": f"Bearer {token}"})
self.client = Client(transport=transport)
def get_project(self, orga, project_number):
query = gql("""
query getProjectId($login: String!, $projectNumber: Int!){
organization(login: $login) {
projectV2(number: $projectNumber) {
id
fields(first: 100) {
nodes {
... on ProjectV2Field {
id
name
}
... on ProjectV2SingleSelectField {
id
name
options {
id
name
}
}
... on ProjectV2SingleSelectField {
id
name
options {
id
name
}
}
}
}
items(first: 100) {
nodes {
id
fieldValues(first: 100) {
nodes {
... on ProjectV2ItemFieldTextValue {
text
field {
... on ProjectV2FieldCommon {
name
}
}
}
... on ProjectV2ItemFieldSingleSelectValue {
name
field {
... on ProjectV2FieldCommon {
name
}
}
}
}
}
content {
... on DraftIssue {
id
title
}
}
}
}
}
}
}
""")
variables = {"login": orga, "projectNumber": project_number}
result = self.client.execute(query, variable_values=variables)
# TODO: Handle pagination
return result["organization"]["projectV2"]
def add_draft_issue(self, project_id, title, body):
query = gql("""
mutation addDraftIssue($projectId: ID!, $title: String!, $body: String!){
addProjectV2DraftIssue(
input: {
projectId: $projectId,
title: $title,
body: $body
}
) {
projectItem {
id
content {
... on DraftIssue {
id
}
}
}
}
}
""")
variables = {"projectId": project_id, "title": title, "body": body}
result = self.client.execute(query, variable_values=variables)
return result["addProjectV2DraftIssue"]["projectItem"]
def update_draft_issue(self, issue_id, title, body):
query = gql("""
mutation updateDraftIssue($issueId: ID!, $title: String!, $body: String!){
updateProjectV2DraftIssue(
input: {
draftIssueId: $issueId,
title: $title,
body: $body
}
) {
draftIssue {
id
}
}
}
""")
variables = {"issueId": issue_id, "title": title, "body": body}
result = self.client.execute(query, variable_values=variables)
return result["updateProjectV2DraftIssue"]["draftIssue"]["id"]
def update_item_field_value_option(self, project_id, item_id, field_id,
option_id):
query = gql("""
mutation updateDraftIssueStatus($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!){
updateProjectV2ItemFieldValue(
input: {
projectId: $projectId,
itemId: $itemId,
fieldId: $fieldId,
value: {
singleSelectOptionId: $optionId
}
}
) {
projectV2Item {
id
}
}
}
""")
variables = {
"projectId": project_id,
"itemId": item_id,
"fieldId": field_id,
"optionId": option_id
}
result = self.client.execute(query, variable_values=variables)
return result["updateProjectV2ItemFieldValue"]["projectV2Item"]["id"]

View File

@ -0,0 +1 @@
gql[aiohttp]

View File

@ -0,0 +1,203 @@
#!/usr/bin/python3
# BSD Zero Clause License
#
# Copyright (C) 2023 by nosoop
#
# Permission to use, copy, modify, and/or distribute this software for any purpose with or
# without fee is hereby granted.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
# SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
# OR PERFORMANCE OF THIS SOFTWARE.
# https://gist.github.com/nosoop/8c6ccaec11b1d33340bec8dbc8096658
import collections
import enum
import itertools
class SMCOperation(enum.Enum):
STRING = 1
SUBSECTION_START = 2
SUBSECTION_END = 3
COMMENT = 4
COMMENT_MULTILINE = 5
KEYVALUE = 6
# https://stackoverflow.com/a/70762559
def takewhile_inclusive(predicate, it):
for x in it:
if predicate(x):
yield x
else:
yield x
break
def _is_whitespace(ch):
return ch in (' ', '\t', '\n', '\r')
def _smc_stream_skip_whitespace(stream):
# consumes whitespace and returns the first non-whitespace character if any, or None if EOS
values = tuple(takewhile_inclusive(_is_whitespace, stream))
if not values:
return None
*ws, last = values
if not ws and not _is_whitespace(last):
return last
return last if ws and not _is_whitespace(last) else None
def _smc_stream_extract_multiline_comment(stream):
while True:
yield from itertools.takewhile(lambda ch: ch != '*', stream)
ch = next(stream, None)
if ch == '/':
return
yield '*'
yield ch
_escape_mapping = str.maketrans({
'"': '"',
'n': '\n',
'r': '\r',
't': '\t',
'\\': '\\',
})
def _smc_stream_extract_string(stream):
for ch in stream:
if ch == "\\":
ch = next(stream).translate(_escape_mapping)
elif ch == '"':
return
yield ch
def parse_smc_string(data):
stream = iter(data)
while True:
ch = _smc_stream_skip_whitespace(stream)
if ch is None:
return
elif ch == '"':
# consume until the next quote, then determine if:
# - the string marks the subsection name '{'
# - we have another string to consume, making this a key / value pair
key = ''.join(_smc_stream_extract_string(stream))
ch = _smc_stream_skip_whitespace(stream)
if ch == '{':
yield SMCOperation.SUBSECTION_START, key
elif ch == '"':
value = ''.join(_smc_stream_extract_string(stream))
yield SMCOperation.KEYVALUE, key, value
else:
raise ValueError(
f"Unexpected character {ch.encode('ascii', 'backslashreplace')} after end of string"
)
elif ch == '}':
yield SMCOperation.SUBSECTION_END, None
elif ch == '/':
ch = next(stream)
if ch == '/':
# single line comment: consume until the end of the line
value = ''.join(
itertools.takewhile(lambda ch: ch != '\n', stream))
yield SMCOperation.COMMENT, value
elif ch == '*':
# multi line comment: consume until the sequence '*/' is reached
value = ''.join(_smc_stream_extract_multiline_comment(stream))
yield SMCOperation.COMMENT_MULTILINE, value
else:
raise ValueError(
f"Unexpected character {ch.encode('ascii', 'backslashreplace')} at start of comment"
)
else:
raise ValueError(
f"Unexpected character {ch.encode('ascii', 'backslashreplace')}"
)
class MultiKeyDict(collections.defaultdict):
# a dict that supports supports one-to-many mappings
# init by passing keys pointing to a list of values
def __init__(self, *args, **kwargs):
super().__init__(list, *args, **kwargs)
# yields a key, value pair for every array item associated with a key
def items(self):
yield from ((k, iv) for k, v in super().items() for iv in v)
def smc_string_to_dict(data):
# returns a multidict instance
root_node = MultiKeyDict()
contexts = [root_node]
for event, *info in parse_smc_string(data):
if event == SMCOperation.SUBSECTION_START:
key, *_ = info
subkey = MultiKeyDict()
contexts[-1][key].append(subkey)
contexts.append(subkey)
elif event == SMCOperation.SUBSECTION_END:
contexts.pop()
elif event == SMCOperation.KEYVALUE:
key, value = info
contexts[-1][key].append(value)
return root_node
def main():
SMC_STRING = """
"thing"
{
// this is a comment node
"key" "value"
"subthing"
{
// and another
"subthing key" "subthing value"
"subthing key" "duplicate key value"
}
"subthing"
{
"duplicate subthing" "yes"
}
/**
* this is a multiline comment node
*/
"another key" "another value"
}
"""
# sections = []
# for event, *data in parse_smc_string(SMC_STRING):
# print(event, data, tuple(sections))
# if event == SMCOperation.SUBSECTION_START:
# section, *_ = data
# sections.append(section)
# elif event == SMCOperation.SUBSECTION_END:
# sections.pop()
# assert(not sections)
import json
import pathlib
# print(json.dumps(smc_string_to_dict(SMC_STRING), indent=4))
for f in pathlib.Path('translations').rglob('*.txt'):
print(f)
print(json.dumps(smc_string_to_dict(f.read_text('utf8')), indent = 4))
if __name__ == "__main__":
main()

View File

@ -0,0 +1,33 @@
"Phrases"
{
"SM help commands"
{
"ar" "مساعدة SourceMod: معلومات الامر"
}
"No description available"
{
"ar" "لا وصف موجود"
}
"No commands available"
{
"ar" "لا اوامر موجودة"
}
"Type sm_help to see more"
{
"ar" "اكتب sm_help {1} لترى المزيد من الاوامر"
}
"Entries n - m in page k"
{
"ar" "جزء {1} - {2} في الصفحة {3} "
}
"No matching results found"
{
"ar" "لم يتم العثور على نتائج مطابقه"
}
}

View File

@ -0,0 +1,23 @@
"Phrases"
{
"Admin Menu"
{
"ar" "قائمة المدير"
}
"Player Commands"
{
"ar" "اوامر اللاعبين"
}
"Server Commands"
{
"ar" "اوامر السيرفر"
}
"Voting Commands"
{
"ar" "اوامر التصويت"
}
}

View File

@ -0,0 +1,8 @@
"Phrases"
{
"Flooding the server"
{
"ar" "انت تفيض السيرفر!"
}
}

View File

@ -0,0 +1,63 @@
"Phrases"
{
"Ban player"
{
"ar" "لاعب الحظر"
}
"Ban reason"
{
"ar" "سبب الحظر"
}
"Permabanned player"
{
"ar" "لاعب فرض حظر دائم \"{1}\""
}
"Permabanned player reason"
{
"ar" "لاعب فرض حظر دائم \"{1}\" (السبب: {2})."
}
"Banned player"
{
"ar" " حظرت \"{1}\" لمدة \"{2}\" دقيقة"
}
"Banned player reason"
{
"ar" "لاعب المحظورة \"{1}\" ل{2} دقيقة (السبب: {3})"
}
"Removed bans matching"
{
"ar" "يحظر إزالة مطابقة التصفية: {1}"
}
"Ban added"
{
"ar" "تمت إضافة حظر"
}
"Cannot ban that IP"
{
"ar" "لا يمكنك حظر عنوان IP"
}
"Custom ban reason explanation"
{
"ar" "أكتب سبب الحظر. إستعمل {1} للإلغاء."
}
"AbortBan applied successfully"
{
"ar" "تم إلغاء الحظر"
}
"AbortBan not waiting for custom reason"
{
"ar" "لا حظر ليتم الإلغاء"
}
}

View File

@ -0,0 +1,73 @@
"Phrases"
{
"Gag/Mute player"
{
"ar" "إحظر الكتابة/التكلم"
}
"Choose Type"
{
"ar" "إختر"
}
"Gagged target"
{
"ar" "ختابة محظورة على {1}"
}
"Ungagged target"
{
"ar" "تم رفع حظرالكتابة على {1}"
}
"Muted target"
{
"ar" "محظور من التكلم {1}"
}
"Unmuted target"
{
"ar" "تم رفع حظرالتكلم على {1}"
}
"Silenced target"
{
"ar" "لاعب ممنوع من التكلم و الكتابة {1}"
}
"Unsilenced target"
{
"ar" "تم رفع حظرالتكلم و الكتابة على {1}"
}
"Mute Player"
{
"ar" "إحظراللاعب من التكلم"
}
"UnMute Player"
{
"ar" "إرفع حظرالتكلم"
}
"Gag Player"
{
"ar" "إحظر الكتابة على اللاعب "
}
"UnGag Player"
{
"ar" "إرفع حظرالكتابة"
}
"Silence Player"
{
"ar" "إمنع اللاعب من التكلم و الكتابة"
}
"UnSilence Player"
{
"ar" "إرفع حظرالتكلم و الكتابة"
}
}

View File

@ -0,0 +1,108 @@
"Phrases"
{
"Timeleft"
{
"ar" "الوقت المتبقي للخريطة: {1}"
}
"Thetime"
{
"ar" "توقيت السيرفر الحالي هو: {1}"
}
"Friendly Fire On"
{
"ar" "النار الصديقة مستعملة"
}
"Friendly Fire Off"
{
"ar" "النار الصديقة موقوفة "
}
"Current Map"
{
"ar" "الخريطة الحالية هي: {1}"
}
"LastRound"
{
"ar" "هذه هي الدورة الأخيرة!!"
}
"NoTimelimit"
{
"ar" "لا وقت محدود للخريطة"
}
"Next Map"
{
"ar" "الخريطة التالية: {1}"
}
"Pending Vote"
{
"ar" "لم يتم التصويت بعد"
}
"WinLimitAppend"
{
"ar" "، أو غير الخريطة بعد فوز فريق دورا واحد"
}
"WinLimit"
{
"ar" "سيتم تغيير الخريطة بعد فوز فريق دورا واحد"
}
"MaxRoundsAppend"
{
"ar" "، أو غير الخريطة بعد دور واحد"
}
"MaxRounds"
{
"ar" "سيتم تغيير الخريطة بعد دور واحد"
}
"FragLimitAppend"
{
"ar" "، أو عند قتل لاعب."
}
"FragLimit"
{
"ar" "سيتم تغيير الماپة بعد ميو لاعب ما."
}
"WinLimitAppendPlural"
{
"ar" "، أو غير الخريطة بعد فوز فريق {1} دورة"
}
"WinLimitPlural"
{
"ar" "سيتم تغيير الخريطة بعد فوز فريق ب{1} دور."
}
"MaxRoundsAppendPlural"
{
"ar" "، أو غير الخريطة بعد {1} دورة"
}
"MaxRoundsPlural"
{
"ar" "سيتم تغيير الخريطة بعد {1} دورة"
}
"FragLimitAppendPlural"
{
"ar" "، أو عند قتل أكثر من {1} لاعب."
}
"FragLimitPlural"
{
"ar" "سيتم تغير الخريطة بعد قتل {1}."
}
}

View File

@ -0,0 +1,88 @@
"Phrases"
{
"Initiate Vote"
{
"ar" "أبدأ التصويت: {1}"
}
"Initiated Vote Map"
{
"ar" "إبتدأ تصويت المابة "
}
"Initiated Vote Kick"
{
"ar" "تصويت الطرد المبتدأ ضد {1}"
}
"Initiated Vote Ban"
{
"ar" "تصويت الحظر المبتدأ ضد {1}"
}
"Map Vote"
{
"ar" "تصويت المابة {1}:"
}
"Change Map To"
{
"ar" "غير المابة ل: {1} ؟"
}
"Votekick Player"
{
"ar" "إطرد اللاعب {1} ؟"
}
"Voteban Player"
{
"ar" "إحظر اللعب على {1} ؟"
}
"Vote Successful"
{
"ar" "تصويت ناجح. (تم الحصول على {1}%% من {2})"
}
"Vote Failed"
{
"ar" "فشل التصويت. {1}%% تصويت لازم. (حصل {2}%% من {3} تصويتات)"
}
"Vote End"
{
"ar" "الجواب ل {1} هو: {2}"
}
"Kick vote"
{
"ar" "تصويت الطرد"
}
"Ban vote"
{
"ar" "تصويت الحظر"
}
"Map vote"
{
"ar" "تصويت المابة"
}
"Confirm Vote"
{
"ar" "أكد التصويت"
}
"Map Vote In Use"
{
"ar" "تصويت المابة في إستعمال"
}
"Start the Vote"
{
"ar" "إبدأ التصويت"
}
}

View File

@ -0,0 +1,48 @@
"Phrases"
{
"Cookie List"
{
"ar" "لائحة الكوكيز "
}
"Printing Cookie List"
{
"ar" "يتم عرض لائحة الكوكيز إلى وحدة التحكم"
}
"Cookie not Found"
{
"ar" "لم يتم العثور على الكوكي {1}"
}
"Cookie Value"
{
"ar" "{1} قيمة هي {2}"
}
"Protected Cookie"
{
"ar" "لا يمكن تغيروحدة الكوكي المحمية \"{1}\""
}
"Cookie Changed Value"
{
"ar" "تم تغيير الكوكيز من \"{1}\" إلى \"{2}\""
}
"No Console"
{
"ar" "لا يمكن عرض التعديلات في وحدت التحكم"
}
"Choose Option"
{
"ar" "إختر إختيارا :"
}
"Client Settings"
{
"ar" "تعديلات اللاعب"
}
}

View File

@ -0,0 +1,233 @@
"Phrases"
{
"Yes"
{
"ar" "نعم"
}
"No"
{
"ar" "لا"
}
"No matching client"
{
"ar" "لم يتم العثور على لاعب مطابق."
}
"No matching clients"
{
"ar" "لم يتم العثور على لاعبين مطابقين."
}
"More than one client matches"
{
"ar" "أكثر من لاعب يطابق الأمر المعطى \"{1}\""
}
"More than one client matched"
{
"ar" "أكثر من لاعب يطابق الأمر المعطى"
}
"Player no longer available"
{
"ar" "اللاعب الذي إخترت غير موجود."
}
"Kick player"
{
"ar" "إطرد اللاعب"
}
"Kicked by admin"
{
"ar" "طرد من قبل الآدمن"
}
"Changing map"
{
"ar" "يتم تغيير المابة ل {1}..."
}
"Map was not found"
{
"ar" "لم يتم العثور على المابة {1}."
}
"Unable to target"
{
"ar" "لا يمكن الإسعمال على هذا اللاعب."
}
"Name"
{
"ar" "الإسم"
}
"Access"
{
"ar" "إذن الدخول"
}
"See console for output"
{
"ar" "أنظر ال'console' للمعلومات."
}
"Cannot target bot"
{
"ar" "لا يمكنك تنفيذ العمليةعلى لاعب(إلكتروني)."
}
"Unable to find cvar"
{
"ar" "لا يمكن العثور على الإعداد: {1}"
}
"No access to cvar"
{
"ar" "ليس لديك الحق لتمارس الأمر."
}
"Value of cvar"
{
"ar" "قيمت الإعداد \"{1}\": \"{2}\""
}
"Cvar changed"
{
"ar" "تم تغير التعديل \"{1}\" إلى \"{2}\""
}
"Config not found"
{
"ar" "لم يتم العثور على ملف التعديلات {1}"
}
"Executed config"
{
"ar" "التعديلات المستعملة {1}."
}
"Admin cache refreshed"
{
"ar" "تم تنعيش تخزين الأدمن ."
}
"Invalid Amount"
{
"ar" "الحجم المحدد غير مسموح"
}
"Cannot be performed on dead"
{
"ar" "لا يمكن تنفيد العملية على لاعب ميت \"{1}\""
}
"Player has since died"
{
"ar" "لا يمكن تنفيد العملية على اللاعب، منذ موته."
}
"Vote in Progress"
{
"ar" "هناك تصويت حاليا."
}
"Vote Not In Progress"
{
"ar" "لا يوجد هناك تصويت حاليا."
}
"Cancelled Vote"
{
"ar" "الغى التصويت."
}
"Cancel vote"
{
"ar" "تم إلغاء التصويت"
}
"Vote Select"
{
"ar" "{1} إختار {2}."
}
"No Votes Cast"
{
"ar" "لم يتم تلقي أي تصويت."
}
"Vote Delay Minutes"
{
"ar" "يجب عليك الإنتظار {1} دقائق حتى إعادت تصويت آخر."
}
"Vote Delay Seconds"
{
"ar" "يجب عليك الإنتظار {1} ثوان حتى إعادت تصويت آخر."
}
"Could not connect to database"
{
"ar" "لم يمكن التوصل بقاعدة البيانات."
}
"Failed to query database"
{
"ar" "لم يمكن استعاد المعلومات من قاعدة البيانات."
}
"Invalid SteamID specified"
{
"ar" "لقد حددة رقم خاطئ(لابد أن يبدء ب STEAM_)"
}
"Reload admins"
{
"ar" "أعد تحميل لائحت الأدمن."
}
"Command is in-game only"
{
"ar" "لا يمكنك من خارج اللعبة."
}
"Target must be dead"
{
"ar" "العملية يمكن إستعمالها على اللاعبين الأموات فقط."
}
"Target must be alive"
{
"ar" "العملية يمكن إستعمالها على اللاعبين الأحياء فقط."
}
"Target is not in game"
{
"ar" "اللاعب ليس بالداخل كاملا."
}
"Cannot participate in vote"
{
"ar" "لا يمكنك المشاركة في هذا التصويت."
}
"Cannot change vote"
{
"ar" "لا يمكنك تغيير مجموعتك لهذا التصويت."
}
"On"
{
"ar" "مشغل"
}
"Off"
{
"ar" "مطفأ"
}
}

View File

@ -0,0 +1,88 @@
"Phrases"
{
"No Access"
{
"ar" "ليس لديك صلاحية لهذا الامر"
}
"Back"
{
"ar" "الرجوع"
}
"Next"
{
"ar" "التالي"
}
"Exit"
{
"ar" "الخروج"
}
"Previous"
{
"ar" "السابق"
}
"all players"
{
"ar" "كل اللاعبين"
}
"all humans"
{
"ar" "كل البشر"
}
"all bots"
{
"ar" "كل اللاعبين(الحاسوب)"
}
"all dead players"
{
"ar" "كل اللاعبين الاموات"
}
"all alive players"
{
"ar" "كل اللاعبين الاحياء"
}
"_s"
{
"ar" "{1}"
}
"all spectators"
{
"ar" "كل المشاهدين"
}
"Vote Count"
{
"ar" "تسويتات: {1}/{2}، {3} باقية"
}
"Voted For"
{
"ar" "{1} صوت ل {2}"
}
"Changed Vote"
{
"ar" "{1} غير تصويته ل {2}"
}
"No Vote"
{
"ar" "لا تصويت"
}
"Name Reserved"
{
"ar" "إسمك محجوز؛ عدل رقم سري لإتسعماله."
}
}

View File

@ -0,0 +1,168 @@
"Phrases"
{
"Burn player"
{
"ar" "أحرق اللاعب"
}
"FireBomb player"
{
"ar" "فجر اللاعب"
}
"Freeze player"
{
"ar" "جمد اللاعب"
}
"FreezeBomb player"
{
"ar" "جمد و فجر اللاعب"
}
"TimeBomb player"
{
"ar" "حدد وقت إنفجار اللاعب"
}
"Beacon player"
{
"ar" "حدد موقع اللاعب"
}
"NoClip player"
{
"ar" "حرر اللاعب"
}
"Blind player"
{
"ar" "إجعل اللاعب أعمى"
}
"Drug player"
{
"ar" "خدر اللاعب"
}
"Gravity player"
{
"ar" "مارس الجاجبية على اللاعب"
}
"Blind amount"
{
"ar" "مستوى العمى"
}
"Fully blind"
{
"ar" "أعمى بالكامل"
}
"Half blind"
{
"ar" "نصف أعمى"
}
"No blind"
{
"ar" "لا أعمى"
}
"Gravity amount"
{
"ar" "جاذبية؟"
}
"Gravity Very High"
{
"ar" "جاذبية جد عالية"
}
"Gravity High"
{
"ar" "جاذبية عالية"
}
"Gravity Normal"
{
"ar" "جاذبية عادية"
}
"Gravity Low"
{
"ar" "جاذبية خفيفة"
}
"Gravity Very Low"
{
"ar" "جاذبية جد خفيفة"
}
"Set target on fire"
{
"ar" "احرق اللاعب {1}"
}
"Toggled FireBomb on target"
{
"ar" "مارس الإنفجار على {1}"
}
"Froze target"
{
"ar" "جامد {1}"
}
"Toggled FreezeBomb on target"
{
"ar" "مارس التجميد و الانفجار على {1}"
}
"Toggled beacon on target"
{
"ar" "مارس تحديد الموقع على {1ç"
}
"Toggled TimeBomb on target"
{
"ar" "حدد الإنفجار المبرمج على {1}"
}
"Toggled noclip on target"
{
"ar" "مارس التحرير على {1}"
}
"Toggled drug on target"
{
"ar" "مارس التخدير على {1}"
}
"Set blind on target"
{
"ar" "إجعل اللاعب أعمى {1}"
}
"Set gravity on target"
{
"ar" "إجعل جاذبية اللاعب {1}"
}
"Till Explodes"
{
"ar" "{2} حتى إنفجار {1}"
}
"Unfrozen"
{
"ar" "تم عسك التجميد عنك"
}
"You will be unfrozen"
{
"ar" "سيتم عكس تجميدك في {1} ثوان"
}
}

View File

@ -0,0 +1,98 @@
"Phrases"
{
"Initiated Vote Gravity"
{
"ar" "إبتدء تصويت الجاذبية."
}
"Initiated Vote Burn"
{
"ar" "إبتدء التصويت لحرق {1}."
}
"Initiated Vote Slay"
{
"ar" "إبتدء التصية لقتل {1}."
}
"Initiated Vote Alltalk"
{
"ar" "إبتدء تصويت 'الجميع يتكلم'."
}
"Initiated Vote FF"
{
"ar" "إبتدء تصويت النيران الصديقة."
}
"Gravity Vote"
{
"ar" "تصويت الجاذبية: {1}"
}
"Change Gravity To"
{
"ar" "تغيير الجاذبية إلى {1}؟"
}
"Voteburn player"
{
"ar" "حرق اللاعب {1}؟"
}
"Voteslay Player"
{
"ar" "قتل {1}؟"
}
"Votealltalk Off"
{
"ar" "إيقاف تكلم الجميع؟ {1}"
}
"Votealltalk On"
{
"ar" "إمكان تكلم الجميع؟ {1}"
}
"Voteff Off"
{
"ar" "إيقاف النيران الصديقة؟ {1}"
}
"Voteff On"
{
"ar" "تشغيل النيران الصديقة؟ {1}"
}
"Gravity vote"
{
"ar" "تصويت الجاذبية"
}
"Vote FF"
{
"ar" "تصويت النيران الصديقة"
}
"Burn vote"
{
"ar" "تصويت الإحراق"
}
"Alltalk vote"
{
"ar" "تصويت الجميع يتكلم"
}
"Slay vote"
{
"ar" "تصويت للقتل"
}
"Slayed player"
{
"ar" "قتل اللاعب '{1}'"
}
}

View File

@ -0,0 +1,48 @@
"Phrases"
{
"Vote Nextmap"
{
"ar" "صوت للخريطة الآتية!"
}
"Nextmap Voting Started"
{
"ar" "إبتدأ التصويت للخريطة الآتية."
}
"Nextmap Voting Finished"
{
"ar" "تم التصويت. الخريطة الآتية هي: {1} (قبل {2}%% من {3} تسويت)."
}
"Current Map Extended"
{
"ar" "تم إطالت وقت الخريطة الحالية(قبل {1}%% من {2} تصويت)."
}
"Extend Map"
{
"ar" "أطل وقت الخريطة الحالية"
}
"Dont Change"
{
"ar" "لا تغير"
}
"Current Map Stays"
{
"ar" "الخريطة الحالية تستأنف! تم التصويت!(قبل {1}%% من {2} تصويت)."
}
"Changed Next Map"
{
"ar" "غير الخريطة الآتية ل\"{1}\"."
}
"Starting Runoff"
{
"ar" "لم تحصل أي خريطة على أكثر من {1} %% تصويت({2} [{3}%%] و {4} [{5}%%])، يتم إعادت التصويت"
}
}

View File

@ -0,0 +1,38 @@
"Phrases"
{
"Map History"
{
"ar" "تاريخ الخرائط"
}
"Map"
{
"ar" "[الخريطة]"
}
"Started"
{
"ar" "[إبتدء]"
}
"Played Time"
{
"ar" "[الوقت الملعوب]"
}
"Reason"
{
"ar" "[سب الإنهاء]"
}
"Current Map"
{
"ar" "الخريطة الحالية"
}
"ago"
{
"ar" "قبلاً "
}
}

View File

@ -0,0 +1,68 @@
"Phrases"
{
"Already Nominated"
{
"ar" "لقد سمية خريطة مسبقا."
}
"Max Nominations"
{
"ar" "العدد المسموح للتسمية تم وصوله."
}
"Map Already In Vote"
{
"ar" "الخريطة \"{1}\" موجودة مسبقا على لائحت التصويت."
}
"Map Inserted"
{
"ar" "تم إضافة الخريطة \"{1}\" إلى لائحت التصويث."
}
"Map Already Nominated"
{
"ar" "الخريطة التي إخترت تم تسميها مسبقا."
}
"Map Nominated"
{
"ar" "{1} سمى {2}."
}
"Map Nomination Changed"
{
"ar" "{1} غير تسميه ل\"{1}\"."
}
"Nominate Title"
{
"ar" "سم خريطة:"
}
"Can't Nominate Current Map"
{
"ar" "الخريطة التي أخترت هي الحالية ولا يمكن تسميهتها."
}
"Map in Exclude List"
{
"ar" "الخريطة التي إخترت تم لعبها من قبل ولا يمكن تسميتها"
}
"Current Map"
{
"ar" "الخريطة الحالية."
}
"Recently Played"
{
"ar" "تم اللعب فيها قبل قليل."
}
"Nominated"
{
"ar" "أختيرت"
}
}

View File

@ -0,0 +1,43 @@
"Phrases"
{
"Slap player"
{
"ar" "صفع اللاعب"
}
"Slap damage"
{
"ar" "ضرر الصفعة"
}
"Slay player"
{
"ar" "قتل اللاعب"
}
"Slapped target"
{
"ar" "صفع {1}."
}
"Slayed target"
{
"ar" "تم قتل {1}"
}
"Name changed"
{
"ar" "آدمن غير إسمك"
}
"Renamed target"
{
"ar" "غير إسم {1}"
}
"Rename player"
{
"ar" "غير إسم اللاعب"
}
}

View File

@ -0,0 +1,133 @@
"Phrases"
{
"Unable to find cvar"
{
"ar" "لم يتم العثور على الإعداد: {1}"
}
"No access to cvar"
{
"ar" "ليس لك الحق لإسعمال هذا الإعداد."
}
"Value of cvar"
{
"ar" "قيمة الإعداد \"{1}\": \"{2}\""
}
"Cvar changed"
{
"ar" "غير ال'cvar' من \"{1}\" إلى \"{2}\"."
}
"Config not found"
{
"ar" "لم يتم العثور على ملف الأعدادات {1}."
}
"Executed config"
{
"ar" "شغل الإعداد \"{1}\"."
}
"Permabanned player"
{
"ar" "حضر الاعب \"{1}\" من الدخول أبديا."
}
"Permabanned player reason"
{
"ar" "حضر الاعب \"{1}\" من الدخول أبديا(السبب: {1})."
}
"Banned player"
{
"ar" "حظر اللاعب \"{1}\" لمدت {2} دقائق."
}
"Banned player reason"
{
"ar" "حظر اللاعب \"{1}\" لمدت {2} دقائق(السبب: {3})."
}
"Removed bans matching"
{
"ar" "تم حذف الأحظار المطابقة: {1}"
}
"Ban added"
{
"ar" "تم إضافة الحظر."
}
"Admin cache refreshed"
{
"ar" "تم إنعاش ترخيصات الآدمن."
}
"Identify player"
{
"ar" "تعريف اللاعب"
}
"Choose Map"
{
"ar" "إختر خريطة"
}
"Exec CFG"
{
"ar" "إستعمل ملف إعداد"
}
"Admin logged in as"
{
"ar" "\"{1}\" دخل ك\"{2}\" بالترخيص: {3}"
}
"Admin logged in anon"
{
"ar" "\"{1}\" لديه ترخيص: {2}"
}
"Player is not an admin"
{
"ar" "\"{1}\" ليس بآدمن."
}
"Player is an admin"
{
"ar" "\"{1}\" هو آدمن."
}
"Username"
{
"ar" "إسم المستخدم"
}
"Kicked target"
{
"ar" "طرد {1}"
}
"Admin access"
{
"ar" "ترخيص للآدمن"
}
"Cvar is now protected"
{
"ar" "تم تحصين ال'cvar' \"{1}\"."
}
"Kicked target reason"
{
"ar" "طرد {1} (السبب: {2})."
}
"Please select a map"
{
"ar" "من فضلك إختر"
}
}

View File

@ -0,0 +1,8 @@
"Phrases"
{
"Slot reserved"
{
"ar" "تم إلقاءك لمكان محجوز."
}
}

View File

@ -0,0 +1,68 @@
"Phrases"
{
"Rock The Vote"
{
"ar" "عجل التصويت:"
}
"RTV Not Allowed"
{
"ar" "لا يمكن التصويت بعد."
}
"RTV Started"
{
"ar" "لقد تم بدأ التصويت مسبقا."
}
"RTV Ended"
{
"ar" "لقد تم التصويت. لا يمكنك إختيار أو تسمية خريطة."
}
"Already Voted"
{
"ar" "لقد أردت التصويت مسبقا!"
}
"Minimal Players Not Met"
{
"ar" "عدد اللاعبين المطليب غير موجود."
}
"RTV Requested"
{
"ar" "{1} يريد أن يبدأ التصويت.({2} تصويت. {3} لازمة)"
}
"RTV Vote Ready"
{
"ar" "يتم تعجيل التصويت!"
}
"Don't Change"
{
"ar" "إستئناف الخريطة الحالية"
}
"Selected Map"
{
"ar" "{1} إختار {2}"
}
"No Votes"
{
"ar" "لا تصويت. يتم إستئناف الخريطة الحالية."
}
"Current Map Stays"
{
"ar" "الخريطة الحالية تستأنف! لقد أستعمل التصويت!"
}
"Changing Maps"
{
"ar" "لقد أردت التصويت مسبقا.({1} تصويت، {1} لازمة)"
}
}

View File

@ -0,0 +1,8 @@
"Phrases"
{
"Played sound to target"
{
"ar" "شغل الصوت ل{1}"
}
}

View File

@ -0,0 +1,78 @@
"Phrases"
{
"Invalid authtype"
{
"ar" "يجب أن يتم الترخيص بإستعمال 'steam'، 'الإسم' أو 'ip'."
}
"Invalid immunity"
{
"ar" "يجب أن تكون الحصانة عدد صحيح."
}
"SQL Admin already exists"
{
"ar" "هناك آدمن مسبقا بنفس الترخيص المعطى."
}
"SQL Admin added"
{
"ar" "تمت إضافة الآدمن بنجاح."
}
"SQL Admin deleted"
{
"ar" "تم حذف الآدمن بنجاح."
}
"SQL Admin not found"
{
"ar" "لم يتم العثور على الآدمن بالمعطيات المعطى."
}
"SQL Group already exists"
{
"ar" "آدمن بنفس اللإسم موجود مسبقا."
}
"SQL Group added"
{
"ar" "تمت إضافة المجموعة بنجاح."
}
"SQL Group deleted"
{
"ar" "تم حذف المجموعة بنجاح."
}
"SQL Group not found"
{
"ar" "لم يتم العثور على المجموعة بالمعطياة المعطى."
}
"SQL Admin groups reset"
{
"ar" "تمت إعادت مجموعة الآدمن للحالة الأصلية."
}
"SQL Group X not found"
{
"ar" "لم يتم العثور على مجموعة: \"{1}\""
}
"SQL Group X failed to bind"
{
"ar" "تم فشل محاولت ربط: \"{1}\""
}
"Added group to user"
{
"ar" "تمت إضافة المجموعة المعطاة للآدمن بنجاح."
}
"Added groups to user"
{
"ar" "تمت إضافة {1} مجموعة معطاة للآدمن بنجاح."
}
}

View File

@ -89,11 +89,6 @@
"en" "Confirm Vote" "en" "Confirm Vote"
} }
"Please select a map"
{
"en" "Please select a map"
}
"Start the Vote" "Start the Vote"
{ {
"en" "Start the Vote" "en" "Start the Vote"

View File

@ -0,0 +1,33 @@
"Phrases"
{
"SM help commands"
{
"bg" "SM помощни команди"
}
"No description available"
{
"bg" "Няма налично описание"
}
"No commands available"
{
"bg" "Няма налични команди"
}
"Type sm_help to see more"
{
"bg" "Напишете sm_help {1}, за да видите още команди"
}
"Entries n - m in page k"
{
"bg" "Резултати {1} - {2} на страница {3} "
}
"No matching results found"
{
"bg" "Не са намерени резултати по дадените критерии"
}
}

View File

@ -0,0 +1,23 @@
"Phrases"
{
"Admin Menu"
{
"bg" "Администраторско меню"
}
"Player Commands"
{
"bg" "Клиентски команди"
}
"Server Commands"
{
"bg" "Сървърни команди"
}
"Voting Commands"
{
"bg" "Команди за гласуване"
}
}

View File

@ -0,0 +1,48 @@
"Phrases"
{
"Ban player"
{
"bg" "Блокиране на играча"
}
"Ban reason"
{
"bg" "Причина за блокиране"
}
"Permabanned player"
{
"bg" "Играчът {1} е блокиран за постоянно."
}
"Permabanned player reason"
{
"bg" "Играчът {1} е блокиран за постоянно. (причина: {2}."
}
"Banned player"
{
"bg" "Играчът {1} е блокиран за {2} минути."
}
"Banned player reason"
{
"bg" "Играчът {1} е блокиран за {2} минути (причина: {3})."
}
"Removed bans matching"
{
"bg" "Премахнатите забрани отговарят на филтъра: {1}"
}
"Ban added"
{
"bg" "Забраната беше добавена."
}
"Cannot ban that IP"
{
"bg" "Не можете да блокирате този IP адрес."
}
}

View File

@ -0,0 +1,18 @@
"Phrases"
{
"Choose Type"
{
"bg" "Избиране на тип"
}
"Silenced target"
{
"bg" "{1} е заглушен."
}
"Unsilenced target"
{
"bg" "{1} вече не е заглушен."
}
}

View File

@ -0,0 +1,108 @@
"Phrases"
{
"Timeleft"
{
"bg" "Време, оставащо от картата:"
}
"Thetime"
{
"bg" "Текущото сървърно време е {1}"
}
"Friendly Fire On"
{
"bg" "Приятелският огън е включен."
}
"Friendly Fire Off"
{
"bg" "Приятелският огън е изключен."
}
"Current Map"
{
"bg" "Текущата карта е {1}."
}
"LastRound"
{
"bg" "Това е последният рунд!"
}
"NoTimelimit"
{
"bg" "Няма ограничение на времето за картата"
}
"Next Map"
{
"bg" "Следваща карта: {1}"
}
"Pending Vote"
{
"bg" "Гласуване в очакване"
}
"WinLimitAppend"
{
"bg" " или да се смени картата, след като отбор спечели един рунд"
}
"WinLimit"
{
"bg" "Картата ще се смени, след като отбор спечели един рунд"
}
"MaxRoundsAppend"
{
"bg" "или картата ще се смени след още един рунд"
}
"MaxRounds"
{
"bg" "Картата ще се смени след още един рунд"
}
"FragLimitAppend"
{
"bg" "или да се смени картата, след като играч достигне едно убийство"
}
"FragLimit"
{
"bg" "Картата ще се смени, след като играч достигне едно убийство"
}
"WinLimitAppendPlural"
{
"bg" "или да се смени картата, след като отбор спечели {1} рунда"
}
"WinLimitPlural"
{
"bg" "Картата ще се смени, след като отбор спечели {1} рунда"
}
"MaxRoundsAppendPlural"
{
"bg" "или картата ще се смени след още {1} рунда"
}
"MaxRoundsPlural"
{
"bg" "Картата ще се смени след още {1} рунда"
}
"FragLimitAppendPlural"
{
"bg" "или да се смени картата, след като играч достигне {1} убийства"
}
"FragLimitPlural"
{
"bg" "Картата ще се смени, след като играч достигне {1} убийства"
}
}

View File

@ -0,0 +1,63 @@
"Phrases"
{
"Map Vote"
{
"bg" "Гласуване за карта: {1}"
}
"Change Map To"
{
"bg" "Да се смени ли картата на {1}?"
}
"Votekick Player"
{
"bg" "Да бъде ли изритан {1}?"
}
"Voteban Player"
{
"bg" "Да бъде ли блокиран {1}?"
}
"Vote Successful"
{
"bg" "Гласуването е успешно. {Получени са {1}%% от {2} гласа)"
}
"Vote Failed"
{
"bg" "Гласуването се провали. {1}%% гласа са нужни. (Получени са {2}%% от {3} гласа)"
}
"Vote End"
{
"bg" "Отговорът на {1} е: {2}."
}
"Kick vote"
{
"bg" "Гласуване за изритване"
}
"Ban vote"
{
"bg" "Забрана на гласуването"
}
"Map vote"
{
"bg" "Гласуване за карта"
}
"Confirm Vote"
{
"bg" "Потвърждаване на гласуването"
}
"Map Vote In Use"
{
"bg" "Друг администратор в момента ползва менюто за гласуване за карта."
}
}

View File

@ -0,0 +1,48 @@
"Phrases"
{
"Cookie List"
{
"bg" "Sourcemod списък с бисквити"
}
"Printing Cookie List"
{
"bg" "Извеждане на списъка с бисквитите в конзолата"
}
"Cookie not Found"
{
"bg" "Бисквитата \"{1} не може да бъде намерена"
}
"Cookie Value"
{
"bg" "Стойността на {1} е {2}"
}
"Protected Cookie"
{
"bg" "Стойността на защитената бисквита \"{1} не може да бъде променена"
}
"Cookie Changed Value"
{
"bg" "Стойността на бисквитата е сменена от \"{1}\" на \"{2}\""
}
"No Console"
{
"bg" " Менюто за настройките не може да бъде показано в конзолата "
}
"Choose Option"
{
"bg" "Изберете опция"
}
"Client Settings"
{
"bg" "Клиентски настройки"
}
}

View File

@ -0,0 +1,163 @@
"Phrases"
{
"Yes"
{
"bg" "Да"
}
"No"
{
"bg" "Не"
}
"Player no longer available"
{
"bg" "Играчът, когото избрахте, вече не е на разположение."
}
"Kick player"
{
"bg" "Изритване на играч"
}
"Kicked by admin"
{
"bg" "Изритан от администратор"
}
"Changing map"
{
"bg" "Картата се сменя на {1}..."
}
"Map was not found"
{
"bg" "Картата {1} не беше намерена."
}
"Unable to target"
{
"bg" "Не можете да изберете този играч."
}
"Name"
{
"bg" "Име"
}
"Access"
{
"bg" "Достъп"
}
"Cannot target bot"
{
"bg" "Тази команда не може да се използва върху бот."
}
"Config not found"
{
"bg" "Конфигурационният файл \"{1} не е намерен."
}
"Executed config"
{
"bg" "Конфигурационният файл \"{1}\" е изпълнен."
}
"Admin cache refreshed"
{
"bg" "Администраторският кеш е обновен"
}
"Cannot be performed on dead"
{
"bg" "Това действие не може да се приложи върху мъртвия играч {1}"
}
"Vote in Progress"
{
"bg" "Вече тече гласуване"
}
"Vote Not In Progress"
{
"bg" "В момента не тече гласуване."
}
"Cancelled Vote"
{
"bg" "Гласуването е прекъснато."
}
"Cancel vote"
{
"bg" "Прекъсване на гласуването"
}
"Vote Select"
{
"bg" "{1} избра {2}. "
}
"Vote Delay Minutes"
{
"bg" "Трябва да изчакате {1} минути преди да започнете ново гласуване."
}
"Vote Delay Seconds"
{
"bg" "Трябва да изчакате {1} секунди преди да започнете ново гласуване."
}
"Could not connect to database"
{
"bg" "Няма връзка с базата от данни."
}
"Reload admins"
{
"bg" "Презареждане на админите"
}
"Command is in-game only"
{
"bg" "Тази команда може да се ползва само по време на игра."
}
"Target must be dead"
{
"bg" "Тази команда може да се използва само върху мъртви играчи."
}
"Target must be alive"
{
"bg" "Тази команда може да се използва само върху живи играчи."
}
"Target is not in game"
{
"bg" "Избраният играч все още не е влязъл напълно в играта."
}
"Cannot participate in vote"
{
"bg" "Не можете да участвате в това гласуване."
}
"Cannot change vote"
{
"bg" "Не можете да промените избора си в това гласуване."
}
"On"
{
"bg" "Включено"
}
"Off"
{
"bg" "Изключено"
}
}

View File

@ -0,0 +1,83 @@
"Phrases"
{
"No Access"
{
"bg" "Нямате достъп до тази команда"
}
"Back"
{
"bg" "Назад"
}
"Next"
{
"bg" "Напред"
}
"Exit"
{
"bg" "Изход"
}
"Previous"
{
"bg" "Предишен"
}
"all players"
{
"bg" "всички играчи"
}
"all humans"
{
"bg" "всички хора"
}
"all bots"
{
"bg" "всички ботове"
}
"all dead players"
{
"bg" "всички мъртви играчи"
}
"all alive players"
{
"bg" "всички живи играчи"
}
"_s"
{
"bg" "{1}"
}
"all spectators"
{
"bg" "всички наблюдатели"
}
"Vote Count"
{
"bg" "Гласове {1}/{2}, {3} остават"
}
"Voted For"
{
"bg" "{1} гласува за {2}"
}
"Changed Vote"
{
"bg" "{1} промени гласа си на {2}"
}
"No Vote"
{
"bg" "Няма гласуване"
}
}

View File

@ -0,0 +1,78 @@
"Phrases"
{
"Burn player"
{
"bg" "Запалване на играч"
}
"Freeze player"
{
"bg" "Замразяване на играч"
}
"Blind player"
{
"bg" "Заслепяване на играч"
}
"Drug player"
{
"bg" "Дрогиране на играч"
}
"Gravity player"
{
"bg" "Промяна гравитацията на играч"
}
"Fully blind"
{
"bg" "Напълно сляп"
}
"Half blind"
{
"bg" "Наполовина сляп"
}
"No blind"
{
"bg" "Не е сляп"
}
"Gravity amount"
{
"bg" "Гравитация?"
}
"Gravity Very High"
{
"bg" "Много висока гравитация"
}
"Gravity High"
{
"bg" "Висока гравитация"
}
"Gravity Normal"
{
"bg" "Нормална гравитация"
}
"Gravity Low"
{
"bg" "Ниска гравитация"
}
"Gravity Very Low"
{
"bg" "Много ниска гравитация"
}
"Unfrozen"
{
"bg" "Вече не сте замразен"
}
}

View File

@ -0,0 +1,7 @@
"Phrases"
{
"Slayed player"
{
"bg" "Играчът {1} е убит"
}
}

View File

@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"bg" "Гласувайте за следваща карта!"
}
"Nextmap Voting Started"
{
"bg" "Започна гласуване за следваща карта."
}
"Nextmap Voting Finished"
{
"bg" "Гласуването за карта приключи. Следващата карта ще бъде {1}. (Получени са {2}%% от {3} гласа)"
}
"Current Map Extended"
{
"bg" "Текущата карта беше удължена. (Получени са {1}%% от {2} гласа)"
}
"Extend Map"
{
"bg" "Удължаване на текущата карта"
}
"Dont Change"
{
"bg" "Без промяна"
}
"Current Map Stays"
{
"bg" "Текущата карта продължава! Гласуването приключи! (Получени са {1}%% от {2} гласа)"
}
"Changed Next Map"
{
"bg" "Следващата карта е сменена на \"{1}\"."
}
}

View File

@ -0,0 +1,38 @@
"Phrases"
{
"Map History"
{
"bg" "История на картите"
}
"Map"
{
"bg" "[Карта]"
}
"Started"
{
"bg" "[Започнатa]"
}
"Played Time"
{
"bg" "[Изиграно време]"
}
"Reason"
{
"bg" "[Причина за приключване]"
}
"Current Map"
{
"bg" "Текуща карта"
}
"ago"
{
"bg" "преди"
}
}

View File

@ -0,0 +1,68 @@
"Phrases"
{
"Already Nominated"
{
"bg" "Вече номинирахте карта."
}
"Max Nominations"
{
"bg" "Максимално позволеният брой номинации беше достигнат."
}
"Map Already In Vote"
{
"bg" "Картата {1} вече е в списъка на номинираните."
}
"Map Inserted"
{
"bg" "Картата {1} е добавена в списъка на номинираните."
}
"Map Already Nominated"
{
"bg" "Картата, която избрахте, вече е номинирана."
}
"Map Nominated"
{
"bg" "{1} номинира {2}"
}
"Map Nomination Changed"
{
"bg" "{1} промени номинацията си на {2}."
}
"Nominate Title"
{
"bg" "Номиниране на карта:"
}
"Can't Nominate Current Map"
{
"bg" "Картата, която избрахте, е текущата карта и тя не може да бъде номинирана"
}
"Map in Exclude List"
{
"bg" "Картата, която избрахте, е играна наскоро и не може да бъде номинирана"
}
"Current Map"
{
"bg" "Текуща карта"
}
"Recently Played"
{
"bg" "Наскоро играна"
}
"Nominated"
{
"bg" "Номинирана"
}
}

View File

@ -0,0 +1,43 @@
"Phrases"
{
"Slap player"
{
"bg" "Шамаросване на играч"
}
"Slap damage"
{
"bg" "Щети на шамара"
}
"Slay player"
{
"bg" "Убиване на играч"
}
"Slapped target"
{
"bg" "{1} е шамаросан."
}
"Slayed target"
{
"bg" "{1} е убит."
}
"Name changed"
{
"bg" "Администратор Ви смени името."
}
"Renamed target"
{
"bg" "{1} е преименуван."
}
"Rename player"
{
"bg" "Преименуване на играч"
}
}

View File

@ -0,0 +1,23 @@
"Phrases"
{
"Exec CFG"
{
"bg" "Изпълняване на CFG файл"
}
"Player is an admin"
{
"bg" "\"{1}\" е администратор."
}
"Username"
{
"bg" "Потребителско име"
}
"Admin access"
{
"bg" "Администраторски достъп"
}
}

View File

@ -0,0 +1,8 @@
"Phrases"
{
"Slot reserved"
{
"bg" "Изхвърлен сте поради наличието на резервиран слот"
}
}

View File

@ -0,0 +1,33 @@
"Phrases"
{
"SM help commands"
{
"chi" "SourceMod 帮助: 指令信息"
}
"No description available"
{
"chi" "无详细描述"
}
"No commands available"
{
"chi" "无适用指令"
}
"Type sm_help to see more"
{
"chi" "键入 sm_help {1} 查看更多指令"
}
"Entries n - m in page k"
{
"chi" "条目 {1} - {2} 于第 {3} 页"
}
"No matching results found"
{
"chi" "无匹配结果可寻"
}
}

View File

@ -0,0 +1,23 @@
"Phrases"
{
"Admin Menu"
{
"chi" "管理员菜单"
}
"Player Commands"
{
"chi" "玩家指令"
}
"Server Commands"
{
"chi" "服务器指令"
}
"Voting Commands"
{
"chi" "投票指令"
}
}

View File

@ -0,0 +1,8 @@
"Phrases"
{
"Flooding the server"
{
"chi" "请勿刷屏!"
}
}

View File

@ -0,0 +1,63 @@
"Phrases"
{
"Ban player"
{
"chi" "封禁玩家"
}
"Ban reason"
{
"chi" "封禁原因"
}
"Permabanned player"
{
"chi" "玩家 \"{1}\" 已被永久封禁."
}
"Permabanned player reason"
{
"chi" "玩家 \"{1}\" 已被永久封禁 (原因: {2})."
}
"Banned player"
{
"chi" "封禁玩家 \"{1}\" {2} 分钟."
}
"Banned player reason"
{
"chi" "封禁玩家 \"{1}\" {2} 分钟 (原因: {3})."
}
"Removed bans matching"
{
"chi" "移除符合条件: {1} 的封禁"
}
"Ban added"
{
"chi" "封禁已添加."
}
"Cannot ban that IP"
{
"chi" "您无法封禁该 IP 地址."
}
"Custom ban reason explanation"
{
"chi" "以聊天信息方式输入理由. 按 {1} 则中止."
}
"AbortBan applied successfully"
{
"chi" "中止封禁."
}
"AbortBan not waiting for custom reason"
{
"chi" "不等待键入封禁理由, 无封禁可中止."
}
}

View File

@ -0,0 +1,73 @@
"Phrases"
{
"Gag/Mute player"
{
"chi" "将玩家禁言/禁声"
}
"Choose Type"
{
"chi" "选择类别"
}
"Gagged target"
{
"chi" "{1} 已被禁言."
}
"Ungagged target"
{
"chi" "{1} 已被解除禁言."
}
"Muted target"
{
"chi" "{1} 已被禁声."
}
"Unmuted target"
{
"chi" "{1} 已被解除禁声."
}
"Silenced target"
{
"chi" "{1} 已被静音."
}
"Unsilenced target"
{
"chi" "{1} 已被解除静音."
}
"Mute Player"
{
"chi" "将玩家禁声"
}
"UnMute Player"
{
"chi" "解除玩家禁声"
}
"Gag Player"
{
"chi" "将玩家禁言"
}
"UnGag Player"
{
"chi" "解除玩家禁言"
}
"Silence Player"
{
"chi" "将玩家禁音"
}
"UnSilence Player"
{
"chi" "解除玩家禁音"
}
}

View File

@ -0,0 +1,108 @@
"Phrases"
{
"Timeleft"
{
"chi" "当前地图剩余时间: "
}
"Thetime"
{
"chi" "当前服务器时间为 {1}"
}
"Friendly Fire On"
{
"chi" "友军伤害已开启"
}
"Friendly Fire Off"
{
"chi" "友军伤害已关闭"
}
"Current Map"
{
"chi" "当前地图为 {1}."
}
"LastRound"
{
"chi" "最后一局了!!"
}
"NoTimelimit"
{
"chi" "当前地图无时间限制"
}
"Next Map"
{
"chi" "下一幅地图: {1}"
}
"Pending Vote"
{
"chi" "投票正在进行中"
}
"WinLimitAppend"
{
"chi" ", 或当某方赢得一局后更换地图"
}
"WinLimit"
{
"chi" "地图将于某方赢得一局后更换"
}
"MaxRoundsAppend"
{
"chi" ", 或再过一局后更换地图"
}
"MaxRounds"
{
"chi" "地图将再过一局后更换"
}
"FragLimitAppend"
{
"chi" ", 或当某玩家杀满一人后更换地图"
}
"FragLimit"
{
"chi" "地图将于某玩家杀满一人后更换"
}
"WinLimitAppendPlural"
{
"chi" ", 或当某方赢得 {1} 局后更换地图"
}
"WinLimitPlural"
{
"chi" "地图将于某方赢得 {1} 局后更换"
}
"MaxRoundsAppendPlural"
{
"chi" ", 或再过 {1} 局后更换地图"
}
"MaxRoundsPlural"
{
"chi" "地图将再过 {1} 局后更换"
}
"FragLimitAppendPlural"
{
"chi" ", 或当某玩家杀满 {1} 人后更换地图"
}
"FragLimitPlural"
{
"chi" "地图将于某玩家杀满 {1} 人后更换"
}
}

View File

@ -0,0 +1,88 @@
"Phrases"
{
"Initiate Vote"
{
"chi" "已启动投票: {1}"
}
"Initiated Vote Map"
{
"chi" "已启动地图投票."
}
"Initiated Vote Kick"
{
"chi" "已启动踢出 {1} 的投票."
}
"Initiated Vote Ban"
{
"chi" "已启动封禁 {1} 的投票."
}
"Map Vote"
{
"chi" "地图投票: {1}"
}
"Change Map To"
{
"chi" "更换地图为 {1}?"
}
"Votekick Player"
{
"chi" "踢出 {1}?"
}
"Voteban Player"
{
"chi" "封禁 {1}?"
}
"Vote Successful"
{
"chi" "投票通过. (同意 {1}%% 总共 {2} 票)"
}
"Vote Failed"
{
"chi" "投票失败. 至少需要 {1}%% 支持. (同意 {2}%% 总共 {3} 票)"
}
"Vote End"
{
"chi" "投票 {1} 的结果为: {2}."
}
"Kick vote"
{
"chi" "踢出投票"
}
"Ban vote"
{
"chi" "封禁投票"
}
"Map vote"
{
"chi" "地图投票"
}
"Confirm Vote"
{
"chi" "确认投票"
}
"Map Vote In Use"
{
"chi" "地图投票正被调用"
}
"Start the Vote"
{
"chi" "开始投票"
}
}

View File

@ -0,0 +1,48 @@
"Phrases"
{
"Cookie List"
{
"chi" "Sourcemod Cookie 列表"
}
"Printing Cookie List"
{
"chi" "打印 cookie 列表至控制台"
}
"Cookie not Found"
{
"chi" "无法找到 cookie \"{1}\""
}
"Cookie Value"
{
"chi" "{1} 的值为 {2}"
}
"Protected Cookie"
{
"chi" "无法更改受保护 cookie \"{1}\" 的值"
}
"Cookie Changed Value"
{
"chi" "更改 cookie \"{1}\" 的值为 \"{2}\""
}
"No Console"
{
"chi" "无法显示设置菜单至控制台"
}
"Choose Option"
{
"chi" "择取选项"
}
"Client Settings"
{
"chi" "客户端设定"
}
}

View File

@ -0,0 +1,233 @@
"Phrases"
{
"Yes"
{
"chi" "是"
}
"No"
{
"chi" "否"
}
"No matching client"
{
"chi" "未发现匹配的客户端."
}
"No matching clients"
{
"chi" "未发现匹配的客户端."
}
"More than one client matches"
{
"chi" "存在多个符合样式 \"{1}\" 的客户端"
}
"More than one client matched"
{
"chi" "存在多个符合所提样式的客户端."
}
"Player no longer available"
{
"chi" "您选定的玩家已不再适用."
}
"Kick player"
{
"chi" "踢出玩家"
}
"Kicked by admin"
{
"chi" "被管理员踢出"
}
"Changing map"
{
"chi" "更换地图为 {1}..."
}
"Map was not found"
{
"chi" "地图 {1} 未找到."
}
"Unable to target"
{
"chi" "您无法操作该玩家."
}
"Name"
{
"chi" "名称"
}
"Access"
{
"chi" "权限"
}
"See console for output"
{
"chi" "请看控制台输出."
}
"Cannot target bot"
{
"chi" "无法对机器人发出该指令."
}
"Unable to find cvar"
{
"chi" "无法找到 cvar: {1}"
}
"No access to cvar"
{
"chi" "您无权设置该 cvar."
}
"Value of cvar"
{
"chi" "cvar \"{1}\" 值: \"{2}\""
}
"Cvar changed"
{
"chi" "更改 cvar \"{1}\" 为 \"{2}\"."
}
"Config not found"
{
"chi" "配置文件 \"{1}\" 未找到."
}
"Executed config"
{
"chi" "执行配置 \"{1}\"."
}
"Admin cache refreshed"
{
"chi" "管理员缓存已被刷新."
}
"Invalid Amount"
{
"chi" "指定数量无效"
}
"Cannot be performed on dead"
{
"chi" "该操作无法在暂时“死亡”的客户端 \"{1}\" 上生效"
}
"Player has since died"
{
"chi" "操作无法执行, 玩家已死亡."
}
"Vote in Progress"
{
"chi" "已有投票在进行中."
}
"Vote Not In Progress"
{
"chi" "当前无投票进行."
}
"Cancelled Vote"
{
"chi" "投票已取消."
}
"Cancel vote"
{
"chi" "取消投票"
}
"Vote Select"
{
"chi" "{1} 选了 {2}."
}
"No Votes Cast"
{
"chi" "无投票发起."
}
"Vote Delay Minutes"
{
"chi" "您必须再等 {1} 分钟后才能发起新一轮投票."
}
"Vote Delay Seconds"
{
"chi" "您必须再等 {1} 秒钟后才能发起新一轮投票."
}
"Could not connect to database"
{
"chi" "无法连接至该数据库."
}
"Failed to query database"
{
"chi" "查询数据库失败."
}
"Invalid SteamID specified"
{
"chi" "您指定了一个无效 Steam ID (有效格式须以 'STEAM_:' 开头)."
}
"Reload admins"
{
"chi" "重载管理员"
}
"Command is in-game only"
{
"chi" "该指令只能在游戏界面中使用."
}
"Target must be dead"
{
"chi" "该指令只能用于已死玩家."
}
"Target must be alive"
{
"chi" "该指令只能用于活人玩家."
}
"Target is not in game"
{
"chi" "指定玩家尚未完全进入游戏."
}
"Cannot participate in vote"
{
"chi" "您无法参与该项投票."
}
"Cannot change vote"
{
"chi" "您无法改变对该项投票作出的选择."
}
"On"
{
"chi" "开"
}
"Off"
{
"chi" "关"
}
}

View File

@ -0,0 +1,88 @@
"Phrases"
{
"No Access"
{
"chi" "您无权使用该指令"
}
"Back"
{
"chi" "返回"
}
"Next"
{
"chi" "下一页"
}
"Exit"
{
"chi" "退出"
}
"Previous"
{
"chi" "上一页"
}
"all players"
{
"chi" "全体玩家"
}
"all humans"
{
"chi" "全体真人"
}
"all bots"
{
"chi" "全体机器人"
}
"all dead players"
{
"chi" "全体已死玩家"
}
"all alive players"
{
"chi" "全体活人玩家"
}
"_s"
{
"chi" "{1}"
}
"all spectators"
{
"chi" "所有旁观者"
}
"Vote Count"
{
"chi" "投票计数:{1}/{2},剩余{3}人"
}
"Voted For"
{
"chi" "{1}投票选择了{2}"
}
"Changed Vote"
{
"chi" "{1} 已更改其投票为 {2} "
}
"No Vote"
{
"chi" "无投票"
}
"Name Reserved"
{
"chi" "你所用名称已由 SourceMod 保留; 请输入相应密码启用."
}
}

View File

@ -0,0 +1,168 @@
"Phrases"
{
"Burn player"
{
"chi" "烧烤玩家"
}
"FireBomb player"
{
"chi" "把玩家变成燃烧弹"
}
"Freeze player"
{
"chi" "冰冻玩家"
}
"FreezeBomb player"
{
"chi" "把玩家变成冰冻弹"
}
"TimeBomb player"
{
"chi" "把玩家变成定时炸弹"
}
"Beacon player"
{
"chi" "点玩家灯"
}
"NoClip player"
{
"chi" "设置穿墙模式"
}
"Blind player"
{
"chi" "把玩家变成瞎子"
}
"Drug player"
{
"chi" "给玩家下毒药"
}
"Gravity player"
{
"chi" "改变玩家重力指标"
}
"Blind amount"
{
"chi" "致盲到何程度?"
}
"Fully blind"
{
"chi" "全盲"
}
"Half blind"
{
"chi" "半盲"
}
"No blind"
{
"chi" "不盲"
}
"Gravity amount"
{
"chi" "改重力指标为多少?"
}
"Gravity Very High"
{
"chi" "超高重力"
}
"Gravity High"
{
"chi" "高重力"
}
"Gravity Normal"
{
"chi" "常规重力"
}
"Gravity Low"
{
"chi" "低重力"
}
"Gravity Very Low"
{
"chi" "超低重力"
}
"Set target on fire"
{
"chi" "将 {1} 点燃."
}
"Toggled FireBomb on target"
{
"chi" "触发 {1} 身上的燃烧弹."
}
"Froze target"
{
"chi" "冰冻了 {1}."
}
"Toggled FreezeBomb on target"
{
"chi" "触发 {1} 身上的冰冻弹."
}
"Toggled beacon on target"
{
"chi" "触发 {1} 身上的灯."
}
"Toggled TimeBomb on target"
{
"chi" "触发 {1} 身上的定时炸弹."
}
"Toggled noclip on target"
{
"chi" "触发{1}的穿墙模式"
}
"Toggled drug on target"
{
"chi" "激活 {1} 身上的毒药."
}
"Set blind on target"
{
"chi" "使 {1} 致盲."
}
"Set gravity on target"
{
"chi" "更改 {1} 的重力指标."
}
"Till Explodes"
{
"chi" "还有 {2} 秒钟 {1} 就要爆炸."
}
"Unfrozen"
{
"chi" "您已被冻结."
}
"You will be unfrozen"
{
"chi" "您将被解冻."
}
}

View File

@ -0,0 +1,98 @@
"Phrases"
{
"Initiated Vote Gravity"
{
"chi" "发起重力投票."
}
"Initiated Vote Burn"
{
"chi" "发起烧烤 {1} 的投票."
}
"Initiated Vote Slay"
{
"chi" "发起处死 {1} 的投票."
}
"Initiated Vote Alltalk"
{
"chi" "发起开启全局语音通讯的投票."
}
"Initiated Vote FF"
{
"chi" "发起友军伤害投票"
}
"Gravity Vote"
{
"chi" "重力投票: {1}"
}
"Change Gravity To"
{
"chi" "更改重力为 {1}?"
}
"Voteburn player"
{
"chi" "烧烤玩家 {1}?"
}
"Voteslay Player"
{
"chi" "处死 {1}?"
}
"Votealltalk Off"
{
"chi" "关闭全局语音通讯? {1}"
}
"Votealltalk On"
{
"chi" "开启全局语音通讯? {1}"
}
"Voteff Off"
{
"chi" "关闭友军伤害? {1}"
}
"Voteff On"
{
"chi" "开启友军伤害? {1}"
}
"Gravity vote"
{
"chi" "重力投票"
}
"Vote FF"
{
"chi" "队友伤害投票"
}
"Burn vote"
{
"chi" "烧烤投票"
}
"Alltalk vote"
{
"chi" "全局语音投票"
}
"Slay vote"
{
"chi" "处死投票"
}
"Slayed player"
{
"chi" "处死了玩家 '{1}'"
}
}

View File

@ -0,0 +1,48 @@
"Phrases"
{
"Vote Nextmap"
{
"chi" "下一幅地图投票了!"
}
"Nextmap Voting Started"
{
"chi" "下一幅地图投选已开始."
}
"Nextmap Voting Finished"
{
"chi" " 地图投票已结束. 下一幅地图将为 {1}. ( 得票{2}%% , {3}票)"
}
"Current Map Extended"
{
"chi" "当前地图已被延长."
}
"Extend Map"
{
"chi" "延长当前地图"
}
"Dont Change"
{
"chi" "请勿更换"
}
"Current Map Stays"
{
"chi" "当前地图已被延长! 投票显示! (得票 {1}%% 共 {2} 票)"
}
"Changed Next Map"
{
"chi" "更换下一幅地图为 \"{1}\"."
}
"Starting Runoff"
{
"chi" "无地图获得 {1}%% 以上票数 ({2} [{3}%%] & {4} [{5}%%]), 开始决胜轮投票"
}
}

View File

@ -0,0 +1,38 @@
"Phrases"
{
"Map History"
{
"chi" "地图历史纪录"
}
"Map"
{
"chi" "[地图]"
}
"Started"
{
"chi" "[已启动]"
}
"Played Time"
{
"chi" "[已运行时间]"
}
"Reason"
{
"chi" "[终止理由]"
}
"Current Map"
{
"chi" "当前地图"
}
"ago"
{
"chi" "之前"
}
}

View File

@ -0,0 +1,68 @@
"Phrases"
{
"Already Nominated"
{
"chi" "您已预订了一幅地图."
}
"Max Nominations"
{
"chi" "已达最大预订数."
}
"Map Already In Vote"
{
"chi" "地图 '{1}' 已在预订列表中."
}
"Map Inserted"
{
"chi" "地图 '{1}' 加入了预订列表."
}
"Map Already Nominated"
{
"chi" "您所选的地图已被预订."
}
"Map Nominated"
{
"chi" "{1} 预订了 {2}."
}
"Map Nomination Changed"
{
"chi" "{1} 将其所订改为了 {2}."
}
"Nominate Title"
{
"chi" "预订地图:"
}
"Can't Nominate Current Map"
{
"chi" "您所选的图正是当前地图, 无法预订"
}
"Map in Exclude List"
{
"chi" "您所选的图是最近已玩过的地图, 无法预订"
}
"Current Map"
{
"chi" "当前地图"
}
"Recently Played"
{
"chi" "最近玩过的地图"
}
"Nominated"
{
"chi" "已预订的地图"
}
}

View File

@ -0,0 +1,43 @@
"Phrases"
{
"Slap player"
{
"chi" "拍打玩家"
}
"Slap damage"
{
"chi" "拍打伤害值"
}
"Slay player"
{
"chi" "处死玩家"
}
"Slapped target"
{
"chi" "拍打了 {1}."
}
"Slayed target"
{
"chi" "处死了 {1}."
}
"Name changed"
{
"chi" "某管理员更改了您的名称"
}
"Renamed target"
{
"chi" "更改了 {1} 的名称."
}
"Rename player"
{
"chi" "玩家更名"
}
}

View File

@ -0,0 +1,133 @@
"Phrases"
{
"Unable to find cvar"
{
"chi" "无法找到 cvar: {1}"
}
"No access to cvar"
{
"chi" "你无权操作这个键值"
}
"Value of cvar"
{
"chi" "cvar \"{1}\" 的值: \"{2}\""
}
"Cvar changed"
{
"chi" "更改键值 \"{1}\" 为 \"{2}\". "
}
"Config not found"
{
"chi" "配置文件 \"{1}\" 未找到."
}
"Executed config"
{
"chi" "执行配置文件 \"{1}\"."
}
"Permabanned player"
{
"chi" "已永久封禁玩家 \"{1}\"."
}
"Permabanned player reason"
{
"chi" "已永久封禁玩家 \"{1}\" (原因: {2})."
}
"Banned player"
{
"chi" "封禁玩家 \"{1}\" {2} 分钟."
}
"Banned player reason"
{
"chi" "封禁玩家 \"{1}\" {2} 分钟 (原因: {3})."
}
"Removed bans matching"
{
"chi" "移除了符合过滤条件: {1} 的封禁"
}
"Ban added"
{
"chi" "封禁记录已添加."
}
"Admin cache refreshed"
{
"chi" "管理员缓存已刷新."
}
"Identify player"
{
"chi" "玩家认证"
}
"Choose Map"
{
"chi" "选择地图"
}
"Exec CFG"
{
"chi" "执行 CFG"
}
"Admin logged in as"
{
"chi" "\"{1}\" 以 \"{2}\" 身份登录并带权限: {3}"
}
"Admin logged in anon"
{
"chi" "\"{1}\" 具备权限: {2}"
}
"Player is not an admin"
{
"chi" "\"{1}\" 非管理员."
}
"Player is an admin"
{
"chi" "\"{1}\" 为管理员."
}
"Username"
{
"chi" "用户名"
}
"Kicked target"
{
"chi" "已踢出 {1}"
}
"Admin access"
{
"chi" "管理员权限"
}
"Cvar is now protected"
{
"chi" "键值{1}已经受保护"
}
"Kicked target reason"
{
"chi" "踢出 {1} (理由: {2})"
}
"Please select a map"
{
"chi" "请选择地图"
}
}

View File

@ -0,0 +1,8 @@
"Phrases"
{
"Slot reserved"
{
"chi" "无权使用保留通道而被踢出"
}
}

View File

@ -0,0 +1,68 @@
"Phrases"
{
"Rock The Vote"
{
"chi" "滚动投票:"
}
"RTV Not Allowed"
{
"chi" "当前无法启动RTV (滚动投票)."
}
"RTV Started"
{
"chi" "RTV (滚动投票)已开始."
}
"RTV Ended"
{
"chi" "RTV (滚动投票)已结束, 您无法重来或再预订地图."
}
"Already Voted"
{
"chi" "您已经发起了投票(现有{1}票,仍需{2}票)"
}
"Minimal Players Not Met"
{
"chi" "未达所需人数下限."
}
"RTV Requested"
{
"chi" "{1} 要滚动投票. ({2} 票同意, 至少需要 {3} 票)"
}
"RTV Vote Ready"
{
"chi" "开始滚动投票!"
}
"Don't Change"
{
"chi" "继续运行当前地图"
}
"Selected Map"
{
"chi" "{1} 选了 {2}"
}
"No Votes"
{
"chi" "RTV (滚动投票)无选票投递, 当前地图继续运行."
}
"Current Map Stays"
{
"chi" "当前地图继续运行! 滚动投票已显示!"
}
"Changing Maps"
{
"chi" "更换地图为 {1}! 滚动投票已显示!"
}
}

View File

@ -0,0 +1,8 @@
"Phrases"
{
"Played sound to target"
{
"chi" "播放音乐给 {1}"
}
}

View File

@ -0,0 +1,78 @@
"Phrases"
{
"Invalid authtype"
{
"chi" "认证方式必须为 'steam', 'name', 或 'ip'."
}
"Invalid immunity"
{
"chi" "免疫级别必须为正整数."
}
"SQL Admin already exists"
{
"chi" "授予该凭证标志的管理员已存在."
}
"SQL Admin added"
{
"chi" "管理员被成功添加进数据库."
}
"SQL Admin deleted"
{
"chi" "管理员被已从数据库中成功删除."
}
"SQL Admin not found"
{
"chi" "授予该凭证标志的管理员未找到."
}
"SQL Group already exists"
{
"chi" "符合该名称的组已存在."
}
"SQL Group added"
{
"chi" "组被成功添加进数据库."
}
"SQL Group deleted"
{
"chi" "组已从数据库中成功删除."
}
"SQL Group not found"
{
"chi" "符合该名称的组未找到."
}
"SQL Admin groups reset"
{
"chi" "管理员组已被成功重置."
}
"SQL Group X not found"
{
"chi" "未找到组: \"{1}\""
}
"SQL Group X failed to bind"
{
"chi" "无法绑定组: \"{1}\""
}
"Added group to user"
{
"chi" "成功添加一个组至指定管理员类别."
}
"Added groups to user"
{
"chi" "成功添加 {1} 个组至指定管理员类别."
}
}

View File

@ -0,0 +1,33 @@
"Phrases"
{
"SM help commands"
{
"cze" "SourceMod Help: Informace o prikazech "
}
"No description available"
{
"cze" "Zadny dostupny popis "
}
"No commands available"
{
"cze" "Zadne dostupne prikazy"
}
"Type sm_help to see more"
{
"cze" "Napiste sm_help {1} pro vice prikazu "
}
"Entries n - m in page k"
{
"cze" "Polozky {1} - {2} na strance {3} "
}
"No matching results found"
{
"cze" "Nebyly nalezeny zadne vhodne vysledky "
}
}

View File

@ -0,0 +1,23 @@
"Phrases"
{
"Admin Menu"
{
"cze" "Admin Menu"
}
"Player Commands"
{
"cze" "Hracske prikazy"
}
"Server Commands"
{
"cze" "Serverove prikazy"
}
"Voting Commands"
{
"cze" "Hlasovani"
}
}

View File

@ -0,0 +1,8 @@
"Phrases"
{
"Flooding the server"
{
"cze" "Zahlcujete server!"
}
}

View File

@ -0,0 +1,63 @@
"Phrases"
{
"Ban player"
{
"cze" "Zabanovat hrace"
}
"Ban reason"
{
"cze" "Duvod banu"
}
"Permabanned player"
{
"cze" "Permanentne zabanoval hrace \"{1}\"."
}
"Permabanned player reason"
{
"cze" "Permanentne zabanoval hrace \"{1}\" (duvod: {2})"
}
"Banned player"
{
"cze" "Zabanoval hrace \"{1}\" na {2} minut."
}
"Banned player reason"
{
"cze" "Zabanoval hrace \"{1}\" na {2} minut (duvod: {3})."
}
"Removed bans matching"
{
"cze" "Byly odstraneny bany splnujici filter: {1}"
}
"Ban added"
{
"cze" "Ban byl pridan."
}
"Cannot ban that IP"
{
"cze" "Nemuzete zabanovat tuto IP adresu."
}
"Custom ban reason explanation"
{
"cze" "Zadejte duvod zpravou do chatu. Pouzijte {1} pro zruseni."
}
"AbortBan applied successfully"
{
"cze" "Ban zrusen."
}
"AbortBan not waiting for custom reason"
{
"cze" "Neceka se na zadani duvodu banu, zadny ban na zruseni."
}
}

View File

@ -0,0 +1,73 @@
"Phrases"
{
"Gag/Mute player"
{
"cze" "Umlcet hrace"
}
"Choose Type"
{
"cze" "Vyberte typ"
}
"Gagged target"
{
"cze" "Hrac {1} byl odstrihnut od chatu."
}
"Ungagged target"
{
"cze" "Hrac {1} muze znovu psat."
}
"Muted target"
{
"cze" "Hrac {1} byl utisen."
}
"Unmuted target"
{
"cze" "Hrac {1} muze znovu mluvit."
}
"Silenced target"
{
"cze" "Hrac {1} byl uplne umlcen."
}
"Unsilenced target"
{
"cze" "Hrac {1} se muze znovu projevovat."
}
"Mute Player"
{
"cze" "Utisit hrace"
}
"UnMute Player"
{
"cze" "Povolit hraci mluvit"
}
"Gag Player"
{
"cze" "Odstrihnout hrace od chatu"
}
"UnGag Player"
{
"cze" "Povolit hraci psat"
}
"Silence Player"
{
"cze" "Umlcet hrace"
}
"UnSilence Player"
{
"cze" "Povolit hraci mluvit a psat"
}
}

View File

@ -0,0 +1,108 @@
"Phrases"
{
"Timeleft"
{
"cze" "Zbyvajici cas:"
}
"Thetime"
{
"cze" "Soucasny cas je {1}"
}
"Friendly Fire On"
{
"cze" "Friendly Fire je zapnut."
}
"Friendly Fire Off"
{
"cze" "Friendly Fire je vypnut."
}
"Current Map"
{
"cze" "Aktualni mapa je {1}."
}
"LastRound"
{
"cze" "Toto je posledni kolo!!"
}
"NoTimelimit"
{
"cze" "Tato mapa neni casove omezena"
}
"Next Map"
{
"cze" "Pristi mapa: {1}"
}
"Pending Vote"
{
"cze" "Neprobehlo hlasovani"
}
"WinLimitAppend"
{
"cze" ", nebo se mapa zmeni pote, co nejaky tym vyhraje jedno kolo "
}
"WinLimit"
{
"cze" "Mapa se zmeni pote, co nejaky tym vyhraje jedno kolo"
}
"MaxRoundsAppend"
{
"cze" ", nebo se mapa zmeni po pristim kole"
}
"MaxRounds"
{
"cze" "Mapa se zmeni po pristim kole"
}
"FragLimitAppend"
{
"cze" ", nebo se mapa zmeni pote, co hrac dosahne jednoho zabiti"
}
"FragLimit"
{
"cze" "Mapa se zmeni pote, co hrac dosahne jednoho zabiti"
}
"WinLimitAppendPlural"
{
"cze" ", nebo se mapa zmeni pote, co nejaky tym vyhraje {1} kol"
}
"WinLimitPlural"
{
"cze" "Mapa se zmeni pote, co nejaky tym vyhraje {1} kol"
}
"MaxRoundsAppendPlural"
{
"cze" ", nebo se mapa zmeni po {1} kolech"
}
"MaxRoundsPlural"
{
"cze" "Mapa se zmeni po {1} kolech"
}
"FragLimitAppendPlural"
{
"cze" " , nebo se mapa zmeni pote, co hrac dosahne {1} zabiti "
}
"FragLimitPlural"
{
"cze" "Mapa se zmeni pote, co hrac dosahne {1} zabiti"
}
}

View File

@ -0,0 +1,88 @@
"Phrases"
{
"Initiate Vote"
{
"cze" " Zahajil hlasovani: {1}"
}
"Initiated Vote Map"
{
"cze" "Zahajil hlasovani o mape."
}
"Initiated Vote Kick"
{
"cze" "Zahajil hlasovani o vyhozeni proti hraci {1}."
}
"Initiated Vote Ban"
{
"cze" "Zahajil hlasovani o banu proti hraci {1}"
}
"Map Vote"
{
"cze" "Hlasovani o mape: {1}"
}
"Change Map To"
{
"cze" "Zmenit mapu na {1}?"
}
"Votekick Player"
{
"cze" "Vyhodit {1}?"
}
"Voteban Player"
{
"cze" "Zabanovat {1}?"
}
"Vote Successful"
{
"cze" "Hlasovani prijato. (Obdrzeno {1}%% z {2} hlasu)"
}
"Vote Failed"
{
"cze" "Hlasovani selhalo. Bylo potreba {1}%% hlasu. (Obdrzeno {2}%% z {3} hlasu)"
}
"Vote End"
{
"cze" "Odpoved na otazku {1} je: {2}."
}
"Kick vote"
{
"cze" "Hlasovani o vyhozeni"
}
"Ban vote"
{
"cze" "Hlasovani o banu"
}
"Map vote"
{
"cze" "Hlasovani o mape"
}
"Confirm Vote"
{
"cze" "Potvrdit hlasovani"
}
"Map Vote In Use"
{
"cze" "Jiny admin prave pouziva hlasovaci menu."
}
"Start the Vote"
{
"cze" "Zacit hlasovani"
}
}

View File

@ -0,0 +1,48 @@
"Phrases"
{
"Cookie List"
{
"cze" "Seznam Sourcemod Cookies"
}
"Printing Cookie List"
{
"cze" "Vypisuji seznam cookie do konzole"
}
"Cookie not Found"
{
"cze" "Nelze nalezt cookie \"{1}\""
}
"Cookie Value"
{
"cze" "Hodnota hrace {1} je {2}"
}
"Protected Cookie"
{
"cze" "Nelze zmenit hodnotu chranene cookie \"{1}\""
}
"Cookie Changed Value"
{
"cze" "Zmena hodnoty cookie \"{1}\" na \"{2}\""
}
"No Console"
{
"cze" "Nelze zobrazit menu nastaveni do konzole"
}
"Choose Option"
{
"cze" "Zvolte moznost"
}
"Client Settings"
{
"cze" "Nastaveni hrace"
}
}

View File

@ -0,0 +1,253 @@
"Phrases"
{
"Yes"
{
"cze" "Ano"
}
"No"
{
"cze" "Ne"
}
"No matching client"
{
"cze" "Nebyl nalezen zadny shodny hrac."
}
"No matching clients"
{
"cze" "Nebyli nalezeni zadni shodni hraci."
}
"More than one client matches"
{
"cze" "Vice nez jeden hrac splnuje podminku \"{1}\""
}
"More than one client matched"
{
"cze" "Vice nez jeden hrac splnuje danou podminku."
}
"Player no longer available"
{
"cze" "Hrac, ktereho jste zvolil, jiz neni dostupny."
}
"Kick player"
{
"cze" "Vyhodit hrace"
}
"Kicked by admin"
{
"cze" "Vyhozen administratorem"
}
"Changing map"
{
"cze" "Zmena mapy na {1}..."
}
"Map was not found"
{
"cze" "Mapa {1} nebyla nalezena."
}
"Unable to target"
{
"cze" "Nemuzete zvolit tohoto hrace."
}
"Name"
{
"cze" "Jmeno"
}
"Access"
{
"cze" "Pristup"
}
"See console for output"
{
"cze" "Pro vystup se podivejte do konzole."
}
"Cannot target bot"
{
"cze" "Tento prikaz nelze vykonat na botovi."
}
"Unable to find cvar"
{
"cze" "Nelze nalezt cvar: {1}"
}
"No access to cvar"
{
"cze" "Nemate pristup k tomuto cvaru."
}
"Value of cvar"
{
"cze" "Hodnota cvaru \"{1}\" je: \"{2}\""
}
"Cvar changed"
{
"cze" "Zmenen cvar \"{1}\" na \"{2}\"."
}
"Config not found"
{
"cze" "Konfiguracni soubor \"{1}\" nebyl nalezen."
}
"Executed config"
{
"cze" "Spustil konfiguracni soubor \"{1}\"."
}
"Admin cache refreshed"
{
"cze" "Cache adminu byla obnovena."
}
"Invalid Amount"
{
"cze" "Byla zadana neplatna hodnota"
}
"Cannot be performed on dead"
{
"cze" "Tato akce nemuze byt vykonana na mrtvem hraci \"{1}\""
}
"Player has since died"
{
"cze" "Akce nemuze byt vykonana, hrac mezitim zemrel."
}
"Vote in Progress"
{
"cze" "Hlasovani jiz probiha."
}
"Vote Not In Progress"
{
"cze" "V tuto chvili neprobiha zadne hlasovani."
}
"Cancelled Vote"
{
"cze" "Zrusil hlasovani."
}
"Cancel vote"
{
"cze" "Zrusit hlasovani"
}
"Vote Select"
{
"cze" "{1} zvolil {2}."
}
"No Votes Cast"
{
"cze" "Nebyly prijaty zadne hlasy."
}
"Vote Delay Minutes"
{
"cze" "Musite pockat {1} minut pred zapocetim dalsiho hlasovani."
}
"Vote Delay Seconds"
{
"cze" "Musite pockat {1} vterin pred zapocetim dalsiho hlasovani."
}
"Could not connect to database"
{
"cze" "Nelze se pripojit k databazi."
}
"Failed to query database"
{
"cze" "Nelze se spojit s databazi."
}
"Invalid SteamID specified"
{
"cze" "Byl zadan neplatny Steam ID (musi zacinat 'STEAM_')"
}
"Reload admins"
{
"cze" "Obnovit adminy"
}
"Command is in-game only"
{
"cze" "Tento prikaz lze pouzit pouze ze hry."
}
"Target must be dead"
{
"cze" "Tento prikaz muze byt pouzit pouze na mrtve hrace."
}
"Target must be alive"
{
"cze" "Tento prikaz muze byt pouzit pouze na zive hrace."
}
"Target is not in game"
{
"cze" "Zvoleny hrac jeste neni plne pripojen do hry."
}
"Cannot participate in vote"
{
"cze" "Nemuzete se zucastnit tohoto hlasovani."
}
"Cannot change vote"
{
"cze" "Nemuzete zmenit svoji volbu v tomto hlasovani."
}
"On"
{
"cze" "Zapnout"
}
"Off"
{
"cze" "Vypnout"
}
"Say all"
{
"cze" "(VSEM) {1}"
}
"Chat admins"
{
"cze" "(ADMINOVE) {1}"
}
"Chat to admins"
{
"cze" "(ADMINUM) {1}"
}
"Private say to"
{
"cze" "(Privatne {1}) {2}"
}
}

View File

@ -0,0 +1,88 @@
"Phrases"
{
"No Access"
{
"cze" "Nemate pristup k tomuto prikazu"
}
"Back"
{
"cze" "Zpet"
}
"Next"
{
"cze" "Dalsi"
}
"Exit"
{
"cze" "Exit"
}
"Previous"
{
"cze" "Predchozi"
}
"all players"
{
"cze" "vsichni hraci"
}
"all humans"
{
"cze" "vsichni lide"
}
"all bots"
{
"cze" "vsichni boti"
}
"all dead players"
{
"cze" "vsichni mrtvi hraci"
}
"all alive players"
{
"cze" "vsichni zivi hraci"
}
"_s"
{
"cze" "{1}"
}
"all spectators"
{
"cze" "vsichni pozorovatele"
}
"Vote Count"
{
"cze" "Hlasy: {1}/{2}, zbyva {3}s"
}
"Voted For"
{
"cze" "{1} hlasoval pro {2}"
}
"Changed Vote"
{
"cze" " {1} zmenil svou volbu na {2}"
}
"No Vote"
{
"cze" "Zadny hlas"
}
"Name Reserved"
{
"cze" "Tvuj nick je rezervovan SourceModem; nastav sve heslo, abys ho mohl pouzivat."
}
}

View File

@ -0,0 +1,168 @@
"Phrases"
{
"Burn player"
{
"cze" "Zapalit hrace"
}
"FireBomb player"
{
"cze" "Udelat z hrace ohnivou bombu"
}
"Freeze player"
{
"cze" " Zmrazit hrace"
}
"FreezeBomb player"
{
"cze" "Udelat z hrace mrazici bombu"
}
"TimeBomb player"
{
"cze" " Udelat z hrace casovanou bombu"
}
"Beacon player"
{
"cze" "Oznacit hrace"
}
"NoClip player"
{
"cze" "Dat hraci NoClip"
}
"Blind player"
{
"cze" "Oslepit hrace"
}
"Drug player"
{
"cze" "Zfetovat hrace"
}
"Gravity player"
{
"cze" "Nastavit hraci gravitaci"
}
"Blind amount"
{
"cze" "Sila oslepeni?"
}
"Fully blind"
{
"cze" "Uplne oslepeni"
}
"Half blind"
{
"cze" "Polovicni oslepeni"
}
"No blind"
{
"cze" "Zadne oslepeni"
}
"Gravity amount"
{
"cze" "Sila gravitace?"
}
"Gravity Very High"
{
"cze" "Velmi vysoka gravitace"
}
"Gravity High"
{
"cze" "Vysoka gravitace"
}
"Gravity Normal"
{
"cze" "Normalni gravitace"
}
"Gravity Low"
{
"cze" "Nizka gravitace"
}
"Gravity Very Low"
{
"cze" "Velmi nizka gravitace"
}
"Set target on fire"
{
"cze" "zapalil hrace {1}."
}
"Toggled FireBomb on target"
{
"cze" "zmenil hrace {1} v ohnivou bombu."
}
"Froze target"
{
"cze" "zmrazil hrace {1}."
}
"Toggled FreezeBomb on target"
{
"cze" "zmenil hrace {1} v mrazici bombu."
}
"Toggled beacon on target"
{
"cze" "oznacil hrace {1}."
}
"Toggled TimeBomb on target"
{
"cze" "zmenil hrace {1} v casovanou bombu."
}
"Toggled noclip on target"
{
"cze" "prepl NoClip na hraci {1}."
}
"Toggled drug on target"
{
"cze" "zfetoval hrace {1}."
}
"Set blind on target"
{
"cze" "oslepil hrace {1}."
}
"Set gravity on target"
{
"cze" "nastavil gravitaci hraci {1}."
}
"Till Explodes"
{
"cze" "{2} sekund(y) nez {1} vybuchne."
}
"Unfrozen"
{
"cze" "Byl jsi rozmrazen."
}
"You will be unfrozen"
{
"cze" "Budes rozmrazen za {1} vterin."
}
}

View File

@ -0,0 +1,98 @@
"Phrases"
{
"Initiated Vote Gravity"
{
"cze" "Zahajil hlasovani o gravitaci."
}
"Initiated Vote Burn"
{
"cze" "Zahajil hlasovani o zapaleni proti hraci {1}."
}
"Initiated Vote Slay"
{
"cze" "Zahajil hlasovani o zabiti proti hraci {1}."
}
"Initiated Vote Alltalk"
{
"cze" "Zahajil hlasovani o alltalku."
}
"Initiated Vote FF"
{
"cze" "Zahajil hlasovani o Friendly Fire."
}
"Gravity Vote"
{
"cze" "Hlasovani o gravitaci: {1}"
}
"Change Gravity To"
{
"cze" "Zmenit gravitaci na {1}?"
}
"Voteburn player"
{
"cze" " Zapalit hrace {1}?"
}
"Voteslay Player"
{
"cze" "Zabit hrace {1}?"
}
"Votealltalk Off"
{
"cze" " Vypnout alltalk? {1}"
}
"Votealltalk On"
{
"cze" "Zapnout alltalk? {1}"
}
"Voteff Off"
{
"cze" "Vypnout FriendlyFire? {1}"
}
"Voteff On"
{
"cze" "Zapnout FriendlyFire? {1}"
}
"Gravity vote"
{
"cze" "Hlasovani o gravitaci"
}
"Vote FF"
{
"cze" "Hlasovani o FriendlyFire"
}
"Burn vote"
{
"cze" "Hlasovani o zapaleni"
}
"Alltalk vote"
{
"cze" "Hlasovani o Alltalk"
}
"Slay vote"
{
"cze" "Hlasovani o zabiti"
}
"Slayed player"
{
"cze" "Zabil hrace '{1}'"
}
}

View File

@ -0,0 +1,48 @@
"Phrases"
{
"Vote Nextmap"
{
"cze" "Hlasujte o pristi mape!"
}
"Nextmap Voting Started"
{
"cze" "Hlasovani o pristi mape zacalo."
}
"Nextmap Voting Finished"
{
"cze" "Hlasovani o mape skoncilo. Pristi mapou bude {1}. (Obdrzela {2}%% z {3} hlasu)"
}
"Current Map Extended"
{
"cze" "Soucasna mapa byla prodlouzena. (Obdrzela {1}%% z {2} hlasu)"
}
"Extend Map"
{
"cze" "Prodlouzit soucasnou mapu"
}
"Dont Change"
{
"cze" " Nemenit soucasnou mapu"
}
"Current Map Stays"
{
"cze" "Soucasna mapa pokracuje! Hlasovani rozhodlo! (Obdrzela {1}%% z {2} hlasu)"
}
"Changed Next Map"
{
"cze" "Zmenil pristi mapu na \"{1}\"."
}
"Starting Runoff"
{
"cze" "Zadna mapa neziskala {1]%% hlasu ({2} [{3}%%] & {4} [{5}%%]), zacina rozhodujici hlasovani."
}
}

View File

@ -0,0 +1,38 @@
"Phrases"
{
"Map History"
{
"cze" "Historie map"
}
"Map"
{
"cze" "[Mapa]"
}
"Started"
{
"cze" "[Zacala]"
}
"Played Time"
{
"cze" "[Odehrany cas]"
}
"Reason"
{
"cze" " [Duvod k ukonceni]"
}
"Current Map"
{
"cze" "Soucasna mapa"
}
"ago"
{
"cze" "pred"
}
}

View File

@ -0,0 +1,68 @@
"Phrases"
{
"Already Nominated"
{
"cze" "Uz jsi nominoval mapu."
}
"Max Nominations"
{
"cze" "Maximalni pocet nominaci byl dosahnut."
}
"Map Already In Vote"
{
"cze" "Mapa '{1}' byla jiz nominovana."
}
"Map Inserted"
{
"cze" "Mapa '{1}' byla pridana do nominaci."
}
"Map Already Nominated"
{
"cze" "Mapa, kterou jsi zvolil, byla jiz nominovana."
}
"Map Nominated"
{
"cze" "{1} nominoval {2}."
}
"Map Nomination Changed"
{
"cze" "{1} zmenil svou nominaci na {2}."
}
"Nominate Title"
{
"cze" "Nominovat mapu:"
}
"Can't Nominate Current Map"
{
"cze" "Mapa, kterou jsi zvolil, je soucasna mapa a nemuze byt nominovana."
}
"Map in Exclude List"
{
"cze" "Mapa, kterou jsi zvolil, se nedavno hrala a nemuze byt nominovana."
}
"Current Map"
{
"cze" "Soucasna mapa"
}
"Recently Played"
{
"cze" "Nedavno hrana"
}
"Nominated"
{
"cze" "Nominovana"
}
}

Some files were not shown because too many files have changed in this diff Show More