Repository: lingui/js-lingui
Pull request #853 (2020-11-11 14:54:21)

fix: absolute rootDir on Windows
It's a bit workaround, I' have to look deeper to analyze the issue, but meanwhile it works on Windows and Mac as usual 👍🏻 

vercel[bot]: This pull request is being automatically deployed with Vercel ([learn more](https://vercel.link/github-learn-more)).  
To see the status of your deployment, click below or on the icon next to each commit.

🔍 Inspect: [https://vercel.com/lingui-js/js-lingui/r987mw936](https://vercel.com/lingui-js/js-lingui/r987mw936)  
✅ Preview: *In Progress*


codecov[bot]: # [Codecov](https://codecov.io/gh/lingui/js-lingui/pull/853?src=pr&el=h1) Report
> Merging [#853](https://codecov.io/gh/lingui/js-lingui/pull/853?src=pr&el=desc) (d7a38f9) into [main](https://codecov.io/gh/lingui/js-lingui/commit/a9b7e43bbfe5273165cde871fd84726e864f8f04?el=desc) (a9b7e43) will **increase** coverage by `0.02%`.
> The diff coverage is `100.00%`.

[![Impacted file tree graph](https://codecov.io/gh/lingui/js-lingui/pull/853/graphs/tree.svg?width=650&height=150&src=pr&token=CuJ1VD5BY5)](https://codecov.io/gh/lingui/js-lingui/pull/853?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##             main     #853      +/-   ##
==========================================
+ Coverage   83.01%   83.04%   +0.02%     
==========================================
  Files          51       51              
  Lines        1419     1421       +2     
  Branches      386      387       +1     
==========================================
+ Hits         1178     1180       +2     
  Misses        142      142              
  Partials       99       99              
```


| [Impacted Files](https://codecov.io/gh/lingui/js-lingui/pull/853?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [packages/cli/src/api/catalog.ts](https://codecov.io/gh/lingui/js-lingui/pull/853/diff?src=pr&el=tree#diff-cGFja2FnZXMvY2xpL3NyYy9hcGkvY2F0YWxvZy50cw==) | `82.65% <100.00%> (+0.17%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/lingui/js-lingui/pull/853?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/lingui/js-lingui/pull/853?src=pr&el=footer). Last update [a9b7e43...d7a38f9](https://codecov.io/gh/lingui/js-lingui/pull/853?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

semoal: > Thank you for working on this @semoal, but the fix doesn't seem to work. No messages were extracted, so it looks like the path isn't correct.

Ugh i take a further look then

Patch:
diff --git a/examples/create-react-app/lingui.config.js b/examples/create-react-app/lingui.config.js
index 811ff11e..63f81930 100644
--- a/examples/create-react-app/lingui.config.js
+++ b/examples/create-react-app/lingui.config.js
@@ -2,8 +2,9 @@ module.exports =  {
   locales: ["en", "cs"],
   sourceLocale: "en",
   catalogs: [{
-    path: "src/locales/{locale}/messages",
-    include: ["src"]
+    path: "<rootDir>/src/locales/{locale}/messages",
+    include: ["<rootDir>"],
+    exclude: ["**/node_modules/**"],
   }],
   format: "po"
 }
\ No newline at end of file
diff --git a/examples/create-react-app/package.json b/examples/create-react-app/package.json
index c72d76aa..cdad6593 100644
--- a/examples/create-react-app/package.json
+++ b/examples/create-react-app/package.json
@@ -3,7 +3,7 @@
   "version": "0.1.0",
   "private": true,
   "dependencies": {
-    "@lingui/react": "^3.0.0",
+    "@lingui/react": "^3.1.0",
     "@testing-library/jest-dom": "^5.11.5",
     "@testing-library/react": "^11.1.0",
     "@testing-library/user-event": "^12.1.10",
@@ -40,8 +40,8 @@
     ]
   },
   "devDependencies": {
-    "@lingui/cli": "^3.0.0",
-    "@lingui/loader": "^3.0.0",
-    "@lingui/macro": "^3.0.0"
+    "@lingui/cli": "^3.1.0",
+    "@lingui/loader": "^3.1.0",
+    "@lingui/macro": "^3.1.0"
   }
 }
diff --git a/examples/create-react-app/yarn.lock b/examples/create-react-app/yarn.lock
index 82e6dcfd..7958d77d 100644
--- a/examples/create-react-app/yarn.lock
+++ b/examples/create-react-app/yarn.lock
@@ -1408,28 +1408,28 @@
     "@types/yargs" "^15.0.0"
     chalk "^4.0.0"
 
-"@lingui/babel-plugin-extract-messages@3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.0.0.tgz#5bc2c08ccde0ebbe736d5ee22cd0b61bc837f7f1"
-  integrity sha512-atjb6sQbDP8ZLZu5fJdAMK+CJWGs/hyn52JxZi3tPgirORFDAOa/FfDP5Sfnv+3wgEQzFA2igEmSKpyTuyZHBg==
+"@lingui/babel-plugin-extract-messages@3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.1.0.tgz#6c24e3082ef205bc0b1b056c112f1b52a3b7cc81"
+  integrity sha512-8wDae+HxpGrN/gsT+fLo+cTkzlE1V9hwMHLmjQ6uA26emyPtXQrJnltHi+gbDYFf/JJgvmVpo6HvqWvn9Kvo9Q==
   dependencies:
     "@babel/generator" "^7.11.6"
     "@babel/runtime" "^7.11.2"
-    "@lingui/conf" "3.0.0"
+    "@lingui/conf" "3.1.0"
     mkdirp "^1.0.4"
 
-"@lingui/cli@^3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@lingui/cli/-/cli-3.0.0.tgz#128ce8289d2fbc66cc6a122e1ccc76ff890b8ac7"
-  integrity sha512-ysega+gLQA46i6I9fkW1eQNhx2bYzRTaN0NfFtFxVu4WEIBP0+r+oHGTILys4zFjSj5v0iSJ/2/iroJKI11NeA==
+"@lingui/cli@3.1.0", "@lingui/cli@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/cli/-/cli-3.1.0.tgz#bf541403f2d05dd02d79d42568a4b80c4a57ed75"
+  integrity sha512-/zYl7N+uiAUGL1spWqyOuCdBK6sE7YGQVL93n7VAE+lKlLrrjbu0mEGT8DpzBixFqt2JrY1H9M5cpJ4uMAGt/A==
   dependencies:
     "@babel/generator" "^7.11.6"
     "@babel/parser" "^7.11.5"
     "@babel/plugin-syntax-jsx" "^7.10.4"
     "@babel/runtime" "^7.11.2"
     "@babel/types" "^7.11.5"
-    "@lingui/babel-plugin-extract-messages" "3.0.0"
-    "@lingui/conf" "3.0.0"
+    "@lingui/babel-plugin-extract-messages" "3.1.0"
+    "@lingui/conf" "3.1.0"
     babel-plugin-macros "^2.8.0"
     bcp-47 "^1.0.7"
     chalk "^4.1.0"
@@ -1451,41 +1451,52 @@
     pseudolocale "^1.1.0"
     ramda "^0.27.1"
 
-"@lingui/conf@3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@lingui/conf/-/conf-3.0.0.tgz#8a3ea64e7a7c43d12c20aa910d6aeb65911d889b"
-  integrity sha512-oPPU6hdyA2fMlQRB7GoYWApzR2tTXPqN8bGTo3ZFXBOgazAHYgIED/ZrnXEWTKRdGRtxMYkU+xDQ+6BLdgieug==
+"@lingui/conf@3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/conf/-/conf-3.1.0.tgz#953b71ceef9cf0a07091892a927b16b59577d42a"
+  integrity sha512-DhBGeOC4qY0tjVwTdwLr59YjqcRPfA7+Ehj346cJZXkfLylCb4TLKIhnGJbDF7lReNWDltECJCHxvPfotre6Vw==
   dependencies:
     "@babel/runtime" "^7.11.2"
     chalk "^4.1.0"
     cosmiconfig "^7.0.0"
     jest-validate "^26.5.2"
 
-"@lingui/core@3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@lingui/core/-/core-3.0.0.tgz#5591658ea4edaf0e5fc359eef5b70fe292a22265"
-  integrity sha512-Jtwau0dV10SaL/mJmhR+h5Pyos3MTijWvNnPeIiaKfVtXskhopspuKjux0Q2BeDipmGXMxcF6JAuVJvTFxJ47w==
+"@lingui/core@3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/core/-/core-3.1.0.tgz#c8e185cee881ccc935ab9c2d363d620c006901f7"
+  integrity sha512-dKUcX2Swm8bjed6qIRYQ9xUv6Yq3kxzfKm+jtdLQCO3hlfq/w6Zt16EsAgeJZ92081ZhlJLNGy/dELEczajUBw==
   dependencies:
     "@babel/runtime" "^7.11.2"
     make-plural "^6.2.2"
     messageformat-parser "^4.1.3"
 
-"@lingui/macro@^3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@lingui/macro/-/macro-3.0.0.tgz#afdc4890251e38b657e7c1b4bb357e5a36bf6637"
-  integrity sha512-Gugk8u1tlFEsaQnfzMidDdsbq/OFs3VYZ8H8XfEvygyNtWMZgKjbe1bPpwHEf4+fS3YJHWg/0GfHwIfzbJMP5g==
+"@lingui/loader@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/loader/-/loader-3.1.0.tgz#9a9124cd9e5b71c2361e5e446522b72ad8cde5bb"
+  integrity sha512-dUnLykFdLruV/5hjQREcLdoNA3aInddhLEp5fiAIGElxlfVPj77YZZzEJBBUJ/v7v+48AyPOOPmbcbhHfb1BsQ==
   dependencies:
     "@babel/runtime" "^7.11.2"
-    "@lingui/conf" "3.0.0"
+    "@lingui/cli" "3.1.0"
+    "@lingui/conf" "3.1.0"
+    loader-utils "^2.0.0"
     ramda "^0.27.1"
 
-"@lingui/react@^3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@lingui/react/-/react-3.0.0.tgz#100bd9fd30d8fdf3b4ce128bab2c1da3488a8aa7"
-  integrity sha512-PAL0UfEnZXK8uahyh5ZuXNoYettDq61fg8OWt+Mf79lxdllX3QBJCM7BKp8J8JGZi+KSDS0jGwfvrq/W6MJ9bA==
+"@lingui/macro@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/macro/-/macro-3.1.0.tgz#ae98371964cf716f96b67b7207c9d00f4471e0f2"
+  integrity sha512-yE8FGLV0175wAh9nSNOFjtyYITHsA98IRFyMn/OqLbDDummdvahXQrQPtO8SQ/ecVJdh7LrZGmsYawCFVQ2XQg==
+  dependencies:
+    "@babel/runtime" "^7.11.2"
+    "@lingui/conf" "3.1.0"
+    ramda "^0.27.1"
+
+"@lingui/react@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/react/-/react-3.1.0.tgz#ff650b03c3a29cb2576941032b916a63d3b2b2c2"
+  integrity sha512-a3eYTcV8V5fhF0k/BxAT2DQNHlY2UPRvZqeA3OkQvkREptExVeNzo3gfS0bdyOGvJIpILFFBIVtxUhvHSU+dmQ==
   dependencies:
     "@babel/runtime" "^7.11.2"
-    "@lingui/core" "3.0.0"
+    "@lingui/core" "3.1.0"
 
 "@nodelib/fs.scandir@2.1.3":
   version "2.1.3"
diff --git a/examples/next-js/locale/cs/messages.po b/examples/next-js/locale/cs/messages.po
index a60a4c8d..cf65b0df 100644
--- a/examples/next-js/locale/cs/messages.po
+++ b/examples/next-js/locale/cs/messages.po
@@ -13,15 +13,15 @@ msgstr ""
 "Language-Team: \n"
 "Plural-Forms: \n"
 
-#: pages/index.tsx:38
+#: pages/index.tsx:36
 msgid "Checkout LinguiJS examples and usecases."
 msgstr "Podívej se na ukázky a příklady LinguiJS"
 
-#: pages/index.tsx:23
+#: pages/index.tsx:21
 msgid "Documentation →"
 msgstr "Dokumentace →"
 
-#: lingui-example/components/Layout.tsx:10
+#: lingui-example/components/Layout.tsx:11
 msgid "Example project using LinguiJS"
 msgstr "Ukázkový projekt s LinguiJS"
 
@@ -29,15 +29,15 @@ msgstr "Ukázkový projekt s LinguiJS"
 msgid "Examples"
 msgstr "Ukázky"
 
-#: pages/index.tsx:35
+#: pages/index.tsx:33
 msgid "Examples →"
 msgstr "Ukázky →"
 
-#: pages/index.tsx:26
+#: pages/index.tsx:24
 msgid "Find in-depth information about LinguiJS features and API."
 msgstr "Vyhledej podrobné informace o funkcích LinguiJS"
 
-#: pages/index.tsx:14
+#: pages/index.tsx:13
 msgid "Get started by editing <0>locale/en/messages.po</0>"
 msgstr "Začni úpravou <0>locale/cs/messages.po</0>"
 
@@ -45,7 +45,7 @@ msgstr "Začni úpravou <0>locale/cs/messages.po</0>"
 msgid "Plurals"
 msgstr "Množné číslo"
 
-#: lingui-example/components/Layout.tsx:24
+#: lingui-example/components/Layout.tsx:23
 msgid "Powered by <0/>"
 msgstr "Používá <0/>"
 
diff --git a/examples/next-js/locale/en/messages.po b/examples/next-js/locale/en/messages.po
index f56ae82c..82d39d5e 100644
--- a/examples/next-js/locale/en/messages.po
+++ b/examples/next-js/locale/en/messages.po
@@ -13,15 +13,15 @@ msgstr ""
 "Language-Team: \n"
 "Plural-Forms: \n"
 
-#: pages/index.tsx:38
+#: pages/index.tsx:36
 msgid "Checkout LinguiJS examples and usecases."
 msgstr "Checkout LinguiJS examples and usecases."
 
-#: pages/index.tsx:23
+#: pages/index.tsx:21
 msgid "Documentation →"
 msgstr "Documentation →"
 
-#: lingui-example/components/Layout.tsx:10
+#: lingui-example/components/Layout.tsx:11
 msgid "Example project using LinguiJS"
 msgstr "Example project using LinguiJS"
 
@@ -29,15 +29,15 @@ msgstr "Example project using LinguiJS"
 msgid "Examples"
 msgstr "Examples"
 
-#: pages/index.tsx:35
+#: pages/index.tsx:33
 msgid "Examples →"
 msgstr "Examples →"
 
-#: pages/index.tsx:26
+#: pages/index.tsx:24
 msgid "Find in-depth information about LinguiJS features and API."
 msgstr "Find in-depth information about LinguiJS features and API."
 
-#: pages/index.tsx:14
+#: pages/index.tsx:13
 msgid "Get started by editing <0>locale/en/messages.po</0>"
 msgstr "Get started by editing <0>locale/en/messages.po</0>"
 
@@ -45,7 +45,7 @@ msgstr "Get started by editing <0>locale/en/messages.po</0>"
 msgid "Plurals"
 msgstr "Plurals"
 
-#: lingui-example/components/Layout.tsx:24
+#: lingui-example/components/Layout.tsx:23
 msgid "Powered by <0/>"
 msgstr "Powered by <0/>"
 
diff --git a/examples/next-js/package.json b/examples/next-js/package.json
index 21fffa72..5332909c 100644
--- a/examples/next-js/package.json
+++ b/examples/next-js/package.json
@@ -3,22 +3,24 @@
   "version": "0.1.0",
   "private": true,
   "scripts": {
+    "extract": "lingui extract",
+    "compile": "lingui compile",
     "dev": "next dev",
     "build": "next build",
     "start": "next start"
   },
   "dependencies": {
-    "@lingui/core": "^3.0.3",
-    "@lingui/react": "^3.0.3",
+    "@lingui/core": "^3.1.0",
+    "@lingui/react": "^3.1.0",
     "classnames": "^2.2.6",
     "next": "10.0.1",
     "react": "17.0.1",
     "react-dom": "17.0.1"
   },
   "devDependencies": {
-    "@lingui/cli": "^3.0.3",
-    "@lingui/loader": "^3.0.3",
-    "@lingui/macro": "^3.0.3",
+    "@lingui/cli": "^3.1.0",
+    "@lingui/loader": "^3.1.0",
+    "@lingui/macro": "^3.1.0",
     "@types/react": "^16.9.56",
     "babel-plugin-macros": "^2.8.0",
     "typescript": "^4.0.5"
diff --git a/examples/next-js/yarn.lock b/examples/next-js/yarn.lock
index 5f940eb2..e629273b 100644
--- a/examples/next-js/yarn.lock
+++ b/examples/next-js/yarn.lock
@@ -1107,28 +1107,28 @@
     "@types/yargs" "^15.0.0"
     chalk "^4.0.0"
 
-"@lingui/babel-plugin-extract-messages@3.0.3":
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.0.3.tgz#8c7bcb9e13e0621b006ee6c47dac0002ee02198b"
-  integrity sha512-3RVx9qharfHGDrxyRMp0jWRG5vzYHyTYiamqFejcmDVCBDHOS1SqFkgyDayFZp3f4CnyRT9W+0ARAeTFjpfuaw==
+"@lingui/babel-plugin-extract-messages@3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.1.0.tgz#6c24e3082ef205bc0b1b056c112f1b52a3b7cc81"
+  integrity sha512-8wDae+HxpGrN/gsT+fLo+cTkzlE1V9hwMHLmjQ6uA26emyPtXQrJnltHi+gbDYFf/JJgvmVpo6HvqWvn9Kvo9Q==
   dependencies:
     "@babel/generator" "^7.11.6"
     "@babel/runtime" "^7.11.2"
-    "@lingui/conf" "3.0.3"
+    "@lingui/conf" "3.1.0"
     mkdirp "^1.0.4"
 
-"@lingui/cli@3.0.3", "@lingui/cli@^3.0.3":
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/@lingui/cli/-/cli-3.0.3.tgz#17108a2a87251d6f2583e4b5d883760c8fdd8cdc"
-  integrity sha512-LCjiLZz8ODB9cGARmxGrHDMe02GWdoHPlhcZjjQ1KFD5SWYsgJd4FkcRt5MIK+027vr6Iu5sjs/THht0NillLA==
+"@lingui/cli@3.1.0", "@lingui/cli@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/cli/-/cli-3.1.0.tgz#bf541403f2d05dd02d79d42568a4b80c4a57ed75"
+  integrity sha512-/zYl7N+uiAUGL1spWqyOuCdBK6sE7YGQVL93n7VAE+lKlLrrjbu0mEGT8DpzBixFqt2JrY1H9M5cpJ4uMAGt/A==
   dependencies:
     "@babel/generator" "^7.11.6"
     "@babel/parser" "^7.11.5"
     "@babel/plugin-syntax-jsx" "^7.10.4"
     "@babel/runtime" "^7.11.2"
     "@babel/types" "^7.11.5"
-    "@lingui/babel-plugin-extract-messages" "3.0.3"
-    "@lingui/conf" "3.0.3"
+    "@lingui/babel-plugin-extract-messages" "3.1.0"
+    "@lingui/conf" "3.1.0"
     babel-plugin-macros "^2.8.0"
     bcp-47 "^1.0.7"
     chalk "^4.1.0"
@@ -1150,52 +1150,52 @@
     pseudolocale "^1.1.0"
     ramda "^0.27.1"
 
-"@lingui/conf@3.0.3":
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/@lingui/conf/-/conf-3.0.3.tgz#3448d9ffd062daa7f2b5253343beba5599cd1cd2"
-  integrity sha512-LjpKne/DduH3Ovq+2K/u160LIM6eHVpWbufQYn9li6zM9RrRMkZ833Xsb2r5FrKN9uhtDYlrSZgOapLN3IC93Q==
+"@lingui/conf@3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/conf/-/conf-3.1.0.tgz#953b71ceef9cf0a07091892a927b16b59577d42a"
+  integrity sha512-DhBGeOC4qY0tjVwTdwLr59YjqcRPfA7+Ehj346cJZXkfLylCb4TLKIhnGJbDF7lReNWDltECJCHxvPfotre6Vw==
   dependencies:
     "@babel/runtime" "^7.11.2"
     chalk "^4.1.0"
     cosmiconfig "^7.0.0"
     jest-validate "^26.5.2"
 
-"@lingui/core@3.0.3", "@lingui/core@^3.0.3":
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/@lingui/core/-/core-3.0.3.tgz#d3791f6e54943d2481d127b6bed015d515e16bb1"
-  integrity sha512-lfDkhgChJ+6f+qlGFFJmHAF28ZZTc/dgxVcT4zpLx4Gqf0MsIsx701MBGLXI1X/Gn2PMkDnhZVP0XkpDma6fxQ==
+"@lingui/core@3.1.0", "@lingui/core@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/core/-/core-3.1.0.tgz#c8e185cee881ccc935ab9c2d363d620c006901f7"
+  integrity sha512-dKUcX2Swm8bjed6qIRYQ9xUv6Yq3kxzfKm+jtdLQCO3hlfq/w6Zt16EsAgeJZ92081ZhlJLNGy/dELEczajUBw==
   dependencies:
     "@babel/runtime" "^7.11.2"
     make-plural "^6.2.2"
     messageformat-parser "^4.1.3"
 
-"@lingui/loader@^3.0.3":
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/@lingui/loader/-/loader-3.0.3.tgz#cf1016d3f3f6b3d6a8447d51068916c4a8bd3b47"
-  integrity sha512-yOYeDVrOAC6YYA46WKkAlgR87m0cAXxtsbTLwWZIAKhv6F1wMGv2hvyONdzLh0pGbi0WGtr3uqzKOftrDGz47w==
+"@lingui/loader@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/loader/-/loader-3.1.0.tgz#9a9124cd9e5b71c2361e5e446522b72ad8cde5bb"
+  integrity sha512-dUnLykFdLruV/5hjQREcLdoNA3aInddhLEp5fiAIGElxlfVPj77YZZzEJBBUJ/v7v+48AyPOOPmbcbhHfb1BsQ==
   dependencies:
     "@babel/runtime" "^7.11.2"
-    "@lingui/cli" "3.0.3"
-    "@lingui/conf" "3.0.3"
+    "@lingui/cli" "3.1.0"
+    "@lingui/conf" "3.1.0"
     loader-utils "^2.0.0"
     ramda "^0.27.1"
 
-"@lingui/macro@^3.0.3":
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/@lingui/macro/-/macro-3.0.3.tgz#8c19b7bd128d76bbe9ba15726b225ccd3f764da1"
-  integrity sha512-nGvEo5hg+6kKAOAw72zu8xDhBbh0ujlJNOHXNmf3h9T0mI5BlHqcUOJH29meZgn4x19rFyiBJty19gcD4IHTHg==
+"@lingui/macro@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/macro/-/macro-3.1.0.tgz#ae98371964cf716f96b67b7207c9d00f4471e0f2"
+  integrity sha512-yE8FGLV0175wAh9nSNOFjtyYITHsA98IRFyMn/OqLbDDummdvahXQrQPtO8SQ/ecVJdh7LrZGmsYawCFVQ2XQg==
   dependencies:
     "@babel/runtime" "^7.11.2"
-    "@lingui/conf" "3.0.3"
+    "@lingui/conf" "3.1.0"
     ramda "^0.27.1"
 
-"@lingui/react@^3.0.3":
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/@lingui/react/-/react-3.0.3.tgz#4e8ac823a9b97f86d62951c0242070dc31658189"
-  integrity sha512-ws+g1ZG7QAmA/pUb3wrRtFbu665VbnGps3y7olQ7F+LqyeqiVpOBukRxiThBwc51apM5v9/zVbyrtjJtWsdRYg==
+"@lingui/react@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@lingui/react/-/react-3.1.0.tgz#ff650b03c3a29cb2576941032b916a63d3b2b2c2"
+  integrity sha512-a3eYTcV8V5fhF0k/BxAT2DQNHlY2UPRvZqeA3OkQvkREptExVeNzo3gfS0bdyOGvJIpILFFBIVtxUhvHSU+dmQ==
   dependencies:
     "@babel/runtime" "^7.11.2"
-    "@lingui/core" "3.0.3"
+    "@lingui/core" "3.1.0"
 
 "@next/env@10.0.1":
   version "10.0.1"
diff --git a/packages/babel-plugin-extract-messages/src/index.ts b/packages/babel-plugin-extract-messages/src/index.ts
index 038ec9c1..905f454b 100644
--- a/packages/babel-plugin-extract-messages/src/index.ts
+++ b/packages/babel-plugin-extract-messages/src/index.ts
@@ -17,7 +17,7 @@ const VISITED = Symbol("I18nVisited")
 function addMessage(
   path,
   messages,
-  { id, message: newDefault, origin, ...props }
+  { id, message: newDefault, origin, comment, ...props }
 ) {
   if (messages.has(id)) {
     const message = messages.get(id)
@@ -33,9 +33,13 @@ function addMessage(
       }
 
       ;[].push.apply(message.origin, origin)
+      if (comment) {
+        ;[].push.apply(message.extractedComments, [comment])
+      }
     }
   } else {
-    messages.set(id, { ...props, message: newDefault, origin })
+    const extractedComments = comment ? [comment] : []
+    messages.set(id, { ...props, message: newDefault, origin, extractedComments })
   }
 }
 
diff --git a/packages/cli/src/api/catalog.ts b/packages/cli/src/api/catalog.ts
index 3ae443b1..f316b382 100644
--- a/packages/cli/src/api/catalog.ts
+++ b/packages/cli/src/api/catalog.ts
@@ -25,11 +25,10 @@ type MessageOrigin = [string, number];
 export type ExtractedMessageType = {
   message?: string
   origin?: MessageOrigin[]
-  comment?: string
+  extractedComments?: string[]
   comments?: string[]
   obsolete?: boolean
   flags?: string[]
-  description?: string
 }
 
 export type MessageType = ExtractedMessageType & {
@@ -169,7 +168,7 @@ export class Catalog {
           .filter(Boolean)
           .reduce(
             (catalog, messages) =>
-              R.mergeWithKey(mergeOrigins, catalog, messages),
+              R.mergeWithKey(mergeOriginsAndExtractedComments, catalog, messages),
             {}
           )
       })(tmpDir)
@@ -359,11 +358,22 @@ export class Catalog {
 
   get sourcePaths() {
     const includeGlobs = this.include.map(
-      (includePath) =>
-        includePath.endsWith(PATHSEP)
-          ? [includePath, "**", "*.*"].join(PATHSEP) // directory
-          : includePath // file
+      (includePath) => {
+        const isDir = fs.existsSync(includePath) && fs.lstatSync(includePath).isDirectory()
+        /**
+         * glob library results from absolute patterns such as /foo/* are mounted onto the root setting using path.join.
+         * On windows, this will by default result in /foo/* matching C:\foo\bar.txt.
+         */
+        return isDir ? normalize(
+          path.resolve(
+            process.cwd(),
+            includePath === "/" ? "" : includePath,
+            "**/*.*"
+          )
+        ) : includePath
+      }
     )
+
     const patterns =
       includeGlobs.length > 1 ? `{${includeGlobs.join(",")}}` : includeGlobs[0]
     return glob.sync(patterns, { ignore: this.exclude, mark: true })
@@ -541,10 +551,10 @@ export function getCatalogForMerge(config: LinguiConfig) {
 }
 
 /**
- * Merge origins for messages found in different places. All other attributes
+ * Merge origins and extractedComments for messages found in different places. All other attributes
  * should be the same (raise an error if defaults are different).
  */
-function mergeOrigins(msgId, prev, next) {
+function mergeOriginsAndExtractedComments(msgId, prev, next) {
   if (prev.defaults !== next.defaults) {
     throw new Error(
       `Encountered different defaults for message ${chalk.yellow(msgId)}` +
@@ -555,6 +565,7 @@ function mergeOrigins(msgId, prev, next) {
 
   return {
     ...next,
+    extractedComments: R.concat(prev.extractedComments, next.extractedComments),
     origin: R.concat(prev.origin, next.origin),
   }
 }
@@ -581,10 +592,7 @@ export function normalizeRelativePath(sourcePath: string): string {
   }
 
   const isDir = fs.existsSync(sourcePath) && fs.lstatSync(sourcePath).isDirectory()
-  return (
-    normalize(path.relative(process.cwd(), path.resolve(sourcePath))) +
-    (isDir ? PATHSEP : "")
-  )
+  return normalize(path.relative(process.cwd(), sourcePath), false) + (isDir ? "/" : "")
 }
 
 export const cleanObsolete = R.filter(
diff --git a/packages/cli/src/api/fixtures/collect/componentA/componentA.js b/packages/cli/src/api/fixtures/collect/componentA/componentA.js
index 67bd58bc..7365855d 100644
--- a/packages/cli/src/api/fixtures/collect/componentA/componentA.js
+++ b/packages/cli/src/api/fixtures/collect/componentA/componentA.js
@@ -1,1 +1,3 @@
-/*i18n*/ i18n._("Component A")
+/*i18n*/ i18n._("Component A");
+/*i18n*/ i18n._("Hello World", {}, {comment: "Comment A"});
+/*i18n*/ i18n._("Hello World", {}, {comment: "Comment A again"});
diff --git a/packages/cli/src/api/fixtures/collect/componentA/index.js b/packages/cli/src/api/fixtures/collect/componentA/index.js
index b8c091b3..2cd64b7a 100644
--- a/packages/cli/src/api/fixtures/collect/componentA/index.js
+++ b/packages/cli/src/api/fixtures/collect/componentA/index.js
@@ -1,1 +1,1 @@
-/*i18n*/ i18n._("Hello World")
+/*i18n*/ i18n._("Hello World", {}, {comment: "Hello comment"})
diff --git a/packages/cli/src/api/formats/po.ts b/packages/cli/src/api/formats/po.ts
index b10fbb8c..bcc18e94 100644
--- a/packages/cli/src/api/formats/po.ts
+++ b/packages/cli/src/api/formats/po.ts
@@ -24,7 +24,7 @@ const serialize = (items: CatalogType, options) =>
       item.msgid = key
       item.msgstr = [message.translation]
       item.comments = message.comments || []
-      item.extractedComments = message.comment ? [message.comment] : []
+      item.extractedComments = message.extractedComments || []
       if (options.origins) {
         item.references = message.origin ? message.origin.map(joinOrigin) : []
       }
@@ -53,12 +53,8 @@ const isObsolete = R.either(R.path(["flags", "obsolete"]), R.prop("obsolete"))
 const deserialize: (item: Object) => Object = R.map(
   R.applySpec({
     translation: R.compose(R.head, R.defaultTo([]), getTranslations),
-    comment: R.compose(R.head, R.defaultTo([]), getExtractedComments),
-    comments: (item) =>
-      R.concat(
-        getTranslatorComments(item) as string,
-        R.tail(getExtractedComments(item))
-      ),
+    extractedComments: R.compose(R.defaultTo([]), getExtractedComments),
+    comments: R.compose(R.defaultTo([]), getTranslatorComments),
     obsolete: isObsolete,
     origin: R.compose(R.map(splitOrigin), R.defaultTo([]), getOrigins),
     flags: getFlags,


Test patch:
diff --git a/docs/guides/testing.rst b/docs/guides/testing.rst
index 9edd4d60..6e944169 100644
--- a/docs/guides/testing.rst
+++ b/docs/guides/testing.rst
@@ -16,10 +16,12 @@ Here is a working example with `react-testing-library`_, using the `wrapper-prop
    import { render } from '@testing-library/react'
    import { i18n } from '@lingui/core'
    import { I18nProvider } from '@lingui/react'
+   import { en } from 'make-plural/plurals';
    import { messages } from '../your-path-to/en/messages.js'
    import Inbox from './Inbox'
 
    i18n.load('en', messages)
+   i18n.loadLocaleData({ en: { plurals: en } });
    i18n.activate('en')
    const TestingProvider = ({ children }) => (
      <I18nProvider i18n={i18n}>
diff --git a/packages/babel-plugin-extract-messages/test/__snapshots__/index.ts.snap b/packages/babel-plugin-extract-messages/test/__snapshots__/index.ts.snap
index f556de87..5571ff1c 100644
--- a/packages/babel-plugin-extract-messages/test/__snapshots__/index.ts.snap
+++ b/packages/babel-plugin-extract-messages/test/__snapshots__/index.ts.snap
@@ -3,6 +3,7 @@
 exports[`@lingui/babel-plugin-extract-messages should extract Plural messages from JSX files when there's no Trans tag (integration) 1`] = `
 Object {
   {count, plural, one {# book} other {# books}}: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         jsx-without-trans.js,
@@ -16,7 +17,9 @@ Object {
 exports[`@lingui/babel-plugin-extract-messages should extract all messages from JS files (macros) 1`] = `
 Object {
   Description: Object {
-    comment: description,
+    extractedComments: Array [
+      description,
+    ],
     origin: Array [
       Array [
         js-with-macros.js,
@@ -25,6 +28,7 @@ Object {
     ],
   },
   ID: Object {
+    extractedComments: Array [],
     message: Message with id,
     origin: Array [
       Array [
@@ -34,6 +38,7 @@ Object {
     ],
   },
   ID Some: Object {
+    extractedComments: Array [],
     message: Message with id some,
     origin: Array [
       Array [
@@ -43,6 +48,7 @@ Object {
     ],
   },
   Message: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         js-with-macros.js,
@@ -55,6 +61,7 @@ Object {
     ],
   },
   Values {param}: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         js-with-macros.js,
@@ -68,7 +75,9 @@ Object {
 exports[`@lingui/babel-plugin-extract-messages should extract all messages from JS files 1`] = `
 Object {
   Description: Object {
-    comment: description,
+    extractedComments: Array [
+      description,
+    ],
     origin: Array [
       Array [
         js-without-macros.js,
@@ -77,6 +86,7 @@ Object {
     ],
   },
   ID: Object {
+    extractedComments: Array [],
     message: Message with id,
     origin: Array [
       Array [
@@ -86,6 +96,7 @@ Object {
     ],
   },
   Message: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         js-without-macros.js,
@@ -94,6 +105,7 @@ Object {
     ],
   },
   Values {param}: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         js-without-macros.js,
@@ -107,6 +119,7 @@ Object {
 exports[`@lingui/babel-plugin-extract-messages should extract all messages from JSX files (macros) 1`] = `
 Object {
   Hi, my name is {name}: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         jsx-with-macros.js,
@@ -115,6 +128,7 @@ Object {
     ],
   },
   Title: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         jsx-with-macros.js,
@@ -123,6 +137,7 @@ Object {
     ],
   },
   {count, plural, one {# book} other {# books}}: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         jsx-with-macros.js,
@@ -136,6 +151,7 @@ Object {
 exports[`@lingui/babel-plugin-extract-messages should extract all messages from JSX files 1`] = `
 Object {
   Hi, my name is <0>{name}</0>: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         jsx-without-macros.js,
@@ -144,6 +160,7 @@ Object {
     ],
   },
   msg.default: Object {
+    extractedComments: Array [],
     message: Hello World,
     origin: Array [
       Array [
@@ -157,7 +174,9 @@ Object {
     ],
   },
   msg.hello: Object {
-    comment: Description,
+    extractedComments: Array [
+      Description,
+    ],
     origin: Array [
       Array [
         jsx-without-macros.js,
diff --git a/packages/cli/src/api/__snapshots__/catalog.test.ts.snap b/packages/cli/src/api/__snapshots__/catalog.test.ts.snap
index 1fbc1b33..d6a3ac41 100644
--- a/packages/cli/src/api/__snapshots__/catalog.test.ts.snap
+++ b/packages/cli/src/api/__snapshots__/catalog.test.ts.snap
@@ -3,6 +3,7 @@
 exports[`Catalog collect should extract messages from source files 1`] = `
 Object {
   Component A: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         collect/componentA/componentA.js,
@@ -11,6 +12,7 @@ Object {
     ],
   },
   Component B: Object {
+    extractedComments: Array [],
     origin: Array [
       Array [
         collect/componentB.js,
@@ -19,7 +21,20 @@ Object {
     ],
   },
   Hello World: Object {
+    extractedComments: Array [
+      Comment A,
+      Comment A again,
+      Hello comment,
+    ],
     origin: Array [
+      Array [
+        collect/componentA/componentA.js,
+        2,
+      ],
+      Array [
+        collect/componentA/componentA.js,
+        3,
+      ],
       Array [
         collect/componentA/index.js,
         1,
@@ -42,8 +57,8 @@ exports[`Catalog make should collect and write catalogs 2`] = `
 Object {
   cs: Object {
     Component A: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [
@@ -55,11 +70,23 @@ Object {
       translation: ,
     },
     Hello World: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [
+        Comment A,
+        Comment A again,
+        Hello comment,
+      ],
       flags: Array [],
       obsolete: false,
       origin: Array [
+        Array [
+          collect/componentA/componentA.js,
+          2,
+        ],
+        Array [
+          collect/componentA/componentA.js,
+          3,
+        ],
         Array [
           collect/componentA/index.js,
           1,
@@ -70,8 +97,8 @@ Object {
   },
   en: Object {
     Component A: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [
@@ -83,11 +110,23 @@ Object {
       translation: ,
     },
     Hello World: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [
+        Comment A,
+        Comment A again,
+        Hello comment,
+      ],
       flags: Array [],
       obsolete: false,
       origin: Array [
+        Array [
+          collect/componentA/componentA.js,
+          2,
+        ],
+        Array [
+          collect/componentA/componentA.js,
+          3,
+        ],
         Array [
           collect/componentA/index.js,
           1,
@@ -103,8 +142,8 @@ exports[`Catalog make should merge with existing catalogs 1`] = `
 Object {
   cs: Object {
     Hello World: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [],
@@ -113,8 +152,8 @@ Object {
   },
   en: Object {
     Hello World: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [],
@@ -128,8 +167,8 @@ exports[`Catalog make should merge with existing catalogs 2`] = `
 Object {
   cs: Object {
     Component A: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [
@@ -141,8 +180,8 @@ Object {
       translation: ,
     },
     Component B: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [
@@ -154,11 +193,23 @@ Object {
       translation: ,
     },
     Hello World: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [
+        Comment A,
+        Comment A again,
+        Hello comment,
+      ],
       flags: Array [],
       obsolete: false,
       origin: Array [
+        Array [
+          collect/componentA/componentA.js,
+          2,
+        ],
+        Array [
+          collect/componentA/componentA.js,
+          3,
+        ],
         Array [
           collect/componentA/index.js,
           1,
@@ -169,8 +220,8 @@ Object {
   },
   en: Object {
     Component A: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [
@@ -182,8 +233,8 @@ Object {
       translation: ,
     },
     Component B: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [
@@ -195,11 +246,23 @@ Object {
       translation: ,
     },
     Hello World: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [
+        Comment A,
+        Comment A again,
+        Hello comment,
+      ],
       flags: Array [],
       obsolete: false,
       origin: Array [
+        Array [
+          collect/componentA/componentA.js,
+          2,
+        ],
+        Array [
+          collect/componentA/componentA.js,
+          3,
+        ],
         Array [
           collect/componentA/index.js,
           1,
@@ -223,8 +286,8 @@ Object {
   cs: null,
   en: Object {
     Component A: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [
@@ -236,11 +299,23 @@ Object {
       translation: ,
     },
     Hello World: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [
+        Comment A,
+        Comment A again,
+        Hello comment,
+      ],
       flags: Array [],
       obsolete: false,
       origin: Array [
+        Array [
+          collect/componentA/componentA.js,
+          2,
+        ],
+        Array [
+          collect/componentA/componentA.js,
+          3,
+        ],
         Array [
           collect/componentA/index.js,
           1,
@@ -257,8 +332,8 @@ exports[`Catalog makeTemplate should collect and write a template 1`] = `null`;
 exports[`Catalog makeTemplate should collect and write a template 2`] = `
 Object {
   Component A: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [
@@ -270,11 +345,23 @@ Object {
     translation: ,
   },
   Hello World: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [
+      Comment A,
+      Comment A again,
+      Hello comment,
+    ],
     flags: Array [],
     obsolete: false,
     origin: Array [
+      Array [
+        collect/componentA/componentA.js,
+        2,
+      ],
+      Array [
+        collect/componentA/componentA.js,
+        3,
+      ],
       Array [
         collect/componentA/index.js,
         1,
@@ -288,51 +375,53 @@ Object {
 exports[`Catalog read should read file in given format 1`] = `
 Object {
   obsolete: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: true,
     origin: Array [],
     translation: Is marked as obsolete,
   },
   static: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [],
     translation: Static message,
   },
   veryLongString: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [],
     translation: One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin. He lay on his armour-like back, and if he lifted his head a little he could see his brown belly, slightly domed and divided by arches into stiff sections. The bedding was hardly able to cover it and seemed ready to slide off any moment. His many legs, pitifully thin compared with the size of the rest of him, waved about helplessly as he looked. "What's happened to me?" he thought. It wasn't a dream. His room, a proper human,
   },
   withComments: Object {
-    comment: undefined,
     comments: Array [
       Translator comment,
       This one might come from developer,
     ],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [],
     translation: Support translator comments separately,
   },
   withDescription: Object {
-    comment: Description is comment from developers to translators,
     comments: Array [],
+    extractedComments: Array [
+      Description is comment from developers to translators,
+    ],
     flags: Array [],
     obsolete: false,
     origin: Array [],
     translation: Message with description,
   },
   withFlags: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [
       fuzzy,
       otherFlag,
@@ -342,8 +431,8 @@ Object {
     translation: Keeps any flags that are defined,
   },
   withMultipleOrigins: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [
@@ -359,8 +448,8 @@ Object {
     translation: Message with multiple origin,
   },
   withOrigin: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [
@@ -380,8 +469,8 @@ exports[`Catalog readAll should read existing catalogs for all locales 1`] = `
 Object {
   cs: Object {
     Hello World: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [],
@@ -390,8 +479,8 @@ Object {
   },
   en: Object {
     Hello World: Object {
-      comment: undefined,
       comments: Array [],
+      extractedComments: Array [],
       flags: Array [],
       obsolete: false,
       origin: Array [],
diff --git a/packages/cli/src/api/formats/__snapshots__/lingui.test.ts.snap b/packages/cli/src/api/formats/__snapshots__/lingui.test.ts.snap
index 4cf6a970..af1ff828 100644
--- a/packages/cli/src/api/formats/__snapshots__/lingui.test.ts.snap
+++ b/packages/cli/src/api/formats/__snapshots__/lingui.test.ts.snap
@@ -36,7 +36,9 @@ exports[`lingui format should write catalog in lingui format 1`] = `
   },
   "withDescription": {
     "translation": "Message with description",
-    "description": "Description is comment from developers to translators"
+    "extractedComments": [
+      "Description is comment from developers to translators"
+    ]
   },
   "withComments": {
     "comments": [
diff --git a/packages/cli/src/api/formats/__snapshots__/po.test.ts.snap b/packages/cli/src/api/formats/__snapshots__/po.test.ts.snap
index bfcfe401..7d4c535c 100644
--- a/packages/cli/src/api/formats/__snapshots__/po.test.ts.snap
+++ b/packages/cli/src/api/formats/__snapshots__/po.test.ts.snap
@@ -3,9 +3,11 @@
 exports[`pofile format should correct badly used comments 1`] = `
 Object {
   withDescriptionAndComments: Object {
-    comment: Single description only,
     comments: Array [
       Translator comment,
+    ],
+    extractedComments: Array [
+      Single description only,
       Second description?,
     ],
     flags: Array [],
@@ -14,8 +16,9 @@ Object {
     translation: Second description joins translator comments,
   },
   withMultipleDescriptions: Object {
-    comment: First description,
-    comments: Array [
+    comments: Array [],
+    extractedComments: Array [
+      First description,
       Second comment,
       Third comment,
     ],
@@ -30,51 +33,53 @@ Object {
 exports[`pofile format should read catalog in pofile format 1`] = `
 Object {
   obsolete: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: true,
     origin: Array [],
     translation: Is marked as obsolete,
   },
   static: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [],
     translation: Static message,
   },
   veryLongString: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [],
     translation: One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin. He lay on his armour-like back, and if he lifted his head a little he could see his brown belly, slightly domed and divided by arches into stiff sections. The bedding was hardly able to cover it and seemed ready to slide off any moment. His many legs, pitifully thin compared with the size of the rest of him, waved about helplessly as he looked. "What's happened to me?" he thought. It wasn't a dream. His room, a proper human,
   },
   withComments: Object {
-    comment: undefined,
     comments: Array [
       Translator comment,
       This one might come from developer,
     ],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [],
     translation: Support translator comments separately,
   },
   withDescription: Object {
-    comment: Description is comment from developers to translators,
     comments: Array [],
+    extractedComments: Array [
+      Description is comment from developers to translators,
+    ],
     flags: Array [],
     obsolete: false,
     origin: Array [],
     translation: Message with description,
   },
   withFlags: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [
       fuzzy,
       otherFlag,
@@ -84,8 +89,8 @@ Object {
     translation: Keeps any flags that are defined,
   },
   withMultipleOrigins: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [
@@ -101,8 +106,8 @@ Object {
     translation: Message with multiple origin,
   },
   withOrigin: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [
@@ -119,8 +124,8 @@ Object {
 exports[`pofile format should throw away additional msgstr if present 1`] = `
 Object {
   withMultipleTranslation: Object {
-    comment: undefined,
     comments: Array [],
+    extractedComments: Array [],
     flags: Array [],
     obsolete: false,
     origin: Array [],
@@ -151,6 +156,7 @@ msgstr "Message with origin"
 msgid "withMultipleOrigins"
 msgstr "Message with multiple origin"
 
+#. Description is comment from developers to translators
 msgid "withDescription"
 msgstr "Message with description"
 
diff --git a/packages/cli/src/api/formats/lingui.test.ts b/packages/cli/src/api/formats/lingui.test.ts
index d391761b..c93efcb5 100644
--- a/packages/cli/src/api/formats/lingui.test.ts
+++ b/packages/cli/src/api/formats/lingui.test.ts
@@ -38,7 +38,7 @@ describe("lingui format", function () {
       },
       withDescription: {
         translation: "Message with description",
-        description: "Description is comment from developers to translators",
+        extractedComments: ["Description is comment from developers to translators"],
       },
       withComments: {
         comments: ["Translator comment", "This one might come from developer"],
diff --git a/packages/cli/src/api/formats/po.test.ts b/packages/cli/src/api/formats/po.test.ts
index ea1a2eb7..3cb2c5de 100644
--- a/packages/cli/src/api/formats/po.test.ts
+++ b/packages/cli/src/api/formats/po.test.ts
@@ -40,7 +40,7 @@ describe("pofile format", function () {
       },
       withDescription: {
         translation: "Message with description",
-        description: "Description is comment from developers to translators",
+        extractedComments: ["Description is comment from developers to translators"],
       },
       withComments: {
         comments: ["Translator comment", "This one might come from developer"],