77use wcf \data \bbcode \BBCodeEditor ;
88use wcf \data \bbcode \BBCodeList ;
99use wcf \data \package \PackageCache ;
10+ use wcf \system \bbcode \command \SaveContent ;
1011use wcf \system \bbcode \IBBCode ;
1112use wcf \system \database \util \PreparedStatementConditionBuilder ;
1213use wcf \system \devtools \pip \IDevtoolsPipEntryList ;
2728use wcf \system \form \builder \field \validation \FormFieldValidator ;
2829use wcf \system \form \builder \field \validation \FormFieldValidatorUtil ;
2930use wcf \system \form \builder \IFormDocument ;
31+ use wcf \system \language \LanguageFactory ;
3032use wcf \system \WCF ;
3133use wcf \util \StringUtil ;
3234
@@ -64,6 +66,11 @@ class BBCodePackageInstallationPlugin extends AbstractXMLPackageInstallationPlug
6466 */
6567 protected $ attributes = [];
6668
69+ /**
70+ * @var array<int, array<string, string>>
71+ */
72+ protected array $ buttonLabels = [];
73+
6774 /**
6875 * @inheritDoc
6976 */
@@ -104,13 +111,22 @@ protected function getElement(\DOMXPath $xpath, array &$elements, \DOMElement $e
104111 $ nodeValue [$ attributeNo ][$ attributeValue ->tagName ] = $ attributeValue ->nodeValue ;
105112 }
106113 }
107- } elseif ($ element ->tagName === 'wysiwygicon ' && !\str_contains ($ element ->nodeValue , '. ' )) {
114+ } elseif ($ element ->tagName === 'wysiwygicon ' && !\str_contains ($ element ->nodeValue , '. ' ) && !\str_contains ($ element ->nodeValue , '; ' )) {
115+ // backwards compatibility
108116 $ solid = $ element ->getAttribute ('solid ' );
109117 $ nodeValue = \sprintf (
110118 "%s;%s " ,
111119 $ element ->nodeValue ,
112120 $ solid === 'true ' ? 'true ' : 'false '
113121 );
122+ } elseif ($ element ->tagName === 'buttonlabel ' ) {
123+ if (!isset ($ elements [$ element ->tagName ])) {
124+ $ elements [$ element ->tagName ] = [];
125+ }
126+
127+ $ elements [$ element ->tagName ][$ element ->getAttribute ('language ' ) ?: '' ] = $ element ->nodeValue ;
128+
129+ return ;
114130 }
115131
116132 $ elements [$ element ->tagName ] = $ nodeValue ;
@@ -130,7 +146,7 @@ protected function prepareImport(array $data)
130146 'className ' => !empty ($ data ['elements ' ]['classname ' ]) ? $ data ['elements ' ]['classname ' ] : '' ,
131147 'isBlockElement ' => !empty ($ data ['elements ' ]['isBlockElement ' ]) ? 1 : 0 ,
132148 'isSourceCode ' => !empty ($ data ['elements ' ]['sourcecode ' ]) ? 1 : 0 ,
133- 'buttonLabel ' => $ data ['elements ' ]['buttonlabel ' ] ?? '' ,
149+ 'buttonLabel ' => $ data ['elements ' ]['buttonlabel ' ] ?? [] ,
134150 'originIsSystem ' => 1 ,
135151 ];
136152
@@ -188,13 +204,15 @@ protected function import(array $row, array $data)
188204 {
189205 // extract attributes
190206 $ attributes = $ data ['attributes ' ];
207+ $ buttonLabel = $ data ['buttonLabel ' ] ?? [];
191208 unset($ data ['attributes ' ]);
209+ unset($ data ['buttonLabel ' ]);
192210
193211 if (!empty ($ row )) {
194212 // allow updating of all values except for those controlling the editor button
195213 unset($ data ['wysiwygIcon ' ]);
196- unset($ data ['buttonLabel ' ]);
197214 unset($ data ['showButton ' ]);
215+ unset($ buttonLabel );
198216 }
199217
200218 /** @var BBCode $bbcode */
@@ -203,6 +221,10 @@ protected function import(array $row, array $data)
203221 // store attributes for later import
204222 $ this ->attributes [$ bbcode ->bbcodeID ] = $ attributes ;
205223
224+ if (isset ($ buttonLabel ) && $ buttonLabel !== []) {
225+ $ this ->buttonLabels [$ bbcode ->bbcodeID ] = $ buttonLabel ;
226+ }
227+
206228 return $ bbcode ;
207229 }
208230
@@ -238,6 +260,16 @@ protected function postImport()
238260 }
239261 }
240262 }
263+
264+ foreach ($ this ->buttonLabels as $ bbcodeID => $ buttonLabels ) {
265+ $ labels = [];
266+ foreach ($ buttonLabels as $ languageCode => $ buttonLabel ) {
267+ $ languageID = $ languageCode !== '' ? LanguageFactory::getInstance ()->getLanguageByCode ($ languageCode )->languageID : 0 ;
268+ $ labels [$ languageID ] = $ buttonLabel ;
269+ }
270+
271+ (new SaveContent ($ bbcodeID , $ labels ))();
272+ }
241273 }
242274
243275 /**
@@ -271,10 +303,18 @@ protected function fetchElementData(\DOMElement $element, $saveData)
271303 'bbcodeTag ' => $ element ->getAttribute ('name ' ),
272304 'packageID ' => $ this ->installation ->getPackage ()->packageID ,
273305 'originIsSystem ' => 1 ,
306+ 'buttonLabel ' => [],
274307 ];
275308
309+ /** @var \DOMElement $name */
310+ foreach ($ element ->getElementsByTagName ('buttonlabel ' ) as $ name ) {
311+ $ langaugeCode = $ name ->getAttribute ('language ' );
312+ $ languageID = $ langaugeCode !== '' ? LanguageFactory::getInstance ()->getLanguageByCode ($ langaugeCode )->languageID : 0 ;
313+
314+ $ data ['buttonLabel ' ][$ languageID ] = $ name ->nodeValue ;
315+ }
316+
276317 $ optionalElements = [
277- 'buttonLabel ' => 'buttonlabel ' ,
278318 'className ' => 'classname ' ,
279319 'htmlClose ' => 'htmlclose ' ,
280320 'htmlOpen ' => 'htmlopen ' ,
@@ -467,6 +507,7 @@ protected function addFormFields(IFormDocument $form)
467507 ->description ('wcf.acp.pip.bbcode.buttonLabel.description ' )
468508 ->required ()
469509 ->maximumLength (255 )
510+ ->i18n ()
470511 ->addDependency (
471512 NonEmptyFormFieldDependency::create ('showButton ' )
472513 ->fieldId ('showButton ' )
@@ -555,11 +596,26 @@ protected function setEntryListKeys(IDevtoolsPipEntryList $entryList)
555596 */
556597 protected function prepareXmlElement (\DOMDocument $ document , IFormDocument $ form )
557598 {
599+ $ formData = $ form ->getData ();
558600 $ data = $ form ->getData ()['data ' ];
559601
560602 $ bbcode = $ document ->createElement ($ this ->tagName );
561603 $ bbcode ->setAttribute ('name ' , $ data ['name ' ]);
562604
605+ if (isset ($ formData ['buttonlabel ' ])) {
606+ foreach ($ formData ['buttonlabel ' ] as $ languageID => $ buttonLabel ) {
607+ $ buttonLabelElement = $ document ->createElement ('buttonlabel ' , $ this ->getAutoCdataValue ($ buttonLabel ));
608+ if ($ languageID !== 0 ) {
609+ $ buttonLabelElement ->setAttribute (
610+ 'language ' ,
611+ LanguageFactory::getInstance ()->getLanguage ($ languageID )->languageCode
612+ );
613+ }
614+
615+ $ bbcode ->appendChild ($ buttonLabelElement );
616+ }
617+ }
618+
563619 $ this ->appendElementChildren (
564620 $ bbcode ,
565621 [
@@ -574,7 +630,6 @@ protected function prepareXmlElement(\DOMDocument $document, IFormDocument $form
574630 ],
575631 'isBlockElement ' => 0 ,
576632 'sourcecode ' => 0 ,
577- 'buttonlabel ' => '' ,
578633 'wysiwygicon ' => '' ,
579634 ],
580635 $ form
0 commit comments