<?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: Nathan</title>
    <description>The latest articles on DEV Community by Nathan (@nathantaal).</description>
    <link>https://dev.to/nathantaal</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F197999%2F7b549c6f-6992-4ce9-814a-99343276dc80.png</url>
      <title>DEV Community: Nathan</title>
      <link>https://dev.to/nathantaal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nathantaal"/>
    <language>en</language>
    <item>
      <title>One translation API, three reactive frameworks: signals_translator hits 1.0</title>
      <dc:creator>Nathan</dc:creator>
      <pubDate>Wed, 21 Oct 2026 09:03:35 +0000</pubDate>
      <link>https://dev.to/nathantaal/one-translation-api-three-reactive-frameworks-signalstranslator-hits-10-44lm</link>
      <guid>https://dev.to/nathantaal/one-translation-api-three-reactive-frameworks-signalstranslator-hits-10-44lm</guid>
      <description>&lt;p&gt;&lt;em&gt;JSON translations with ICU plurals that update through signals. Signals, alien_signals or solidart: one API for all three.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;signals_translator 1.0 is out. It's a small, JSON based i18n library for Flutter where every translated string is a signal. Change the language and only the widgets that read a translation rebuild. Nothing else.&lt;/p&gt;

&lt;p&gt;It started as me scratching my own itch. I used easy_localization before, and it's a great package, but two things bothered me. First, it made my whole app re-render on a locale change. Second, it was yet another wrapper. At that point my app was wrapped in AdaptiveTheme, then MaterialApp, then EasyLocalization, and the widgets inside still needed a Watch to react to my signals. I disliked that every plugin that needed injecting could only get there by adding yet another wrapper. I also no longer knew which order they were supposed to go in.&lt;/p&gt;

&lt;p&gt;I'm a signals enthusiast, so I wanted translations to behave like the rest of my state: fine grained and reactive, with no extra wrapper. signals_translator adds nothing to your widget tree. It only uses the SignalBuilder (formerly Watch) you already have.&lt;/p&gt;

