<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Denis Augsburger</title>
    <description>The latest articles on DEV Community by Denis Augsburger (@denisaugsburger).</description>
    <link>https://dev.to/denisaugsburger</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F201984%2Feb3dcd06-82a2-4591-bd09-c961e8cc84ba.jpg</url>
      <title>DEV Community: Denis Augsburger</title>
      <link>https://dev.to/denisaugsburger</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/denisaugsburger"/>
    <language>en</language>
    <item>
      <title>Multilingual Markdown Documentations and Posts in Seconds</title>
      <dc:creator>Denis Augsburger</dc:creator>
      <pubDate>Wed, 05 May 2021 09:30:56 +0000</pubDate>
      <link>https://dev.to/denisaugsburger/multilingual-markdown-documentations-and-posts-in-seconds-4d3e</link>
      <guid>https://dev.to/denisaugsburger/multilingual-markdown-documentations-and-posts-in-seconds-4d3e</guid>
      <description>&lt;p&gt;The translation of Markdown files is commonly needed in technical documentations and headless content management systems, where you want to reach a target audience that speaks different languages. I'm gonna show you how you can translate Markdown easy and fast without compromising on quality. If you'd like to get a head start and try out the Markdown Translator just &lt;a href="https://simpleen.io/signup"&gt;sign up&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Markdown Translation Tool
&lt;/h2&gt;

&lt;p&gt;More and more tools use Markdown to structure their content. Some examples are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docusaurus, Gitbook for documentations&lt;/li&gt;
&lt;li&gt;Hugo, Jekyll, GatsbyJS as static site generators (SSG)&lt;/li&gt;
&lt;li&gt;Contentful, Strapi, SquareSpace as content management systems (CMS) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depending on the project, it is necessary to generate multilingual content and update it regularly. The traditional translation process can be time-consuming and waiting on (human) translations can block your release cycles. Therefore we were looking for a fast and reliable solution. &lt;/p&gt;

&lt;h3&gt;
  
  
  Common Challenges
&lt;/h3&gt;

&lt;p&gt;We've tried out several translation tools and inserted Markdown but we were not satisfied with the translation results they provided.&lt;br&gt;
Common problems we encountered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Broken Markdown Syntax&lt;/li&gt;
&lt;li&gt;Translation of things that should not be translated, like Code Snippets, Emoji's&lt;/li&gt;
&lt;li&gt;Different styles in translation results&lt;/li&gt;
&lt;li&gt;Setup/Installion necessary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's take a look at how a simple Markdown file is translated from English to German if you use it directly in DeepL or Google Translate and compare it to the Simpleen Markdown Translator &lt;/p&gt;

&lt;p&gt;The file contains a list, some emoji's and headers. Dev.to doesn't support fenced code within their blog posts, therefore the tripple ticks are substituted by html code tags.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Setup&lt;/span&gt;

Install the CLI to &lt;span class="gs"&gt;**translate**&lt;/span&gt; files from source to target path.

&lt;span class="nt"&gt;&amp;lt;code&lt;/span&gt; &lt;span class="na"&gt;language=&lt;/span&gt;&lt;span class="s"&gt;"shell"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
yarn add simpleen
yarn run simpleen init
&lt;span class="nt"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;

You can search for files in &lt;span class="sb"&gt;`./blog/posts/en/*.md`&lt;/span&gt; and translate them to &lt;span class="sb"&gt;`./blog/posts/$locale/$FILE.md`&lt;/span&gt;.

&lt;span class="gu"&gt;## Additional support :smile:&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; PO-Files
&lt;span class="p"&gt;-&lt;/span&gt; JSON
&lt;span class="p"&gt;-&lt;/span&gt; YAML

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DeepL Markdown Example
&lt;/h3&gt;

&lt;p&gt;With DeepL the result looks like the following.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Einrichtung&lt;/span&gt;

Installieren Sie die CLI zum &lt;span class="gs"&gt;**Übersetzen**&lt;/span&gt; von Dateien vom Quell- in den Zielpfad.

