diff --git a/.github/workflows/auto_translate.yml b/.github/workflows/auto_translate.yml new file mode 100644 index 000000000000..58fc76f023d5 --- /dev/null +++ b/.github/workflows/auto_translate.yml @@ -0,0 +1,57 @@ +name: Add new translation + +on: + workflow_dispatch: + push: + branches: ['translate'] + +jobs: + add_translation: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + name: 'Add new translation' + + steps: + - name: 'Update Branch' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Installing Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Installing deps + run: | + python -m pip install --upgrade pip + pip install -r ./tools/translator/requirements.txt + + - name: Create temporary branch + run: | + git checkout -b translate_tmp + git reset --hard origin/master + - name: Apply existing translation + run: | + git fetch origin translate + git checkout origin/translate -- ./tools/translator/ss220replace.json + ./tools/translator/ss220_replacer_linux --prefix=ss220 --root=./../../ --location=./ + + - name: Apply PR translation + run: | + git cherry-pick -n origin/translate + + - name: 'Generate Translation' + run: | + python ./tools/translator/converter.py + [ ! -f ./ss220replace.json ] || mv ./ss220replace.json ./tools/translator/ss220replace.json + git add ./tools/translator/ss220replace.json + + - name: 'Push Translation' + run: | + git config --local user.email "action@github.com" + git config --local user.name "SS220Manager" + git commit -m "Generate translation file" + git push -f origin translate_tmp:translate diff --git a/.github/workflows/translate_branch_update.yml b/.github/workflows/translate_branch_update.yml new file mode 100644 index 000000000000..fb85099bcc01 --- /dev/null +++ b/.github/workflows/translate_branch_update.yml @@ -0,0 +1,36 @@ +name: Update translate branch + +on: + workflow_dispatch: + push: + branches: ['master'] + +jobs: + add_translation: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - name: 'Update Branch' + uses: actions/checkout@v4 + + - name: Create temporary branch + run: | + git branch -f translate_tmp + git checkout translate_tmp + git reset --hard origin/master + + - name: Apply existing translation + run: | + git fetch origin translate + git checkout origin/translate -- ./tools/translator/ss220replace.json + ./tools/translator/ss220_replacer_linux --prefix=ss220 --root=./../../ --location=./ + + - name: 'Push Translation' + run: | + git config --local user.email "action@github.com" + git config --local user.name "SS220Manager" + git commit -m "Generate translation file" + git push -u -f origin translate diff --git a/modular_ss220/_modpacks.dm b/modular_ss220/_modpacks.dm index 2350349bbd21..1c3c4cd9e5ca 100644 --- a/modular_ss220/_modpacks.dm +++ b/modular_ss220/_modpacks.dm @@ -5,6 +5,7 @@ SUBSYSTEM_DEF(modpacks) init_order = INIT_ORDER_MODPACKS flags = SS_NO_FIRE var/list/loaded_modpacks + var/list/tgui_data /datum/controller/subsystem/modpacks/Initialize() var/list/all_modpacks = list() @@ -34,30 +35,42 @@ SUBSYSTEM_DEF(modpacks) load_admins() // To make admins always have modular added verbs -/client/verb/modpacks_list() +/mob/verb/modpacks_list() set name = "Modpacks List" set category = "OOC" - if(!mob || !SSmodpacks.initialized) + if(!SSmodpacks.initialized) return - if(length(SSmodpacks.loaded_modpacks)) - . = "

Список модификаций



" - for(var/datum/modpack/M as anything in SSmodpacks.loaded_modpacks) - if(M.name) - . += "
" - . += "
[M.name]
" - - if(M.desc || M.author) - . += "
" - if(M.desc) - . += "
Описание: [M.desc]" - if(M.author) - . += "
Автор: [M.author]" - . += "

