Übersetzung Backend Plugins

Hallo zusammen,

ist es möglich ein eigens erstelltes Backend Plugin (View extended vom Shopware.model.Container) übersetzbar zu machen (Weltkugel)?

Ich habe versucht bei den einzelnen Feldern den Parameter ‚translatable: true‘ mitzugeben - jedoch ohne Erfolg.

Hat hier jemand ein Beispiel wie es funktionieren könnte?

Danke im Voraus schonmal

  

Hi,

gibt es zu diesem Thema bereits einen Lösungsvorschlag? Ich stehe zur Zeit aktuell nämlich genau vor dem gleichen Problem.

Gruß

Daniel

Hey DannyDan,

wenn solche Probleme auftauchen kannst du immer in den Core schauen wie wir das dort gelöst haben oder dir ein unverschlüsseltes Plugin installieren :wink:

Hier findest du ein paar Ansätze:
themes/Backend/ExtJs/backend/article/view/detail/window.js:370

Grüße,
Simon 

Hi Simon,

das Plugin Attribut habe ich bereits erfolglos in meinem window welches von Shopware.model.Container erbt getestet. Leider taucht die Weltkugel nicht auf bei den gewünschten Feldern?!?

//{namespace name="plugin/data_structure/backend/location"}
Ext.define('Shopware.apps.Location.view.detail.Location', {
    extend: 'Shopware.model.Container',
    padding: 20,

    configure: function () {
        return {
                 plugins: [{
                 ptype: 'translation',
                 pluginId: 'translation',
                 translationType: 'location',
                 translationMerge: false,
                 translationKey: null
             }],
            controller: 'Location',
            fieldSets: [{
                title: '{s name=list_window_location}Location{/s}',                
                fields: {
                    active : { fieldLabel: '{s name=list_window_active}Active{/s}' },
                    name : { fieldLabel: '{s name=list_window_name}Name{/s}', allowBlank: false },
                    address : { fieldLabel: '{s name=list_window_address}Address{/s}', translatable: true, translationName: 'addressTranslation' },
                    zip : { fieldLabel: '{s name=list_window_zip}Zip{/s}' },
                    city : { fieldLabel: '{s name=list_window_city}City{/s}', translatable: true, translationName: 'cityTranslation' }
                }
             }
            }]
        };
    }
});

 

Hi Daniel,

‚plugins‘ ist kein valider Value der in der 'configure" function genutzt werden kann. Versuche mal folgendes:

//{namespace name="plugin/data_structure/backend/location"}
Ext.define('Shopware.apps.Location.view.detail.Location', {
    extend: 'Shopware.model.Container',
    padding: 20,

    initComponent: function () {
        var me = this;
        
        if (me.plugins === undefined) {
            me.plugins = [];
        }

        me.plugins.push(
            {
                pluginId: 'translation',
                ptype: 'translation',
                translationType: 'mein-eigener-translation-type'
            }
        );
    },

    configure: function () {
        return {
            controller: 'Location',
            fieldSets: [{
                title: '{s name=list_window_location}Location{/s}',                
                fields: {
                    active : { fieldLabel: '{s name=list_window_active}Active{/s}' },
                    name : { fieldLabel: '{s name=list_window_name}Name{/s}', allowBlank: false },
                    address : { fieldLabel: '{s name=list_window_address}Address{/s}', translatable: true, translationName: 'addressTranslation' },
                    zip : { fieldLabel: '{s name=list_window_zip}Zip{/s}' },
                    city : { fieldLabel: '{s name=list_window_city}City{/s}', translatable: true, translationName: 'cityTranslation' }
                }
             }
            }]
        };
    }
});

 

Danke für deine Antwort, Michael.
Leider funktioniert das nicht weil ein Fehler geschmissen wird:

Uncaught TypeError: me.client.getForm is not a function

 

Daniel

Hi Daniel,

sorry hatte eine Zeile vergessen:

in der initComponent fehlt noch der Aufruf der parent function

initComponent: function () {
        var me = this;

        me.callParent(arguments);
        
        if (me.plugins === undefined) {
            me.plugins = [];
        }

        me.plugins.push(
            {
                pluginId: 'translation',
                ptype: 'translation',
                translationType: 'mein-eigener-translation-type'
            }
        );
    },

 

Ohne den Aufruf werden natürlich wichtige Teile nicht ausgeführt 

Richtig, die hatte ich bereits eingefügt. Dann kommt der oben genannte Fehler.

:wink:

Edit: ich hatte die parent Funktion fälschlicherweise ans Ende der Funktion gelegt. So wie in Deinem Snippet bekomme ich nun einen anderen Fehler:

Uncaught TypeError: a.init is not a function

Frown

Daniel

schieb den Aufruf von callParent mal hinter dem push des Translations Plugin

Dann wird ja der Fehler geschmissen den ich oben beschrieben hatte:

Uncaught TypeError: me.client.getForm is not a function

Daniel

Hatte dein edit zu spät gelesen :slight_smile:

versuche mal folgendes:

