 La dernière étape de ce lab est en multilanguage, donc nous allons ajouter un nouveau langage pour notre application. La première chose que nous allons ajouter est le texte flex-button. Nous allons évoquer l'alternat, en fait pour l'alternat, parce que nous ne serons pas à l'italien ou à l'armée. Nous serons à l'anglais mais avec différents nommages. Ensuite, nous allons assigner le texte flex-button à l'alternat. Donc, quand nous cliquons ce texte flex-button, nous allons changer le code spécifique C++ pour évoquer l'alternat. Et pour cela, nous devons également ajouter un nouveau langage pour notre application. Donc, sur la scène 1, donc, pour le design, vous pouvez voir que je n'ai toujours pas évoqué tout parce que ce n'est pas un soucis pour maintenir des cubismiques et des cubis d'Open, en éditing seulement l'interface graphique. Dans la scène 1, donc, nous allons ajouter un flex-button et évoquer le langage pour l'alternat. La location, je vais le mettre juste après. Donc, pour le next button, nous allons ajouter un style image, pour que nous pouvons retirer le style défaut. Et on set l'image, presser le state et presser le state. Et puis, ajouter aussi un style texte. Et le texte sera alt pour alternateur. Et je vais le mettre juste après. Donc, maintenant, je dois mettre le texte à la propre location. Et dans le style image, je dois serrer le flex-button à l'image, pour que ce soit correctement disparu. Donc, maintenant, je peux voir que je n'ai pas utilisé la position de la position de l'alternat pour mon button. Donc, ce n'est pas un soucis, je peux les évoquer comme ça. Et le flex-button est trop fort, maintenant. Le texte est trop fort, comme ça. Ok, donc, maintenant, c'est ok pour le button. Oui, j'ai oublié de changer la couleur du texte. Ah non, c'est ok, c'est noir quand c'est élevé, puis noir quand c'est élevé. Et ensuite, je vais ajouter une direction net. De nouveau, de la designer. Donc, la direction de l'interaction sera le button Toggle Language. Elle sera élevé par le clic sur le bouton, celui qui est ajouté. Et la action sera élevé pour exécuter un code C++ que l'on va élevé dans quelques secondes. Donc, ça doit être fait dès que vous supportez le multilanguage. Oui, vous devez élevé le changement du multilanguage, l'update du langage, en fait, dans le code source. Il n'y a pas encore une interaction qui peut automatiquement changer le langage. Ce n'est pas implémentaire encore, peut-être que ce sera dans une prochaine version. Mais pour le moment, vous devez définir la fonction Toggle Language. Et dans ça, on va proposer comment faire ça. Et c'est aussi donné dans la documentation de la documentation TGFX pour changer le langage. Donc, maintenant, nous devons ajouter ce langage. Donc, nous allons passer au texte, le texte panel. Donc, par contre, je vais retirer cette typographie, parce que je ne l'ai pas utilisé. Et ça peut montrer quelque chose qui peut être intéressant pour vous, parce que c'est possible que, en faisant ça, je vais avoir un message. Parce qu'il n'y a pas d'issue à ce moment, en regardant l'update du projet QBiD de Toggle. Parfois, nous avons observé que certains files qui étaient retirés dans le layout n'étaient pas retirés correctement de l'application de QBiD, et nous l'étendons aux erreurs. En fait, c'est juste parce que le projet QBiD n'était pas correctement updaté. Et ce n'est pas clair à ce moment, si le problème vient du Toggle Language de Toggle. Donc, il y a des rubis, c'est-à-dire des rubis, des rubis scripts, qui sont appelés pour updater le file de projet QBiD. Ou, si ça vient du projet QBiD, ok, on a des investigations, donc c'est intéressant de retirer celui-là, juste pour voir si il y a des erreurs. Donc, ces typographies, je vais utiliser un single et ajouter un nouveau langage. Donc, mon nouveau langage sera Alt, donc pour Alternate. Et vous pouvez voir ici que, dès que quelque chose devient red dans le Toggle Designer, ça veut dire qu'il y a des erreurs qui ne peuvent pas générer le code correctement. Vous pouvez générer le code en fait, si vous ne correctez cela. Ça peut aussi se passer si vous retirez l'image, par exemple, de ce panel. Puis, il y aura une erreur dans le canvas view, qui dit que cette image est faite. Donc, rapidement, nous n'avons pas deux langages, et nous allons mettre les valeurs pour chaque. Donc, cela peut être édité directement dans le file Excel qui est dans l'asset folder. Et c'est intéressant, quand vous avez plusieurs langages différents, et les personnes qui sont en charge de la translation ne veulent pas installer le Toggle Designer, ils ne doivent pas, en fait, parce que si vous allez dans le folder Asset dans le texte, vous avez ce texte, ce sheet Excel. Je ne vais pas l'ouvrir maintenant, parce que c'est déjà ouvert par le designer, donc il va être complémentaire parce que c'est le système Microsoft Log. Mais ce file contains toute la translation de tous les textes dans le layout. Si vous avez juste transporté ce file et vous avez dit à votre collègue que vous devez mettre la translation, la translation italienne ou la translation spanish à cette position, et puis vous retirez le file texte, vous pouvez directement installer cette valeur. Sans la nécessité d'installer le Toggle Designer sur l'autre côté. C'est assez convainc. Je vais mettre la screen 2, la screen 1, etc. Donc, c'est la translation pour quand... Oh non, c'est la première translation. Je pense que c'était la même ordre, ce n'est pas à tout. Donc, pas de problème. La contrôle screen, c'est le logiciel. Et le contrôle bordel c'est le physique. Donc, le software devient EMG Hardware, LED et Junction Temperature est interne. C'est tout. Donc, j'ai toute ma translation dans des langues différentes. Et maintenant, je peux générer le code. Correspondez à ça. Et la seule chose qu'il y aura, c'est d'implementer cette langue Toggle. Ici, il n'y a que 1 bouton qui Toggle entre 2 langues. Mais vous pouvez imaginer un menu drop-down que nous allons vous sélectionner pour une liste. Si vous avez plusieurs langues, comme 5 ou 6 langues, vous pouvez sélectionner de la menu drop-down et associer la sélection d'un item de la menu avec l'update de la langue. Vous verrez que la sélection de la langue n'est que un code d'une fonction et de l'update des textes visibles sur la scénarie. Parce que sur la prochaine scénarie, la langue est installée dans le modèle. Parce que c'est la seule chose qui est constante dans l'application. Donc, quand vous changez la langue, vous changez la valeur dans le modèle. Et si vous changez la scénarie, la scénarie va vous dire que dans cette langue, vous devez utiliser cette sélection ou le texte correspondant à cette langue. Donc, la génération est faite. Nous allons maintenant retourner au projet QBAG. Dans le projet QBAG, je vais faire exactement ce que j'ai fait pour les deux lieux prévus, et chercher pour le troisième défi. Donc, en ce cas, il y a deux places où l'application est installée. C'est l'une qui set la langue de l'application. Donc, ce que l'on définit, ce n'est pas l'application sur la scénarie QBAG. Mais sur la scénarie QBAG. Donc, ce code, l'application qui a été ajoutée à l'extérieur de cet application, mais dans la mosaise, c'est la langue de l'application. C'est la langue de l'application qui est définie ici. Donc, dans la langue de l'application, nous avons déjà obtenu la langue de l'application. Donc, c'est de l'indépendant de l'interprète présent. Ce texte de la langue de l'application est un fonction qui est disponible, c'est un statique qui est disponible et nous avons obtenu la langue de l'application. Nous avons aussi accès à le nombre de langues qui sont disponibles. Donc, c'est inclus dans cet application. Donc, ces langues incluses sont aussi mandatoires pour manipuler la langue. Donc, c'est également indiqué dans la documentation de l'application. Et, si la langue de l'application est de l'interprète présent, en fait, c'est un changement de langues. Si nous avons obtenu 3 langues, ce serait pas seulement un toggle, mais un changement de 1, 2, 2, 3, 3, 1, etc. C'est un date circulaire de la langue de l'application. Donc, nous avons changé la vue. Nous avons dit que la vue dit que le bouton a été cliqué. Et le présentateur décide de dire la vue d'appliquer la langue de l'interprète ou de la langue de l'application. Donc, dans la vue, cette fonction est appelée quand le bouton est exprès. Nous avons appliqué la langue de l'interprète et nous invalidons tous les éléments textuels visibles sur la table. Nous pouvons éviter cela, mais en ce cas, nous verrons seulement le changement de la langue par switcher à une autre table. Et ensuite, renouvelant à la table, nous devons également appliquer la valeur textuelle. Donc, si nous voulons appliquer dès que nous cliquons sur le bouton, nous devons invalider toutes les zones textuelles. Nous avons seulement 3 ici, nous avons bien sûr créé une fonction délicatée si vous avez plus de textes et si vous avez plus dans votre développement de l'application, vous avez juste une fonction et pas chaque fois que vous updatez la langue. Donc, nous allons ajouter ce type 3 compilation flag ainsi que le code C++ et maintenant nous verrons presser le bouton alt qui change la langue automatiquement. Nous pouvons aussi lancer directement la délication qui traite le make le build du projet et le flash de bord. Donc, c'est très intéressant parce que je n'ai pas de respect depuis la convention et donc nous voulons reflerer invalider ce fil de texte qui n'existe pas et c'est juste un petit erreur pour moi. Donc, le texte doit être là. Oui, c'est l'area textuelle qui est faite. Donc maintenant, il doit être mieux. Je peux construire encore j'espère que je n'ai pas mispellé toutes les rejets. Mais au moins, c'est encore intéressant de voir qu'il y a un autre. C'est exactement ce que j'ai mentionné l'arrière. Donc, l'autre issue de compilation est qu'on a mis le système. Je n'ai pas mis ce verre. C'est normal. Donc, j'ai eu l'update de la QBDE pour fixer le designer. Ce sera fixé. J'ai déjà reporté l'issue. Tout ce que j'ai besoin de est de retirer ce fil d'ici. Vous voyez qu'il y a un point de exclamation ici. Je n'ai pas utilisé ce fil et je n'ai pas besoin d'aider d'associer les autres files. Ce sont des files qui ont été générés par un texte et des fonds en général pour déterminer la distance entre les personnages. C'est ce que c'est. Et donc, j'espère qu'il ne soit pas surpris dans le futur, dans le futur de développement. Si cela s'occupe, vous avez ajouté le fil. Cela signifie que vous avez ajouté quelque chose, généré le code et puis retiré. Et parfois, la retiration n'est pas fonctionnelle. Mais c'est seulement une question de fil refermée par le project de QBDE. Dans le design, il y aura un build et un flash proprement si j'ai basé le toolchain. Et dans QBDE, il va falloir tomber. Mais pour sûr, ce sera fixé. Donc maintenant, c'est ok et on peut tourner le debug et finalement voir le résultat. Et ne vous inquiétez pas en fait, c'est juste que ici c'est. Il n'a pas commencé, c'était la dernière image qui a été displays avant d'arrêter la caméra. Donc, maintenant, je peux switch la langue et elle switch dans les deux screens. Et vous pouvez voir que ici le nom est trop long. Donc, ça doit être adapté, bien sûr. Et c'est aussi un moyen de vous dire qu'il faut prendre soin de la dimension du texte, que quand vous changez la langue. Mais de toute façon, la langue va changer comme vous le souhaitez. Donc, c'est la fin de ce laboratoire. Je voulais aussi vous montrer qu'on a parlé du build analyzer. Donc, dans le build analyzer il y a deux points. En fait, ici vous pouvez voir la section et la mémoire, l'usage de la mémoire en termes de flash de l'application. Vous pouvez voir qu'il y a une box rouge ici. Ce n'est pas une erreur, c'est juste une warning, mais c'est un autre. C'est juste nous dire que la section FB, donc la section FB est définie dans ce type de file. Ici, on définit la section FB qui commence à l'adresse et est 768 kilobytes long. Ce sont les deux buffers que nous définissons pour cette application. Et nous sommes sûrs que c'est parce que la section FB a une spécifique location pragma qui s'appelle la section FB Donc, si nous allons, c'est le target JFIX qui est généré ici, c'est ça. Donc, la section FB est un pragma que nous définissons autour de l'arrêt de la FB qui est définie pour contenir la section FB que nous allons utiliser. Donc, cette spécifique pragma peut être utilisé par le scatter file pour positionner cette section à une spécifique location FB Donc, nous pouvons trouver le pragma et cela sera utilisé en ram FB. Donc, c'est parfaitement normal de voir cela. Et sachez que le même mécanisme est utilisé. Je vous ai présentement dans le panel image que chaque image a été attribuée à la section FB. Donc, ici c'est la section X flash. Et le même principle vous pouvez voir que la section X flash est définie ici et sera utilisée en auto-XPI. Donc, toutes les images d'input sera utilisées avec ce mécanisme en auto-XPI. Et vous pouvez voir que cette section X flash pragma est définie pour toutes les images qui ont été générées. Donc, c'est pour exemple la première image de l'animation et vous pouvez retrouver cette section X flash de la direction primaire qui sera associée avec cette table qui contient l'image d'input. Pour la première image, c'est la même pour toutes les images d'input. Donc, c'est pour ça qu'on trouve qu'à la droite de l'extrême ou de l'interne l'objectif d'input de notre layout. Donc, peut-être un dernier point pour vous montrer aussi comment l'HL partie de la fréquence de 2JFX est locée. Donc, la partie de l'HL c'est la première fonction de l'opérance systeme le mécanisme de lock que l'on a besoin par le library 2JFX. Donc, ces sont locés dans le file d'OSVrapper.cpp Si on retourne dans le plugin de 2JFX vous pouvez voir que ici on explique dans le plugin que le 3RTOS v2 est utilisé. Et en ce cas, ce file d'OSVrapper.cpp va être populé avec 3RTOS calling function. Donc, on peut voir ici que nous avons un OS semaphore ID, un OS message QID c'est une function semaphore qui vient de l'interface de 3RTOS. Includée ici. Si vous ne voulez pas utiliser 3RTOS ou n'importe quoi, vous devez juste dire non OS ou custom, éventuellement. Et en ce cas, vous avez cette fonction, qui est émeute et vous devez populer vous-même. Et le plus important, c'est le GIF frame buffer semaphore. Ce sont les mechanisms de lock quand vous utilisez le chromat accélérateur pour être sûr que le chromat ne va pas éditer le frame buffer pendant qu'il a été display par le controller ATDC. Le autre mécanisme est le signal v-sync et le wait for v-sync. Ce wait for synchronisation est appelé par le library, chaque fois un nouveau frame buffer est prêt à être display. Et le signal v-sync est appelé par notre exemple, nous utilisons ATDC donc il est appelé par l'interrupte ATDC Handler quand à la fin il y a un tout fresh reframe. 60 times par seconde cette function signal v-sync est appelée pour que l'interrupte s'éteigne pendant que le buffer qui est currently display peut être modifié. D'ailleurs, c'est écrit par le controller interne et ne devrait pas être modifié pour ne pas avoir d'artifact sur la main de l'interrupte. Donc, nous pouvons voir la fonction HL C'est l'interrupte de la génération de l'HL et celui-ci, depuis qu'on a installé le controller ATDC dans le project Cubamix celui-ci est automatiquement populé avec l'interrupte ATDC que nous pouvons trouver ici. Donc, nous avons l'interrupte de l'interrupte et vous pouvez voir que le signal v-sync est appelé et nous sommes sûrs que nous sommes dans la dernière ligne de l'interrupte de l'interrupte et donc, avant la prochaine ligne, nous avons un moment d'éteindre l'interrupte. Donc, pour dire que l'oswrapper.cpp est tout le mécanisme de l'interrupte qu'il faut il n'y a pas besoin d'oswpper mais il a besoin de ce type de mécanisme et ce type de mécanisme dans d'autres implementations sont simulés par un interrupte timer donc, il y a un variable que l'on utilise que c'est 0 ou 1 et quand l'interrupte veut s'éteindre en fait, il s'éteint jusqu'à ce variable il s'est dit à 1 et il s'est dit à 1 quand l'interrupte timer s'occupe donc, ça peut être un mécanisme plus fin un mécanisme plus compliqué mais c'est fonctionnel pour le JFX mais au moins je voulais vous vous år nous avons prepared beaucoup d'exempels sur nos kits std mais pour les accessiser vous devez aller au design de TGFX et downloader l'application correspondante. Quand vous créez un nouveau projet dans le design de TGFX, vous vous enduriez dans ce box de dialogues. Et ici vous pouvez sélectionner l'application et ici l'UITemplate. Donc l'application est par défaut de la simulatrice, donc la simulatrice PC. Vous pouvez le changer pour plusieurs de nos bords. Et selon les bords, le display n'est pas dirigé de la même manière. Sur le Bord de Discovery F750, c'est dirigé par le TGFX, par exemple. Sur l'autre bords, il sera dirigé par le host de DSI. Et par exemple, le 769 est une connexion de DSI. Donc vous avez un exemple d'interface de DSI sur le display pour baser votre propre travail. Et c'est le même pour le... Par exemple, si vous utilisez le L496 Discovery Kit, il est connecté par le SPI. Donc si vous créez un projet basé sur cette... Vous choisissez cet application et créez... Vous créez une machine UI. Donc celui-ci est le même côté du display. Et ensuite, vous cliquez sur le créateur. Et ensuite, vous déploiez le code pour cette plateforme. Et ça contient une implementation de la connexion de l'SPI pour un display qui peut être utilisé dans votre cas spécifique. Vous pouvez utiliser cet application pour adapter à votre propre display. Et le dernier, très dernier point, c'est assez important aussi, c'est que parmi tous ces applications, vous pouvez voir qu'il y a des versionnements. Pour ici, par exemple, nous sommes en version 3. Beaucoup d'entre eux sont en version 3. Beaucoup d'entre eux sont aussi en 3.0.1. Mais beaucoup d'entre eux sont aussi en version 1. Donc, qu'est-ce que ça veut dire? La seule version 3 supporte le plugin QBMX. Donc si vous utilisez cet application H747, vous n'aurez pas associé à ça un project QBMX. La principale raison, en fait, est que le plugin TGFX est basé sur une pack de Qubes Expression, une implementation de la pack CMC, qui n'est pas encore supportée pour Dualcore. Donc c'est aussi le cas pour L5, car ce n'est pas Dualcore. Donc vous devez juste s'occuper que seulement la version 3.0.0 et d'au-dessus de ça, va vous donner avec un project QBMX qui est compatible avec le plugin QBMX 5.5, ce qui veut dire que c'est supporté le plugin TGFX Expression. Donc c'est aussi mentionné dans la documentation, mais parfois, vous ne trouvez pas d'information et vous vous inquiétez pourquoi votre version n'est pas fonctionnée, pourquoi l'application template est différente. Donc c'est ça, c'est incroyable. En fait, nous sommes maintenant migrés au début, à la première phase de la Qubes Expression à TGFX, seulement trois boards sont supportés dans la version 3.0.0. Aujourd'hui, vous pouvez voir que presque tous de eux sont supportés et nous étendons le nombre de kits ST Development aussi qui sont supportés comme application template. Ici, nous nous focusions sur l'un que l'on envahit le display et aussi des components LTDC ou des components Chromart. Mais nous nous avons aussi développé l'application template, l'application internal 1 qui n'est pas encore dans cette liste, 4G0, par exemple. Donc c'est aussi utilisé par l'interface sur une plateforme qui n'a pas absolument pas d'accélérateur graphique mais c'est encore en train de fonctionner parce qu'il y a une certaine implémentation dans le library de TGFX qui permet par exemple de ne pas utiliser une pleine image, une pleine display de buffer, mais seulement quelques lignes. En ce cas, bien sûr, vous êtes limités quand vous êtes éditing votre entière. Mais si vous êtes éditing seulement une partie de ça, c'est un smooth comme sur le bord graphique. Donc tout ça sera découvert par une petite vidéo sur des sujets spécifiques. Mais vous devez m'occuper que cette liste de l'application template est accélérée par le designant de la web donc la liste peut évoluer même sur la même version de la TGFX plugin. Vous n'avez pas besoin d'une nouvelle version de la TGFX designer pour avoir un nouveau template, l'application template. Et parfois, c'est possible que ce soit possible avec l'advance avec l'application template mais ce que vous devez mettre dans un folder spécifique dans la folder de la TGFX et vous devez l'utiliser même sans déployer sur ce web server. C'est tout pour cette liste. J'espère que vous avez aimé et à bientôt.