&lt;p&gt;After using signals in several applications, and copying the logic between projects, I decided to publish a plugin that I could use myself, so I would have to maintain less code. Over the months, the project matured (although it's still pretty basic). After adding ICU instead of my self-invented conventions, I released 0.1.0 just last week.&lt;/p&gt;

&lt;p&gt;When I dug into state management for Flutter again, I realized there are more packages using the signal mental model. They're all alike; they just have different names. I decided to support these libraries as well.&lt;/p&gt;

&lt;p&gt;So, what began as one package for the signals library is now a family of three, one each for &lt;strong&gt;solidart&lt;/strong&gt;, &lt;strong&gt;signals&lt;/strong&gt; and &lt;strong&gt;alien_signals&lt;/strong&gt;, all on one shared engine and one version number. Same API, same JSON files, same ICU plurals. You pick the reactive framework; the translator follows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why three packages instead of one
&lt;/h2&gt;

&lt;p&gt;My first instinct was one package that supports every signal library and lets tree shaking remove what you don't use. That doesn't work in Dart. Tree shaking trims unused code from the compiled output, but pub still resolves every dependency in your pubspec. Ship one package that depends on signals, alien_signals and solidart, and every user downloads, resolves and version constrains all three, even if they only ever touch one.&lt;/p&gt;

&lt;p&gt;So 1.0 is split the boring, correct way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pub.dev/packages/signals_translator_core" rel="noopener noreferrer"&gt;signals_translator_core&lt;/a&gt;&lt;/strong&gt;: the shared engine, no reactivity of its own&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pub.dev/packages/solidart_translator" rel="noopener noreferrer"&gt;solidart_translator&lt;/a&gt;&lt;/strong&gt;: for solidart, rebuilds with SignalBuilder from flutter_solidart&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pub.dev/packages/signals_translator" rel="noopener noreferrer"&gt;signals_translator&lt;/a&gt;&lt;/strong&gt;: for signals, rebuilds with SignalBuilder from signals_flutter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pub.dev/packages/alien_signals_translator" rel="noopener noreferrer"&gt;alien_signals_translator&lt;/a&gt;&lt;/strong&gt;: for alien_signals, rebuilds with SignalBuilder from oref&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core holds everything that isn't reactivity: JSON loading, locale resolution, the fallback chain, persistence and the ICU parser. Each adapter is a thin layer that wraps that engine in its framework's signals. You add exactly one adapter, and your dependency graph contains exactly one reactive library.&lt;/p&gt;

&lt;p&gt;A nice side effect: all packages share one version, so a fix in the ICU parser lands in all three frameworks on the same day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;assets/translations/&lt;/code&gt; with one JSON file per language, named by locale code:&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;assets/translations/en.json&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;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"English"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"translations"&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;"greeting"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"{0} has won the game!"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{0} has won the game!"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add your adapter and register the assets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;signals_translator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.0.0&lt;/span&gt;   &lt;span class="c1"&gt;# or alien_signals_translator / solidart_translator&lt;/span&gt;

&lt;span class="na"&gt;flutter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;assets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/translations/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read translations inside a &lt;code&gt;SignalBuilder&lt;/code&gt;. With signals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:signals/signals_flutter.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:signals_translator/signals_translator.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;SignalBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'greeting'&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;With alien_signals, the rebuild widget comes from oref:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:alien_signals_translator/alien_signals_translator.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:oref/oref.dart'&lt;/span&gt; &lt;span class="kd"&gt;show&lt;/span&gt; &lt;span class="n"&gt;SignalBuilder&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;SignalBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'greeting'&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;With solidart, it comes from flutter_solidart, whose builder takes a second argument:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter_solidart/flutter_solidart.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:solidart_translator/solidart_translator.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;SignalBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'greeting'&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;Switching language is one call, and every &lt;code&gt;SignalBuilder&lt;/code&gt; reading a translation updates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;SignalTranslator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadLocale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'nl'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;SignalTranslator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentLocale&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// 'nl', or 'sys' for system language&lt;/span&gt;
&lt;span class="n"&gt;SignalTranslator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;resolvedLocale&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// concrete code for intl's DateFormat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No locale stored yet? The app starts in the device language, and the user's choice is persisted for the next launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get in 1.0
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Three functions, that's the API.&lt;/strong&gt; &lt;code&gt;tl&lt;/code&gt; for plain strings, &lt;code&gt;tlv&lt;/code&gt; for one variable, &lt;code&gt;tlvm&lt;/code&gt; for several:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'greeting'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tlv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'{0} has won the game!'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'David'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tlvm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'He came in {0}, his partner came in {1}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'first'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'second'&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ICU message format, inline.&lt;/strong&gt; Plurals, ordinals and select live inside the translation string itself, so translators control the whole sentence, verb included:&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;en.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"winner_announcement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"There {0, plural, one {is # winner} other {are # winners}}!"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;nl.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"winner_announcement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Er {0, plural, one {is # winnaar} other {zijn # winnaars}}!"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tlv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'winner_announcement'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// There is 1 winner!&lt;/span&gt;
&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tlv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'winner_announcement'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'5'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// There are 5 winners!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plural categories follow CLDR rules for the active locale via package:intl, so Polish gets &lt;code&gt;few&lt;/code&gt;/&lt;code&gt;many&lt;/code&gt; and Arabic gets all six. Exact matches like &lt;code&gt;=0&lt;/code&gt;, &lt;code&gt;offset:&lt;/code&gt;, multiple blocks per string and nesting all work. Select handles gender or any category:&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="nl"&gt;"reaction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{0, select, female {She} male {He} other {They}} liked your post."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A malformed block never crashes your app. It renders verbatim and prints a debug warning naming the key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regional locales with a fallback chain.&lt;/strong&gt; Ship &lt;code&gt;en.json&lt;/code&gt;, then add &lt;code&gt;en_GB.json&lt;/code&gt; when you need it. A missing regional file falls back to the bare language, then to your &lt;code&gt;fallbackLocale&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;assets/translations/&lt;/span&gt;
  &lt;span class="s"&gt;en.json&lt;/span&gt;
  &lt;span class="s"&gt;en_GB.json&lt;/span&gt;
  &lt;span class="s"&gt;nl.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;SignalTranslator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadLocale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'en_GB'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// 'en-gb' and 'EN_gB' work too&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Shared translations across apps.&lt;/strong&gt; In a monorepo, put your JSON files in one package and point every app at it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;SignalTranslator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;translationsPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="s"&gt;'packages/my_translations/assets/translations'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Coming from 0.x?&lt;/strong&gt; &lt;code&gt;tlp&lt;/code&gt; and &lt;code&gt;tlpm&lt;/code&gt; are gone; nested &lt;code&gt;zero&lt;/code&gt;/&lt;code&gt;one&lt;/code&gt;/&lt;code&gt;other&lt;/code&gt; objects become ICU strings. The migration section in the README shows the before and after.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn't do
&lt;/h2&gt;

&lt;p&gt;No date formatting (use intl with &lt;code&gt;resolvedLocale&lt;/code&gt;), no code generation, no AI features, and JSON is the only file format. It is a small package, but I am open to suggestions.&lt;/p&gt;

&lt;p&gt;If you're already using signals, alien_signals or solidart for your state, your translations can now work the same way. Try it, break it, and open an issue or a PR. I'd especially love feedback from people shipping in languages with complex plural rules.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/signals_translator" rel="noopener noreferrer"&gt;signals_translator on pub.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/alien_signals_translator" rel="noopener noreferrer"&gt;alien_signals_translator on pub.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/solidart_translator" rel="noopener noreferrer"&gt;solidart_translator on pub.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/signals_translator_core" rel="noopener noreferrer"&gt;signals_translator_core on pub.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nathantaal/flutter-signals-translator" rel="noopener noreferrer"&gt;Source and issues on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/signals_translator/changelog" rel="noopener noreferrer"&gt;Changelog with the 1.0 breaking changes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>showdev</category>
      <category>i18n</category>
      <category>signals</category>
    </item>
  </channel>
</rss>