" - - var/datum/browser/popup = new(mob, "modpacks_list", "Список Модификаций", 480, 580) - popup.set_content(.) - popup.open() - else + if(!length(SSmodpacks.loaded_modpacks)) to_chat(src, "Этот сервер не использует какие-либо модификации.") + return + + SSmodpacks.ui_interact(src) + +/datum/controller/subsystem/modpacks/ui_static_data(mob/user) + var/list/data = list() + + if(!length(tgui_data)) + tgui_data = generate_modpacks_data() + data["modpacks"] = tgui_data + + return data + +/datum/controller/subsystem/modpacks/proc/generate_modpacks_data() + var/list/modpacks = list() + for(var/datum/modpack/modpack as anything in loaded_modpacks) + if(modpack.name) + modpacks += list(list( + "name" = modpack.name, + "desc" = modpack.desc, + "author" = modpack.author + )) + return modpacks + +/datum/controller/subsystem/modpacks/ui_interact(mob/user, ui_key, datum/tgui/ui, force_open, datum/tgui/master_ui, datum/ui_state/state = GLOB.always_state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, ui_key, "ModpacksList", "Modpacks List", 500, 550, master_ui, state) + ui.open() + ui.set_autoupdate(FALSE) diff --git a/tgui/packages/tgui/interfaces/ModpacksList.js b/tgui/packages/tgui/interfaces/ModpacksList.js new file mode 100644 index 000000000000..198329e19bc3 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ModpacksList.js @@ -0,0 +1,84 @@ +import { useBackend, useLocalState } from '../backend'; +import { Window } from '../layouts'; +import { Section, Input, Flex, Collapsible } from '../components'; + +export const ModpacksList = (props, context) => { + return ( + + + + + + ); +}; + +export const ModpacksListContent = (props, context) => { + const { act, data } = useBackend(context); + const { modpacks } = data; + + const [searchText, setSearchText] = useLocalState( + context, + 'searchText', + '' + ); + + const searchBar = ( + setSearchText(value)} + /> + ); + + return ( +
+
+ {searchBar} +
+
0 + ? `Результаты поиска "${searchText}"` + : `Все модификации` + } + fill + > + + + {modpacks + .filter(modpack => modpack.name && + (searchText.length > 0 ? + (modpack.name.toLowerCase().includes(searchText.toLowerCase()) || + modpack.desc.toLowerCase().includes(searchText.toLowerCase()) || + modpack.author.toLowerCase().includes(searchText.toLowerCase()) + ) : true)) + .map((modpack) => + +
+ {modpack.author} +
+
+ {modpack.desc} +
+
+ )} +
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui/public/tgui.bundle.js b/tgui/packages/tgui/public/tgui.bundle.js index 270c3e2b50ec..803712038e51 100644 --- a/tgui/packages/tgui/public/tgui.bundle.js +++ b/tgui/packages/tgui/public/tgui.bundle.js @@ -1,5 +1,5 @@ -!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=232)}([function(e,t,n){"use strict";t.__esModule=!0;var o=n(234);Object.keys(o).forEach((function(e){"default"!==e&&"__esModule"!==e&&(e in t&&t[e]===o[e]||(t[e]=o[e]))}))},function(e,t,n){"use strict";t.__esModule=!0,t.useSharedState=t.useLocalState=t.useBackend=t.deleteLocalState=t.backendUpdate=t.backendSetSharedState=t.backendReducer=t.backendDeleteSharedState=void 0;var o=n(33),r=n(44);t.backendUpdate=function(e){return{type:"backend/update",payload:e}};var a=function(e,t){return{type:"backend/setSharedState",payload:{key:e,nextState:t}}};t.backendSetSharedState=a;var c=function(e){return{type:"backend/deleteSharedState",payload:e}};t.backendDeleteSharedState=c;t.backendReducer=function(e,t){var n=t.type,o=t.payload;if("backend/update"===n){var a=Object.assign({},e.config,o.config),c=Object.assign({},e.data,o.static_data,o.data),i=Object.assign({},e.shared);if(o.shared)for(var l=0,d=Object.keys(o.shared);l1?n-1:0),r=1;rn?n:e};t.clamp01=function(e){return e<0?0:e>1?1:e};t.scale=function(e,t,n){return(e-t)/(n-t)};t.round=function(e,t){return!e||isNaN(e)?e:(t|=0,a=(e*=n=Math.pow(10,t))>0|-(e<0),r=Math.abs(e%1)>=.4999999999854481,o=Math.floor(e),r&&(e=o+(a>0)),(r?e:Math.round(e))/n);var n,o,r,a};t.toFixed=function(e,t){return void 0===t&&(t=0),Number(e).toFixed(Math.max(t,0))};var o=function(e,t){return t&&e>=t[0]&&e<=t[1]};t.inRange=o;t.keyOfMatchingRange=function(e,t){for(var n=0,r=Object.keys(t);n=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n",apos:"'"};return e.replace(/
/gi,"\n").replace(/<\/?[a-z0-9-_]+[^>]*>/gi,"").replace(/&(nbsp|amp|quot|lt|gt|apos);/g,(function(e,n){return t[n]})).replace(/&#?([0-9]+);/gi,(function(e,t){var n=parseInt(t,10);return String.fromCharCode(n)})).replace(/&#x?([0-9a-f]+);/gi,(function(e,t){var n=parseInt(t,16);return String.fromCharCode(n)}))};t.buildQueryString=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")}},function(e,t,n){"use strict";var o=n(5),r=n(74),a=o.String;e.exports=function(e){if("Symbol"===r(e))throw TypeError("Cannot convert a Symbol value to a string");return a(e)}},function(e,t,n){"use strict";t.__esModule=!0,t.unit=t.halfUnit=t.computeBoxProps=t.computeBoxClassName=t.Box=void 0;var o=n(8),r=n(0),a=n(506),c=n(44),i=["as","className","children"];var l=function(e){return"string"==typeof e?e:"number"==typeof e?12*e+"px":void 0};t.unit=l;var d=function(e){return"string"==typeof e?e:"number"==typeof e?12*e*.5+"px":void 0};t.halfUnit=d;var u=function(e){return"string"==typeof e&&c.CSS_COLORS.includes(e)},s=function(e){return function(t,n){(0,o.isFalsy)(n)||(t[e]=n)}},m=function(e,t){return function(n,r){(0,o.isFalsy)(r)||(n[e]=t(r))}},p=function(e,t){return function(n,r){(0,o.isFalsy)(r)||(n[e]=t)}},h=function(e,t,n){return function(r,a){if(!(0,o.isFalsy)(a))for(var c=0;c0&&(t.style=l),t};t.computeBoxProps=N;var b=function(e){var t=e.textColor||e.color,n=e.backgroundColor;return(0,o.classes)([u(t)&&"color-"+t,u(n)&&"color-bg-"+n])};t.computeBoxClassName=b;var V=function(e){var t=e.as,n=void 0===t?"div":t,o=e.className,c=e.children,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,i);if("function"==typeof c)return c(N(e));var d="string"==typeof o?o+" "+b(l):b(l),u=N(l);return(0,r.createVNode)(a.VNodeFlags.HtmlElement,n,d,c,a.ChildFlags.UnknownChildren,u)};t.Box=V,V.defaultHooks=o.pureComponentHooks},function(e,t,n){"use strict";var o=n(41);e.exports=function(e){return o(e.length)}},function(e,t,n){"use strict";var o=n(5),r=n(12),a=n(50),c=n(130),i=n(128);e.exports=function(e,t,n,l){var d=!!l&&!!l.unsafe,u=!!l&&!!l.enumerable,s=!!l&&!!l.noTargetGet,m=l&&l.name!==undefined?l.name:t;return r(n)&&c(n,m,l),e===o?(u?e[t]=n:i(t,n),e):(d?!s&&e[t]&&(u=!0):delete e[t],u?e[t]=n:a(e,t,n),e)}},function(e,t,n){"use strict";var o=n(60),r=n(7),a=n(85),c=n(19),i=n(23),l=n(91),d=r([].push),u=function(e){var t=1==e,n=2==e,r=3==e,u=4==e,s=6==e,m=7==e,p=5==e||s;return function(h,f,C,N){for(var b,V,g=c(h),v=a(g),y=o(f,C),x=i(v),_=0,k=N||l,L=t?k(h,x):n||m?k(h,0):undefined;x>_;_++)if((p||_ in v)&&(V=y(b=v[_],_,g),e))if(t)L[_]=V;else if(V)switch(e){case 3:return!0;case 5:return b;case 6:return _;case 2:d(L,b)}else switch(e){case 4:return!1;case 7:d(L,b)}return s?-1:r||u?u:L}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},function(e,t,n){"use strict";t.__esModule=!0,t.zipWith=t.zip=t.uniqBy=t.toKeyedArray=t.toArray=t.sortBy=t.reduce=t.map=t.filter=void 0;t.toArray=function(e){if(Array.isArray(e))return e;if("object"==typeof e){var t=Object.prototype.hasOwnProperty,n=[];for(var o in e)t.call(e,o)&&n.push(e[o]);return n}return[]};t.toKeyedArray=function(e,t){return void 0===t&&(t="key"),o((function(e,n){var o;return Object.assign(((o={})[t]=n,o),e)}))(e)};t.filter=function(e){return function(t){if(null===t&&t===undefined)return t;if(Array.isArray(t)){for(var n=[],o=0;oi)return 1}return 0};t.sortBy=function(){for(var e=arguments.length,t=new Array(e),n=0;n=0||(r[n]=e[n]);return r}var u=function(e){var t=e.className,n=e.direction,o=e.wrap,c=e.align,l=e.alignContent,u=e.justify,s=e.inline,m=e.spacing,p=void 0===m?0:m,h=e.spacingPrecise,f=void 0===h?0:h,C=d(e,i);return Object.assign({className:(0,r.classes)(["Flex",a.IS_IE8&&("column"===n?"Flex--ie8--column":"Flex--ie8"),s&&"Flex--inline",p>0&&"Flex--spacing--"+p,f>0&&"Flex--spacingPrecise--"+f,t]),style:Object.assign({},C.style,{"flex-direction":n,"flex-wrap":o,"align-items":c,"align-content":l,"justify-content":u})},C)};t.computeFlexProps=u;var s=function(e){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.Box,Object.assign({},u(e))))};t.Flex=s,s.defaultHooks=r.pureComponentHooks;var m=function(e){var t=e.className,n=e.grow,o=e.order,i=e.shrink,u=e.basis,s=void 0===u?e.width:u,m=e.align,p=d(e,l);return Object.assign({className:(0,r.classes)(["Flex__item",a.IS_IE8&&"Flex__item--ie8",t]),style:Object.assign({},p.style,{"flex-grow":n,"flex-shrink":i,"flex-basis":(0,c.unit)(s),order:o,"align-self":m})},p)};t.computeFlexItemProps=m;var p=function(e){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.Box,Object.assign({},m(e))))};t.FlexItem=p,p.defaultHooks=r.pureComponentHooks,s.Item=p},function(e,t,n){"use strict";e.exports=!1},function(e,t,n){"use strict";var o=n(237),r=n(18),a=n(178),c=n(17).f;e.exports=function(e){var t=o.Symbol||(o.Symbol={});r(t,e)||c(t,e,{value:a.f(e)})}},function(e,t,n){"use strict";var o=n(7),r=n(32),a=n(21),c=/"/g,i=o("".replace);e.exports=function(e,t,n,o){var l=a(r(e)),d="<"+t;return""!==n&&(d+=" "+n+'="'+i(a(o),c,""")+'"'),d+">"+l+""}},function(e,t,n){"use strict";var o=n(6);e.exports=function(e){return o((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}))}},function(e,t,n){"use strict";var o,r,a,c=n(174),i=n(5),l=n(7),d=n(11),u=n(50),s=n(18),m=n(127),p=n(102),h=n(87),f=i.TypeError,C=i.WeakMap;if(c||m.state){var N=m.state||(m.state=new C),b=l(N.get),V=l(N.has),g=l(N.set);o=function(e,t){if(V(N,e))throw new f("Object already initialized");return t.facade=e,g(N,e,t),t},r=function(e){return b(N,e)||{}},a=function(e){return V(N,e)}}else{var v=p("state");h[v]=!0,o=function(e,t){if(s(e,v))throw new f("Object already initialized");return t.facade=e,u(e,v,t),t},r=function(e){return s(e,v)?e[v]:{}},a=function(e){return s(e,v)}}e.exports={set:o,get:r,has:a,enforce:function(e){return a(e)?r(e):o(e,{})},getterFor:function(e){return function(t){var n;if(!d(t)||(n=r(t)).type!==e)throw f("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){"use strict";var o=Math.ceil,r=Math.floor;e.exports=function(e){var t=+e;return t!=t||0===t?0:(t>0?r:o)(t)}},function(e,t,n){"use strict";var o=n(40),r=Math.min;e.exports=function(e){return e>0?r(o(e),9007199254740991):0}},function(e,t,n){"use strict";function o(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n1?r-1:0),i=1;i1?o-1:0),a=1;at)return"in the future";var n=(t/=10)-(e/=10);if(n>3600){var o=Math.round(n/3600);return o+" hour"+(1===o?"":"s")+" ago"}if(n>60){var r=Math.round(n/60);return r+" minute"+(1===r?"":"s")+" ago"}var a=Math.round(n);return a+" second"+(1===a?"":"s")+" ago"}},function(e,t,n){"use strict";t.__esModule=!0,t.LabeledListItem=t.LabeledListDivider=t.LabeledList=void 0;var o=n(0),r=n(8),a=n(22),c=n(221),i=["className","label","labelColor","color","textAlign","verticalAlign","buttons","content","children","noColon"];var l=function(e){var t=e.children;return(0,o.createVNode)(1,"table","LabeledList",t,0)};t.LabeledList=l,l.defaultHooks=r.pureComponentHooks;var d=function(e){var t=e.className,n=e.label,c=e.labelColor,l=void 0===c?"label":c,d=e.color,u=e.textAlign,s=e.verticalAlign,m=e.buttons,p=e.content,h=e.children,f=e.noColon,C=void 0!==f&&f,N=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,i),b=C?"":":";return(0,o.createVNode)(1,"tr",(0,r.classes)(["LabeledList__row",t]),[(0,o.createComponentVNode)(2,a.Box,{as:"td",color:l,verticalAlign:s,className:(0,r.classes)(["LabeledList__cell","LabeledList__label"]),children:n?n+b:null}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({as:"td",color:d,textAlign:u,verticalAlign:s,className:(0,r.classes)(["LabeledList__cell","LabeledList__content"]),colSpan:m?undefined:2},N,{children:[p,h]}))),m&&(0,o.createVNode)(1,"td","LabeledList__cell LabeledList__buttons",m,0)],0)};t.LabeledListItem=d,d.defaultHooks=r.pureComponentHooks;var u=function(e){var t=e.size?(0,a.unit)(Math.max(0,e.size-1)):0;return(0,o.createVNode)(1,"tr","LabeledList__row",(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,c.Divider),2,{colSpan:3,style:{"padding-top":t,"padding-bottom":t}}),2)};t.LabeledListDivider=u,u.defaultHooks=r.pureComponentHooks,l.Item=d,l.Divider=u},function(e,t,n){"use strict";var o=n(7),r=o({}.toString),a=o("".slice);e.exports=function(e){return a(r(e),8,-1)}},function(e,t,n){"use strict";var o=n(7);e.exports=o({}.isPrototypeOf)},function(e,t,n){"use strict";var o=n(84),r=Function.prototype,a=r.apply,c=r.call;e.exports="object"==typeof Reflect&&Reflect.apply||(o?c.bind(a):function(){return c.apply(a,arguments)})},function(e,t,n){"use strict";var o=n(29);e.exports=o("navigator","userAgent")||""},function(e,t,n){"use strict";var o=n(9),r=n(17),a=n(64);e.exports=o?function(e,t,n){return r.f(e,t,a(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";var o=n(40),r=Math.max,a=Math.min;e.exports=function(e,t){var n=o(e);return n<0?r(n+t,0):a(n,t)}},function(e,t,n){"use strict";var o,r=n(10),a=n(134),c=n(132),i=n(87),l=n(177),d=n(129),u=n(102),s=u("IE_PROTO"),m=function(){},p=function(e){return"