&lt;span class="nt"&gt;&amp;lt;code&lt;/span&gt; &lt;span class="na"&gt;language=&lt;/span&gt;&lt;span class="s"&gt;"Shell"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
yarn add simpleen
yarn run simpleen init
&lt;span class="nt"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;

Sie können nach Dateien in &lt;span class="sb"&gt;`./blog/posts/de/*.md`&lt;/span&gt; suchen und sie in &lt;span class="sb"&gt;`./blog/posts/$locale/$FILE.md`&lt;/span&gt; übersetzen.

&lt;span class="gu"&gt;## Zusätzliche Unterstützung :smile:&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; PO-Dateien
&lt;span class="p"&gt;-&lt;/span&gt; JSON
&lt;span class="p"&gt;-&lt;/span&gt; YAML

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;As you can see the code snippet is broken because the fenced code block now starts with two backticks instead of three. Also, the name of the language Shell is now upper-cased. The list, the emoji and the paths are handled correctly in this simple case. The bold text is also marked correctly. &lt;/p&gt;

&lt;h3&gt;
  
  
  Google Translate Markdown Example
&lt;/h3&gt;

&lt;p&gt;Let's compare this with Google Translate:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Einrichten&lt;/span&gt;

Installieren Sie die CLI, um Dateien von der Quelle in den Zielpfad zu übersetzen.

&lt;span class="nt"&gt;&amp;lt;brokencode&lt;/span&gt; &lt;span class="na"&gt;language=&lt;/span&gt;&lt;span class="s"&gt;"shell"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
Garn hinzufügen einfach
Garn laufen einfach init
&lt;span class="nt"&gt;&amp;lt;/brokencode&amp;gt;&lt;/span&gt;

Sie können nach Dateien in "./blog/posts/en / &lt;span class="err"&gt;*&lt;/span&gt;. Md" suchen und diese in ". / Blog / posts / $ locale / $ FILE.md" übersetzen.

&lt;span class="gu"&gt;## Zusätzliche Unterstützung: smile:&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; PO-Dateien
&lt;span class="p"&gt;-&lt;/span&gt; JSON
&lt;span class="p"&gt;-&lt;/span&gt; YAML

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The result with Google Translate is worse than DeepL. The code snippet is broken because the backticks of the code snippet are seperated with a space. Also, the content is translated with is not desirable. The paths are splitted and differently marked. The Emoji is also broken. &lt;/p&gt;

&lt;h3&gt;
  
  
  Simpleen Markdown Translator
&lt;/h3&gt;

&lt;p&gt;Let's see how Simpleen handles this Markdown example in comparison to DeepL and Google Translate (in this case with DeepL).&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Einrichtung&lt;/span&gt;

Installieren Sie die CLI, um Dateien vom Quell- in den Zielpfad &lt;span class="gs"&gt;**zu übersetzen**&lt;/span&gt;.

&lt;span class="nt"&gt;&amp;lt;code&lt;/span&gt; &lt;span class="na"&gt;language=&lt;/span&gt;&lt;span class="s"&gt;"shell"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
yarn add simpleen
yarn run simpleen init
&lt;span class="nt"&gt;&amp;lt;/code&lt;/span&gt; &lt;span class="err"&gt;language="shell"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

Sie können nach Dateien in &lt;span class="sb"&gt;`./blog/posts/de/*.md`&lt;/span&gt; suchen und sie in &lt;span class="sb"&gt;`./blog/posts/$locale/$FILE.md`&lt;/span&gt; übersetzen.

&lt;span class="gu"&gt;## Zusätzliche Unterstützung :smile:&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; PO-Dateien
&lt;span class="p"&gt;-&lt;/span&gt; JSON
&lt;span class="p"&gt;-&lt;/span&gt; YAML

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Because we love Markdown we wanted to deliver better and more consistent results with an online translator that let's you translate Markdown into many languages. &lt;/p&gt;