//{namespace name="plugin/data_structure/backend/location"}
Ext.define('Shopware.apps.Location.view.detail.Location', {
    extend: 'Shopware.model.Container',
    padding: 20,

    initComponent: function () {
        var me = this;
        
        if (me.plugins === undefined) {
            me.plugins = [];
        }

        me.plugins.push(
            {
                pluginId: 'translation',
                ptype: 'translation',
                translationType: 'mein-eigener-translation-type'
            }
        );
        me.callParent(arguments);
    },

    getForm: function () {
        return this;
    },

    getRecord: function () {
        return this.record;
    },

    getFields: function () {
        var me = this;

        return {
            items: [
                me.down('[name=address]'),
                me.down('[name=city]')
            ]
        };
    },

    configure: function () {
        return {
            controller: 'Location',
            fieldSets: [{
                title: '{s name=list_window_location}Location{/s}',                
                fields: {
                    active : { fieldLabel: '{s name=list_window_active}Active{/s}' },
                    name : { fieldLabel: '{s name=list_window_name}Name{/s}', allowBlank: false },
                    address : { fieldLabel: '{s name=list_window_address}Address{/s}', translatable: true, translationName: 'addressTranslation' },
                    zip : { fieldLabel: '{s name=list_window_zip}Zip{/s}' },
                    city : { fieldLabel: '{s name=list_window_city}City{/s}', translatable: true, translationName: 'cityTranslation' }
                }
             }
            }]
        };
    }
});

Es scheint da noch einen Fehler in den Backend Komponenten zu geben im Zusammenhang mit den Übersetzungsplugin. Durch die zusätzlichen Methoden umgehen wir dieses Problem

3 „Gefällt mir“

Super!

Besten dank für die tolle Unterstützung. So funktioniert das ganze endlich.

Hi Michael,

danke für deine Antwort, hat mir sehr weiter geholfen!

Allerdings habe ich noch ein Problem mit Textareas festgestellt. Hier hat das Übersetzungsfenster dann zwei Textareas. Eine ausgegraute und eine, welche ich nochmal übersetzen könnte. Ich kann zwar ganz normal Übersetzungen speichern, anschließend verschwindet aber die Textarea im eigentlichen Pluginfenster.

Ist das auch ein Fehler in den Komponenten oder liegt das an meinem Code? Falls das ein Shopwarefehler ist, weißt du da auch einen Workaround?

 

EDIT: es lag an der Zeile “id: ‘reviewContent’,”. Man darf einem Feld, das übersetzt werden soll, scheinbar keine ID zuweisen.

 

//{namespace name="backend/ExpertReviews"}
//{block name="backend/expert_reviews/view/detail/reviews_container"}
Ext.define('Shopware.apps.ExpertReviews.view.detail.ReviewsContainer', {
    extend: 'Shopware.model.Container',
    alias: 'widget.detail-reviews-container',
    padding: 20,

    title: 'Reviews',


    /**
     * init translation
     */
    initComponent: function () {
        var me = this;


        if (me.plugins === undefined) {
            me.plugins = [];
        }

        me.plugins.push(
            {
                ptype: 'translation',
                pluginId: 'translation',
                translationType: 'swf_expert_reviews_review' // Ein eindeutiger Name
            }
        );

        me.callParent(arguments);
    },


    /**
     * workaround for shopware bug
     */
    getForm: function () {
        return this;
    },


    /**
     * workaround for shopware bug
     */
    getRecord: function () {
        return this.record;
    },


    /**
     * workaround for shopware bug
     */
    getFields: function () {
        var me = this;

        return {
            items: [
                me.down('[name=content]'),
                me.down('[name=linkText]')
            ]
        };
    },


    configure: function () {
        return {
            controller: 'Reviews', // php controller

            fieldSets: [
                {
                    title: 'Review bearbeiten',
                    id: "reviewDetailForm",

                    fields: {
                        articleID: {
                            fieldLabel: 'Artikel',
                            xtype: 'articlesearchfield'
                        },
                        expertID: {
                            fieldLabel: 'ExpertenID',
                            id: 'ExpertenID',
                            hidden: true
                        },
                        content: {
                            id: 'reviewContent',
                            fieldLabel: 'Meinung',
                            xtype: 'textarea',
                            height: 90,
                            grow: true,
                            allowBlank: false,
                            translatable: true,
                            translationName: 'content'
                        },
                        rating: {
                            fieldLabel: 'Rating',
                            maxValue: 5
                        },
                        teaser: {
                            fieldLabel: 'Teaser'
                        },
                        teaserImage: {
                            fieldLabel: 'TeaserImage',
                            xtype: 'base-element-media'
                        },
                        linkText: {
                            fieldLabel: 'Linktext',
                            translatable: true,
                            translationName: 'linkText'
                        }
                    },
                    layout: 'fit'
                }
            ]
        };
    }
});
//{/block}

 

1 „Gefällt mir“

Hi,

 

habe gerade den Thread gelesen und gesehen dass dies in den Backend Komponenten gar nicht vorgesehen ist bisher. Die Lösung von Michael hat dir ja schon weiter geholfen. Dadurch sind jedoch nur die Felder von dem einem Shopware.model.Container übersetzbar. 

Habe hierfür im Shopware.window.Detail gerade eine Konfigurations Möglichkeit eingebaut:

Dadurch sind alle FieldSets im Fenster unter dem gleichen Key übersetzbar.

 

3 „Gefällt mir“

Ach großartig, danke :slight_smile: