{"id":4180,"date":"2018-09-11T05:39:13","date_gmt":"2018-09-11T03:39:13","guid":{"rendered":"https:\/\/www.opengis.ch\/?p=4180"},"modified":"2020-04-29T16:05:12","modified_gmt":"2020-04-29T14:05:12","slug":"qgis-speaks-a-lot-of-languages","status":"publish","type":"post","link":"https:\/\/www.opengis.ch\/fr\/2018\/09\/11\/qgis-speaks-a-lot-of-languages\/","title":{"rendered":"QGIS speaks a lot of languages"},"content":{"rendered":"<p><em><strong>QGIS is a real cosmopolitan. Born in Alaska sixteen years ago, it has spread all over the world since. Thanks to its open source mentality, it finds not only in economically strong countries big usergroups. No question, that beside all the developers, there is a bunch of brave translators giving everything to make and keep QGIS multilingual. It&rsquo;s translated in over forty&nbsp;languages &#8211; even to Mandarin Chinese and Esperanto. Not only the application, but also its plugins.<\/strong><\/em><br \/>\n<em><strong>And since the feature-loaded long term release 3.4.0 even the QGS-Projects themselves.&nbsp; Thanks to the friendly support of <a href=\"https:\/\/www.qgis.ch\/en\">QGIS Usergroup Switzerland<\/a> and the <a href=\"https:\/\/www.qgis.ch\/en\/projects\/qgep-waste-water-module\">QGEP Project<\/a>.<\/strong><\/em><\/p>\n<h1>How it comes<\/h1>\n<p>Plugins are often shipped with pre-configured project files. To provide them in the users individual language, you&rsquo;ve been required to translate the project manually in the properties and store it separately. When you needed to change something, you have been coerced to update every single file. This is a big effort and fault-prone. So there appeared the idea to have translation files for each required language, and when the user opens the only one project, it will be translated to his specific language. And that&rsquo;s, what this new functionality does.<\/p>\n<h1>How it&rsquo;s done<\/h1>\n<p>Like QGIS and the plugins, the projects are translated with the Qt translation process. Means, it makes the translation according to a Qt Compiled Translation Source File (.qm file). When the user opens a project, QGIS checks for a .qm file laying in the same folder like the .qgs file, having the same name like the .qgs file and having the language-code as postfix of the users language (the language configured in the QGIS settings).<br \/>\nSo when the user opens a project named \u00ab\u00a0citybees.qgs\u00a0\u00bb that is originally in English, but his QGIS language is German, it checks for a file named \u00ab\u00a0citybees_de.qm\u00a0\u00bb. The project&rsquo;s layer names, field-aliases, container names and much more will be translated to German and the project will be automatically stored as \u00ab\u00a0citybees_de.qgs\u00a0\u00bb. So the user has his German project version and can use and edit it like he wishes. Super easy.<\/p>\n<h1>Start from the beginning<\/h1>\n<p>Swiss people love honey and so they are diligent beekeepers. So, let&rsquo;s assume you want to provide a project about beekeeping in cities to your Swiss customers. Because in Switzerland people talk four different languages, you need to have the project multilingual in German, French and Italian. We skip Romansh, not because it&rsquo;s less important or in the Romansh speaking parts are no cities, but&nbsp;because QGIS does not support Romansh (if you&rsquo;ll propose this one day, you will have my vote).<br \/>\nAnyway. Let&rsquo;s see what you have to do, to deliver the projects with the .qm file for German, French or Italian.<\/p>\n<h2>1. Create the project<\/h2>\n<p>You create your project about beekeeping and store it as \u00ab\u00a0citybees.qgs\u00a0\u00bb. You don&rsquo;t have to care about languages at the moment. You name everything in your language. Assumed it&rsquo;s English, you name the layers \u00ab\u00a0apiary\u00a0\u00bb and \u00ab\u00a0area\u00a0\u00bb and the fields \u00ab\u00a0fid\u00a0\u00bb, \u00ab\u00a0bee-species\u00a0\u00bb, \u00ab\u00a0beekeeper\u00a0\u00bb and so on.<br \/>\nOn changes you will edit always this project and no translated projects.<\/p>\n<h2>2. Generate Ts File<\/h2>\n<p>In the project properties in the section <em><strong>General<\/strong><\/em> there is the part to generate a translation source file. First, you select the source language, to have this information in programs you&rsquo;ll edit the file (like Qt Linguist or Transifex) afterwards. Per default the language of your QGIS is selected here.<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_generate_ts.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4188\" src=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_generate_ts.png?resize=750%2C342&#038;ssl=1\" alt=\"\" width=\"750\" height=\"342\"><\/a><br \/>\nWhen pressing <em><strong>Generate TS File<\/strong><\/em> you will find in your projects folder the new file \u00ab\u00a0citybees.ts\u00a0\u00bb.<br \/>\n<strong><em>But wait a minute, why are we generating a .ts file when we need a .qm file?<\/em><\/strong><br \/>\nThe .ts file is the translation source file and it&rsquo;s the uncompiled .qm file. The .qm file contains compact binary format code Qt can make the translation of programs with, but you and your brave translator cannot read it. So you create a .ts file looking like this:<\/p>\n<pre class=\"lang:default decode:true\">&lt;!DOCTYPE TS&gt;\n&lt;TS sourcelanguage=\"en_US\"&gt;\n &lt;context&gt;\n  &lt;name&gt;project:layers:apiary__offline__1f89f4fd_49da_4eb9_90b3_1f7b5e82840c&lt;\/name&gt;\n  &lt;message&gt;\n   &lt;source&gt;apiary&lt;\/source&gt;\n   &lt;translation type=\"unfinished\"\/&gt;\n  &lt;\/message&gt;\n &lt;\/context&gt;\n &lt;context&gt;\n  &lt;name&gt;project:layers:apiary__offline__1f89f4fd_49da_4eb9_90b3_1f7b5e82840c:fieldaliases&lt;\/name&gt;\n  &lt;message&gt;\n   &lt;source&gt;fid&lt;\/source&gt;\n   &lt;translation type=\"unfinished\"\/&gt;\n  &lt;\/message&gt;\n &lt;\/context&gt;\n &lt;context&gt;\n  &lt;name&gt;project:layers:apiary__offline__1f89f4fd_49da_4eb9_90b3_1f7b5e82840c:fieldaliases&lt;\/name&gt;\n  &lt;message&gt;\n   &lt;source&gt;bee_species&lt;\/source&gt;\n   &lt;translation type=\"unfinished\"\/&gt;\n  &lt;\/message&gt;\n &lt;\/context&gt;\n &lt;context&gt;\n  &lt;name&gt;project:layers:apiary__offline__1f89f4fd_49da_4eb9_90b3_1f7b5e82840c:fieldaliases&lt;\/name&gt;\n  &lt;message&gt;\n   &lt;source&gt;beekeeper&lt;\/source&gt;\n   &lt;translation type=\"unfinished\"\/&gt;\n  &lt;\/message&gt;\n &lt;\/context&gt;\n[...]<\/pre>\n<p>You see it&rsquo;s simple XML code that contains mainly untranslated text in the <code>&lt;source&gt;<\/code> element and empty space for the translated text in the <code>&lt;translation&gt;<\/code> element.<br \/>\nYou could enter your translations directly in this file using the text editor and then build the .qm file with the command <code>lrelease<\/code>, but it&rsquo;s preferable to use tools like <em><strong>Qt Linguist <\/strong><\/em>orweb-based services like<em><strong>&nbsp;Transifex <\/strong><\/em>or<em><strong> Weblate<\/strong><\/em>.<\/p>\n<h2>3. Translate your File in Qt Linguist<\/h2>\n<p>You open <em><strong>Qt Linguist<\/strong><\/em> an you select the target language of the .qm file you want to build in the end. Let&rsquo;s choose German.<br \/>\nThe file opens and you see a list of entries described by the <em><strong>Context<\/strong><\/em>. The context is, where the strings are located in the QGIS project.<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_context-e1536565867989.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4216\" src=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_context-e1536565867989.png?resize=750%2C137&#038;ssl=1\" alt=\"\" width=\"750\" height=\"137\"><\/a><br \/>\nThe string \u00ab\u00a0beekeeper\u00a0\u00bb stays in the context <em><strong>project:layers:apiary_1f7b5e82839c:fieldaliases<\/strong><\/em> and this means it&rsquo;s a <em><strong>field or alias<\/strong><\/em> of the layer <strong><em>apiary_1f7b5e82839c<\/em><\/strong> in the project.<br \/>\nThe translation is done simply over the graphical interface. To confirm your translation you can set the check mark.<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_linguist_translation.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4192\" src=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_linguist_translation.png?resize=750%2C275&#038;ssl=1\" alt=\"\" width=\"750\" height=\"275\"><\/a><\/p>\n<h2>4. Finally build your .qm file<\/h2>\n<p>You compile the translation &#8211; means build a .qm file &#8211; by simply select <em><strong>Release as&#8230;<\/strong><\/em> in the Qt Linguist and store it as \u00ab\u00a0citybees_de.qm\u00a0\u00bb.<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_trans_de.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4195\" src=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_trans_de.png?resize=750%2C360&#038;ssl=1\" alt=\"\" width=\"750\" height=\"360\"><\/a><br \/>\n<em><b>And now your customer will be able to open your project in German&nbsp;\ud83d\ude42<\/b><\/em><\/p>\n<h1>What&rsquo;s translated<\/h1>\n<p>Most of the needed parameters like layer names and fields are translated. There could be still some strings in your use case that are not like for example action titles or labels. But the solution is designed, that it&rsquo;s extendable for more project parameters (see the next chapter). So don&rsquo;t worry if you will find parameters that cannot be translated yet. They possibly will be in the future.<\/p>\n<h2>Translatable strings:<\/h2>\n<ul>\n<li>layer names<\/li>\n<li>layer group names<\/li>\n<li>form attributes like tab titles and group box titles<\/li>\n<li>relation names<\/li>\n<li>field names and aliases<\/li>\n<li>value relations<\/li>\n<\/ul>\n<p><em>With field names and aliases it has a special behavior: while we should not translate the field names&nbsp;itself because they can be used as identification, the aliases are translated only. In case there is no alias in the original project, the translation of the field name&nbsp;would be written as an alias in the translated project. The field name&nbsp;stays the same. So you can just generate and translate without the fear of overwriting field names.<\/em><\/p>\n<h2>Content translation<\/h2>\n<p>There is a possibility to have a translation of the content as well. In particular using the<em><strong> value relation widget<\/strong><\/em>.<br \/>\nLet&rsquo;s assume, you want to have the values in the field <em><strong>bee_species<\/strong><\/em> translated as well. Means the following bee species should be German:<br \/>\n&#8211; European dark bee<br \/>\n&#8211; Carniolan honey bee<br \/>\n&#8211; Buckfast bee<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_values_en.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4183\" src=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_values_en.png?resize=626%2C265&#038;ssl=1\" alt=\"\" width=\"626\" height=\"265\"><\/a><br \/>\nYou can solve this by using the value relation widget. Means you create a non geometrical layer \u00ab\u00a0beespecies\u00a0\u00bb and enter the following values:<\/p>\n<table style=\"width: 100%;\">\n<tbody>\n<tr>\n<th>nomenclatura<\/th>\n<th>name_en<\/th>\n<th>name_de<\/th>\n<th>name_fr<\/th>\n<th>name_it<\/th>\n<\/tr>\n<tr>\n<td>Apis mellifera mellifera<\/td>\n<td>European dark bee<\/td>\n<td>Dunkle Europ\u00e4ische Biene<\/td>\n<td>abeille noire<\/td>\n<td>ape nera<\/td>\n<\/tr>\n<tr>\n<td>Apis mellifera carnica<\/td>\n<td>Carniolan honey bee<\/td>\n<td>K\u00e4rntner Biene<\/td>\n<td>abeille carniolienne<\/td>\n<td>ape carnica<\/td>\n<\/tr>\n<tr>\n<td>Apis mellifera<\/td>\n<td>Buckfast bee<\/td>\n<td>Buckfastbiene<\/td>\n<td>abeille Buckfast<\/td>\n<td>ape Buckfast<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>And configure the field <em><strong>bee_species<\/strong><\/em> of <em><strong>apiary<\/strong><\/em> as <em><strong>value relation<\/strong><strong> widget<\/strong><\/em>:<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_valuerelation.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4185\" src=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_valuerelation.png?resize=664%2C213&#038;ssl=1\" alt=\"\" width=\"664\" height=\"213\"><\/a><\/p>\n<h3>And now comes the magic:<\/h3>\n<p>When you create the .ts file it includes not only the field name <em><strong>bee_<\/strong><\/em><em><strong>species<\/strong><\/em> but also the referenced value <em><strong>name_en<\/strong><\/em>:<\/p>\n<pre class=\"lang:default decode:true \"> &lt;context&gt;\n  &lt;name&gt;project:layers:apiary__offline__1f89f4fd_49da_4eb9_90b3_1f7b5e82840c:fields:bee_species:valuerelationvalue&lt;\/name&gt;\n  &lt;message&gt;\n   &lt;source&gt;name_en&lt;\/source&gt;\n   &lt;translation type=\"unfinished\"\/&gt;\n  &lt;\/message&gt;\n &lt;\/context&gt;<\/pre>\n<p>When you now \u00ab\u00a0translate\u00a0\u00bb the <em><strong>name_en<\/strong><\/em> to <em><strong>name_de<\/strong><\/em> the field is referenced to the German values of the entry:<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_values_de.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4182\" src=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_values_de.png?resize=626%2C265&#038;ssl=1\" alt=\"\" width=\"626\" height=\"265\"><\/a><\/p>\n<h1>Getting technical<\/h1>\n<p>Let&rsquo;s have a quick look into the source code, shall we?<\/p>\n<h2>Generate Ts File<\/h2>\n<p>When you press the<em><strong> Generate Ts File<\/strong><\/em> button in the project properties, in the background happens the following:<br \/>\nFirst QGIS scans for the translatable strings in the currently loaded project and collects everything in a <em><strong>QgsTranslationContext<\/strong><\/em>&nbsp;object. This object contains the filename of the .ts file and all the collected translatable strings.<br \/>\nThe strings are collected by firing a signal called <em><strong>requestForTranslatableObjects<\/strong><\/em> delivering the <em><strong>QgsTranslationContext<\/strong><\/em>. Every object that contains translatable strings connects a slot registering the strings in the received&nbsp;<em><strong>QgsTranslationContext<\/strong><\/em>:<\/p>\n<pre class=\"lang:c++ decode:true\">void registerTranslatableObjects( QgsTranslationContext *translationContext )\n{\n  const QList&lt;QgsLayerTreeLayer *&gt; layers = mRootGroup-&gt;findLayers();\n  for ( const QgsLayerTreeLayer *layer : layers )\n  {\n    translationContext-&gt;registerTranslation( QStringLiteral( \"project:layers:%1\" ).arg( layer-&gt;layerId() ), layer-&gt;name() );\n[...]<\/pre>\n<p>This will be a growing list of strings as new features are added and missing bits are discovered.<\/p>\n<h2>Translate by QTranslator<\/h2>\n<p>The translation is made using the <em><strong>QTranslator<\/strong><\/em>. It&rsquo;s loaded with the .qm file on reading the project and on loading of every single translatable string, it&rsquo;s called to translate:<\/p>\n<pre class=\"lang:default decode:true \">QString layername = mTranslator-&gt;translate( QStringLiteral( \"project:layers:%1\" ).arg( node.namedItem( QStringLiteral( \"id\" ) ).toElement().text() ), node.namedItem( QStringLiteral( \"layername\" ) ).toElement().text(), disambiguation, n );<\/pre>\n<h1>That&rsquo;s it<\/h1>\n<p>I hope you liked reading and if you have questions or inputs, feel free to add a comment.<br \/>\nEnjoy this cosmopolitious feature! \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>QGIS is a real cosmopolitan. Born in Alaska sixteen years ago, it has spread all over the world since. Thanks to its open source mentality, it finds not only in economically strong countries big usergroups. No question, that beside all the developers, there is a bunch of brave translators giving [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":4905,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[31,6,12,15],"tags":[125],"class_list":["post-4180","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cpp","category-gis","category-programming","category-qgis","tag-qgis-org"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2018\/09\/trans_linguist_translation-2.png?fit=975%2C358&ssl=1","jetpack-related-posts":[{"id":5494,"url":"https:\/\/www.opengis.ch\/fr\/2019\/04\/09\/plugin-for-tracking-qgis-project-files-in-git\/","url_meta":{"origin":4180,"position":0},"title":"Plugin for tracking QGIS project files in git","author":"Matthias Kuhn","date":"9 avril 2019","format":false,"excerpt":"We often have QGIS project files that are part of a customer project. To be able to manage versions of these project files or have multiple people working on it, they are managed inside a git repository. This is however not easy, because with every save of a project file,\u2026","rel":"","context":"Dans &quot;QGIS&quot;","block_context":{"text":"QGIS","link":"https:\/\/www.opengis.ch\/fr\/category\/gis\/qgis\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2019\/04\/image-1.png?fit=1200%2C760&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2019\/04\/image-1.png?fit=1200%2C760&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2019\/04\/image-1.png?fit=1200%2C760&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2019\/04\/image-1.png?fit=1200%2C760&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2019\/04\/image-1.png?fit=1200%2C760&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":15627,"url":"https:\/\/www.opengis.ch\/fr\/2025\/06\/02\/xlsform-converter-unlock-a-world-of-surveys-with-our-brand-new-qgis-plugin\/","url_meta":{"origin":4180,"position":1},"title":"XLSForm Converter: unlock a world of surveys with our brand new QGIS plugin","author":"Mathieu","date":"2 juin 2025","format":false,"excerpt":"Easily bring your XLSForm surveys into the QGIS and QField ecosystem. The plugin converts spreadsheets into fully prepared QGIS projects\u2014with media support, automatic form configuration, and one-click upload to QFieldCloud. Migrating to QField was never easier!","rel":"","context":"Dans &quot;Processing&quot;","block_context":{"text":"Processing","link":"https:\/\/www.opengis.ch\/fr\/category\/gis\/qgis\/processing\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2025\/05\/xlsformconverter-qgis-qfield.webp?fit=1098%2C859&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2025\/05\/xlsformconverter-qgis-qfield.webp?fit=1098%2C859&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2025\/05\/xlsformconverter-qgis-qfield.webp?fit=1098%2C859&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2025\/05\/xlsformconverter-qgis-qfield.webp?fit=1098%2C859&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2025\/05\/xlsformconverter-qgis-qfield.webp?fit=1098%2C859&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":15740,"url":"https:\/\/www.opengis.ch\/2025\/06\/20\/opengis-ch-at-the-qgis-ch-user-meeting-2025-in-bern\/","url_meta":{"origin":4180,"position":2},"title":"OPENGIS.ch at the QGIS.ch User Meeting 2025 in Bern","author":"Marco Bernasocchi","date":"20 juin 2025","format":false,"excerpt":"OPENGIS.ch played a key role at the 2025 QGIS.ch User Meeting in Bern, contributing talks, a multilingual QField workshop, and showcasing our tools across multiple presentations \u2014 including our partnership in the QGIS Security Project and advancements in TEKSI and ModelBaker.","rel":"","context":"Dans &quot;Events&quot;","block_context":{"text":"Events","link":"https:\/\/www.opengis.ch\/fr\/category\/events\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2025\/06\/20250617_153244.jpg?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2025\/06\/20250617_153244.jpg?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2025\/06\/20250617_153244.jpg?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2025\/06\/20250617_153244.jpg?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2025\/06\/20250617_153244.jpg?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":2127,"url":"https:\/\/www.opengis.ch\/fr\/2016\/09\/19\/qgis2-compatibility-plugin\/","url_meta":{"origin":4180,"position":3},"title":"QGIS2 compatibility plugin","author":"Marco Bernasocchi","date":"19 septembre 2016","format":false,"excerpt":"Lately I've been spending time porting a bigger plugin from QGIS 2.8 to 3 while maintaining 2.8 compatibility. You can find it at https:\/\/github.com\/opengisch\/qgis2compat\/ and https:\/\/plugins.qgis.org\/plugins\/qgis2compat\/ One code to rule them all. My target was to have to edit the source code as little as possible to simulate a lazy\u2026","rel":"","context":"Dans &quot;PyQt&quot;","block_context":{"text":"PyQt","link":"https:\/\/www.opengis.ch\/fr\/category\/programming\/python\/pyqt\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":14623,"url":"https:\/\/www.opengis.ch\/fr\/2024\/06\/25\/swiss-locator-plugin-3-0-is-here-with-exciting-features\/","url_meta":{"origin":4180,"position":4},"title":"QGIS Swiss Locator 3.0 brings elevation profiles and vector tiles","author":"Germ\u00e1n Carrillo","date":"25 juin 2024","format":false,"excerpt":"Swiss Locator 3.0 for #QGIS is here! Access high-precision elevation profiles from Swisstopo's swissALTI3D data and integrate vector tiles easily. \ud83c\udf0d\ud83d\uddfa\ufe0f #SwissGIS #Swisstopo #SwissLocator","rel":"","context":"Dans &quot;3D&quot;","block_context":{"text":"3D","link":"https:\/\/www.opengis.ch\/fr\/category\/3d\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2024\/06\/swiss_locator_profile.jpg?fit=1200%2C871&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2024\/06\/swiss_locator_profile.jpg?fit=1200%2C871&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2024\/06\/swiss_locator_profile.jpg?fit=1200%2C871&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2024\/06\/swiss_locator_profile.jpg?fit=1200%2C871&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2024\/06\/swiss_locator_profile.jpg?fit=1200%2C871&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":1867,"url":"https:\/\/www.opengis.ch\/fr\/2015\/11\/02\/qgis-crowdfunding-2-5d-rendering\/","url_meta":{"origin":4180,"position":5},"title":"QGIS Crowdfunding: 2.5D Rendering","author":"Matthias Kuhn","date":"2 novembre 2015","format":false,"excerpt":"","rel":"","context":"Dans &quot;3D&quot;","block_context":{"text":"3D","link":"https:\/\/www.opengis.ch\/fr\/category\/3d\/"},"img":{"alt_text":"2.5D rendering","src":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2015\/10\/title.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2015\/10\/title.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2015\/10\/title.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2015\/10\/title.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_shortlink":"https:\/\/wp.me\/pbdBtI-15q","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/posts\/4180","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/comments?post=4180"}],"version-history":[{"count":1,"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/posts\/4180\/revisions"}],"predecessor-version":[{"id":4906,"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/posts\/4180\/revisions\/4906"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/media\/4905"}],"wp:attachment":[{"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/media?parent=4180"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/categories?post=4180"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.opengis.ch\/fr\/wp-json\/wp\/v2\/tags?post=4180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}