&lt;p&gt;Simpleen provides better results because we handle Markdown differently than other services. Instead of just handling Markdown as Text or convert it to HTML, which is supported by most MT services, we go deeper to understand the whole document structure of your Markdown files. &lt;/p&gt;

&lt;p&gt;Furthermore, Simpleen understands the most common Markdown extensions and flavors and applies the provided styles from your file to the translation result. For example, if you use two spaces at the end of a line to break a line, we also use two spaces in the translated result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported Flavors &amp;amp; Extensions
&lt;/h2&gt;

&lt;p&gt;Markdown comes in different flavors, and therefore supports different syntax to write your documentations, blog posts and more.&lt;br&gt;
The most common flavors that are used and supported for translations by Simpleen are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CommonMark&lt;/li&gt;
&lt;li&gt;GFM &lt;a href="https://github.github.com/gfm/"&gt;Github Flavor Markdown&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;with the following extensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emoji's (😄 or 👍)&lt;/li&gt;
&lt;li&gt;Footnotes (partial)&lt;/li&gt;
&lt;li&gt;Frontmatter&lt;/li&gt;
&lt;li&gt;Math&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://commonmark.org/"&gt;CommonMark&lt;/a&gt; is a Markdown flavor that many frameworks and libraries support or build upon, for example &lt;a href="https://www.gatsbyjs.com/plugins/gatsby-transformer-remark/"&gt;GatsbyJS&lt;/a&gt; with their remark transformer. Also many headless content management system do support CommonMark.&lt;/p&gt;
&lt;h3&gt;
  
  
  Better Style Support
&lt;/h3&gt;

&lt;p&gt;There are different valid ways to mark your headers, bold text, lists and more. Simpleen detects your style and reproduces the translated&lt;br&gt;
Markdown file in a consistent way. For example if you use a dash for your lists&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;My shopping list:
&lt;span class="p"&gt;
-&lt;/span&gt; Dictionary
&lt;span class="p"&gt;-&lt;/span&gt; Paper
&lt;span class="p"&gt;-&lt;/span&gt; Pencil
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then this Markdown example is translated to German like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Meine Einkaufsliste:
&lt;span class="p"&gt;
-&lt;/span&gt; Wörterbuch
&lt;span class="p"&gt;-&lt;/span&gt; Papier
&lt;span class="p"&gt;-&lt;/span&gt; Bleistift
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or if you use a star for your list instead it's getting translated to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Meine Einkaufsliste:
&lt;span class="p"&gt;
*&lt;/span&gt; Wörterbuch
&lt;span class="p"&gt;*&lt;/span&gt; Papier
&lt;span class="p"&gt;*&lt;/span&gt; Bleistift
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both results are valid in most Markdown flavors, but we want to consistently apply the styles from the provided Markdown file.&lt;br&gt;
As a result you can use the translated Markdown file directly in your Markdown documentation tool. Furthermore, the editor or human translator is not getting confused by different styles in case of post-editing. &lt;/p&gt;

&lt;h2&gt;
  
  
  Translate .md/.mdx Files
&lt;/h2&gt;

&lt;p&gt;A Markdown file contains multiple parts that need to be localized. Other parts - like code segments and frontmatter fragments (meta data) - need to be excluded from translation.&lt;/p&gt;

&lt;p&gt;Not translated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code Fences &lt;/li&gt;
&lt;li&gt;Emoji's&lt;/li&gt;
&lt;li&gt;Frontmatter&lt;/li&gt;
&lt;li&gt;Math Expressions&lt;/li&gt;
&lt;li&gt;MDX (not yet supported, drop us a line if you like to use it)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Translated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Headers (atx, setext)&lt;/li&gt;
&lt;li&gt;Paragraphs with bold, italic styles, links, images&lt;/li&gt;
&lt;li&gt;List Items&lt;/li&gt;
&lt;li&gt;Table Headers&lt;/li&gt;
&lt;li&gt;Table Entries&lt;/li&gt;
&lt;li&gt;ToDo List Entries&lt;/li&gt;
&lt;li&gt;Footnotes (partial, #fn-1 instead of ^1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have plans to improve the Markdown translation tool even more. Quick Roadmap: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We want to handle internal links correctly (adapt to translated result)&lt;/li&gt;
&lt;li&gt;Handle footnote links&lt;/li&gt;
&lt;li&gt;Adapt the Simpleen CLI to support Markdown files in your local project&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>markdown</category>
      <category>tooling</category>
      <category>localization</category>
      <category>internationalization</category>
    </item>
    <item>
      <title>Online JSON Machine Translator: The Fastest Way to Localize</title>
      <dc:creator>Denis Augsburger</dc:creator>
      <pubDate>Fri, 26 Jun 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/denisaugsburger/translate-json-with-deepl-2bim</link>
      <guid>https://dev.to/denisaugsburger/translate-json-with-deepl-2bim</guid>
      <description>&lt;p&gt;The translation of JSON is commonly used for software localization and the translation of data. In this blog post we will check out an easy and fast way to translate locales as well as JSON data. We will cover different aspects that are relevant for these use cases. If you like to get a head start just &lt;a href="https://simpleen.io/signup"&gt;sign up&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Online JSON Translator
&lt;/h2&gt;

&lt;p&gt;The Simpleen online translator supports JSON (and other common formats like YAML) with variable/interpolation handling. You can translate from and to 12 &lt;a href="https://www.deepl.com/docs-api/translating-text/request/"&gt;languages which are supported by DeepL&lt;/a&gt; like Spanish, English, French or Portuguese. Just copy/paste your locale files or JSON data and insert it in the translator. After a few seconds you can copy the translated result.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration of Translator
&lt;/h3&gt;

&lt;p&gt;Basically you configure a translator with a Format like JSON, a source- and target language and the corresponding interpolation for localization. Additional translation options are the formality to get more or less formal results. This is very useful if you translate from english to other languages because in &lt;a href="https://elt.oup.com/elt/students/result/pdf/brupp_formality.pdf"&gt;english the formality&lt;/a&gt; cannot always be determined.&lt;br&gt;
For the translation of JSON data you can add selections to partially translate your structure and exclude others from getting translated. &lt;br&gt;
The configuration is saved in your account and can be reused easily. &lt;/p&gt;
&lt;h3&gt;
  
  
  Adapt Translations With Custom Glossary
&lt;/h3&gt;

&lt;p&gt;With your glossary you can define words that should be excluded from getting translated. This is really useful for brands and product names. You can also define some words that should always be translated to specific words. Depending on how you use your glossary they can be target language specific or generally used for multiple configurations.&lt;/p&gt;
&lt;h3&gt;
  
  
  Limits of the Online Translator
&lt;/h3&gt;

&lt;p&gt;The Online Translator is a good starting point to try out Simpleen. You don’t have any vendor lock-in or an additional dependency in your project. But there are limits for this approach. Especially for a continuous localization process, where you also adapt your translations and handle multiple versions we recommend to use the CLI. Also if you have many JSON files that you want to get translated.&lt;/p&gt;
&lt;h2&gt;
  
  
  Continuous Translations With the CLI
&lt;/h2&gt;
&lt;h3&gt;
  
  
  When to Use the CLI
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://www.npmjs.com/package/simpleen"&gt;Simpleen CLI&lt;/a&gt; brings machine translations into your development workflow. You create your multilingual app/game and can enjoy the results in other languages while developing. This is the fastest way to check and improve your app for a multilingual audience. It's a suitable approach for quality assurance during internationalization (i18n). It's also an alternative approach to pseudo localization.  &lt;/p&gt;
&lt;h3&gt;
  
  
  Lock Translations
&lt;/h3&gt;

&lt;p&gt;The translation results will evolve over time. Therefore, adapted translations should not be overwritten once you adapted the localization result. To handle this situation, the CLI can create a lock file which should be put under version control. After a manual change or a merge from your translation management system, simply run &lt;code&gt;simpleen lock&lt;/code&gt;. It considers the source translation file, so that keys can be reused in larger projects.&lt;/p&gt;
&lt;h2&gt;
  
  
  Translate JSON to Localize
&lt;/h2&gt;

&lt;p&gt;A variety of i18n libraries use JSON locales by default to support localizing your app into multiple languages. Depending on the library they use flat (i.e. &lt;a href="https://formatjs.io/docs/getting-started/message-distribution/"&gt;react intl&lt;/a&gt;) or nested JSON structures (i.e. &lt;a href="https://www.i18next.com/misc/json-format"&gt;i18next&lt;/a&gt;). These can be stored in multiple files or extracted into a single one. If you want to localize your software, game or app you will need to translate your locale files into your desired language. &lt;/p&gt;
&lt;h3&gt;
  
  
  Variables (Interpolation)
&lt;/h3&gt;

&lt;p&gt;You probably want to insert some data into your translation text. These variables are specifically marked and replaced with data later on. Here is a list of common JSON based i18n libraries with their default interpolations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Variable Interpolation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Angular ngx-translate, react intl, vue i18n&lt;/td&gt;
&lt;td&gt;{ variable }&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i18next, Transloco&lt;/td&gt;
&lt;td&gt; {{ variable }} &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Polyglot.js&lt;/td&gt;
&lt;td&gt; %{ variable } &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The translation of such interpolation variables would break the implementation at runtime. Therefore they need to be handled carefully and not to be translated by mistake. For example the sentence: &lt;code&gt;There are {{count}} similar recipes&lt;/code&gt;{lang=en} becomes to &lt;code&gt;似た {{count}} ようなレシピがあります。&lt;/code&gt;{lang=ja}.&lt;/p&gt;
&lt;h3&gt;
  
  
  Additional Formats in JSON Locales
&lt;/h3&gt;

&lt;p&gt;To correctly translate JSON locales you can handle embedded formats as well. Some common ones of i18n libraries are HTML and Markdown inside the translation text. You can highlight certain words/phrases or use some links directly in your translations. You don’t want to break your formatted strings while translating, otherwise your app shows some markup in your text (i.e. some **) or the whole phrase gets bold. &lt;/p&gt;
&lt;h3&gt;
  
  
  Multilingual Software
&lt;/h3&gt;

&lt;p&gt;Multilingual apps need more attention on formats, i.e. currencies, number formats or date formats. Try to imagine which languages you want to support. Depending on the selection of the language pluralization rules or text floating (right to left) can become more challenging. With the translation of your application as early as possible you will be able to determine implementation problems and solve them. &lt;/p&gt;
&lt;h2&gt;
  
  
  Translation of JSON Data
&lt;/h2&gt;

&lt;p&gt;JSON is also a common data format outside of software localization. The JSON structure consists of more information that should not be altered, i.e. some ids, a creation date or an author name. With Simpleen you can selectively translate your JSON data.&lt;br&gt;
For example, let's take the following recipe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"World's Best Lasagna"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="s2"&gt;"Heat up the oven"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
     &lt;/span&gt;&lt;span class="s2"&gt;"Cut the onions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
     &lt;/span&gt;&lt;span class="s2"&gt;"Cook the ground beef, onions, and garlic over medium heat until well browned"&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;p class=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;info&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;One of my most favorite dishes&amp;lt;/p&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"ingredients"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2 pcs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"onions"&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1 tbsp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"salt"&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"published"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-07-19"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@denisaugsburger"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When translating this kind of data, we may only want to translate parts of the provided recipe. &lt;/p&gt;

&lt;h3&gt;
  
  
  Keep Your Structure
&lt;/h3&gt;

&lt;p&gt;To do this, we want to keep our existing structure as well as not corrupt any data in it. Also, our styles and data structure in HTML need to stay intact. &lt;/p&gt;

&lt;p&gt;Keys should not be translated otherwise your code doesn't work anymore. Some values should stay as is, i.e. the amount of the ingredient, because it is handled by a special conversion function. The same applies to the published date which is handled by localization afterwards.&lt;/p&gt;

&lt;p&gt;Also, some of the included formats like HTML or Markdown should be translated without losing their formatting.&lt;br&gt;
Simpleen makes it easy to selectively translate some content in your JSON structure. Just define your selections and formats in your Simpleen translator.&lt;/p&gt;
&lt;h3&gt;
  
  
  Implement the Recipe Example
&lt;/h3&gt;

&lt;p&gt;So let’s see how this works with the example from above and translate our recipe into Japanese.&lt;/p&gt;

&lt;p&gt;First: &lt;a href="https://simpleen.io/signup"&gt;Create a Simpleen Account&lt;/a&gt; and configure your Translator. Your selections for the example above could be as follows:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;title&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;instructions[*]&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;notes&lt;/td&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ingredients[*].name&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Your created translators can be used independently with their ID. They are configured with your expected format, selections, languages as well as a glossary.&lt;/p&gt;

&lt;p&gt;Second you can use your translator to translate (some of) your JSON data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Post-Request to use your translator for translations */&lt;/span&gt;
&lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.simpleen.io/translators/{ID}/translate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// You can select which part of the JSON should be translated via selections&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;recipe&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; 
&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;auth_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{YOUR_API_AUTHENTICATION_TOKEN}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our result with a configured target language of Japanese looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"世界一おいしいラザニア"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"オーブンを温める"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"玉ねぎを切る"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"牛ひき肉、玉ねぎ、にんにくを中火でよく焦げ目がつくまで煮る。"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;p class=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;info&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;一番好きな食べ物の一つ&amp;lt;/p&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ingredients"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2 pcs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"玉ねぎ"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1 tbspn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"塩"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"published"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-07-19"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@denisaugsburger"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  DeepL for Better Translation Results
&lt;/h2&gt;

&lt;p&gt;Currently we support the translation with DeepL, which results in better translation results in comparison to Google Translate. Unfortunately DeepL currently support a dozen languages with some varieties like brazilian portuguese or british english. Google translate supports much more languages but with less accuracy. Therefore we have decided to build Simpleen with DeepL in the background but we will consider more options in the future. &lt;/p&gt;

&lt;h2&gt;
  
  
  Start JSON Translating
&lt;/h2&gt;

&lt;p&gt;You can start now localizing &amp;amp; translating by &lt;a href="https://simpleen.io/signup"&gt;creating a Simpleen account&lt;/a&gt;. If you have any questions you can reach out to me via &lt;a href="https://twitter.com/denisaugsburger"&gt;Twitter&lt;/a&gt; or &lt;a href="//mailto:info@simpleen.io"&gt;Mail&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>translation</category>
      <category>json</category>
      <category>localization</category>
      <category>internationalization</category>
    </item>
    <item>
      <title>Combine Apollo Tooling and Gatsby for Type Safety</title>
      <dc:creator>Denis Augsburger</dc:creator>
      <pubDate>Wed, 24 Jul 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/denisaugsburger/combine-apollo-tooling-and-gatsby-for-type-safety-3bpm</link>
      <guid>https://dev.to/denisaugsburger/combine-apollo-tooling-and-gatsby-for-type-safety-3bpm</guid>
      <description>&lt;p&gt;Apollo Tooling is a command line tool for generating static types from a GraphQL backend. In combination with GatsbyJS it can be used to generate TypeScript definitions and validate the queries. To support a faster, safer and more reliable way to write these queries I highly recommend using the Apollo VSCode Plugin. It highlights your graphql queries and provides you with a useful autocomplete. &lt;/p&gt;

&lt;h2&gt;
  
  
  Download schema and install VSCode Plugin
&lt;/h2&gt;

&lt;p&gt;The CLI looks for a config file and additionallly provided command line flags. It is possible to use different config files for specific tasks. First we want to download the schema, therefore you Start your gatsby project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gatsby developer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create your config as apollo.config.download.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = { 
  client: {    
    service: {      
      name: "gatsby-schema",
      url: "http://localhost:8000/___graphql"
    },
    tagName: "graphql"  
  }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Download your schema to schema.json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apollo service:download -c apollo.config.download.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Apollo GraphQL VSCode Plugin
&lt;/h3&gt;

&lt;p&gt;Install the plugin&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ext install apollographql.vscode-apollo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next you create your apollo.config.js file. This one is used for code generation as well as the VSCode plugin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = {
  client: {    
    addTypename: false,
    includes: [
      "./src/**/*.tsx",
      "./src/**/*.ts",
      "./node_modules/gatsby-transformer-sharp/src/fragments.js",
      "./node_modules/gatsby-source-contentful/src/fragments.js"
    ],    
    service: {      
      name: "gatsby-schema",
      localSchemaFile: "./schema.json"
    },
    tagName: "graphql"
  }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GatsbyJS uses graphql as their default tag name for their queries while apollo uses gql as their default. This gives us the possibility to also use it with apollo client. Some GatsbyJS Plugins provide some global GraphQL fragments, which are used but not referenced in your queries. Therefore you need to include them in your apollo.config.js, otherwise you will get errors like &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Unknown fragment “GatsbyImageSharpFixed”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now we can enjoy the autocomplete and syntax highlighting of the apollo vscode plugin as you can see in the animated gif below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Ftb3nth97hxik%2F2SFQeDFZLWGuNazwcW8gex%2F47c9b7f403a2d1a0d6b22407e6caba3c%2FPreviewAutocomplete.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Ftb3nth97hxik%2F2SFQeDFZLWGuNazwcW8gex%2F47c9b7f403a2d1a0d6b22407e6caba3c%2FPreviewAutocomplete.gif" alt="Apollo VS Code Plugin preview Gatsby Query"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate TypeScript Definitions from your queries
&lt;/h2&gt;

&lt;p&gt;As a final step you combine the provided schema information and your GatsbyJS queries to create client side type definitions for TypeScript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;apollo client:codegen -c apollo.config.json --target typescript __generated__&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A new subdirectory will be created for each page and component with a GraphQL query - it is named __generated__. From there you can import your TypeScript definitions.  &lt;strong&gt;Tip:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type PageProps&amp;lt;TData&amp;gt; = {
 data: TData;
} &amp;amp; MatchRenderProps&amp;lt;{}&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For your pages you can create a reusable type with a generic that can be extended for cross cutting concerns. Then you can use it as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type BlogProps = PageProps&amp;lt;BlogPageQuery&amp;gt;
export const MyPage: React.FC&amp;lt;BlogProps&amp;gt; = ({data}) =&amp;gt; {
    return ()
}
export const pageQuery = graphql`
  query BlogPageQuery {
    contentfulImages(name: { eq: “testImage” }) {
      id
      description   
    }
  }
`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your components you can also use the generic version directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const data = useStaticQuery&amp;lt;TestPageQuery&amp;gt;(
  graphql`
    query TestPageQuery {
      contentfulImages(name: { eq: "testImage" }) {
        id
        description
        name
        fluid(maxWidth: 1000) {
          ...GatsbyContentfulFluid
        }
      }
    }
  `
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Ftb3nth97hxik%2F1aSh6NQaxHDZIZ2RSvl4uB%2F63f55875cf358c81361ac7bb23799258%2FPreviewCodeGeneration.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Ftb3nth97hxik%2F1aSh6NQaxHDZIZ2RSvl4uB%2F63f55875cf358c81361ac7bb23799258%2FPreviewCodeGeneration.gif" alt="Type Safe GatsbyJS project with apollo code generation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Current limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In some cases we experienced that the schema.json file is not correctly reloaded into the Apollo VS Code Plugin after some changes. Therefore a restart of VS Code is necessary&lt;/li&gt;
&lt;li&gt;The null checks can be extensive, so better introduce some helper function to get the related data&lt;/li&gt;
&lt;li&gt;With strict null checks you can't use the contentful images in gatsby images because of the different handling of null and undefined&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gatsbyjs</category>
      <category>typescript</category>
      <category>apollocodegenerator</category>
    </item>
  </channel>
</rss>
