Przeglądaj źródła

[enh] improve translation documentation

Thomas Pointhuber 8 lat temu
rodzic
commit
f833c3d129

+ 21
- 15
_sources/dev/translation.txt Wyświetl plik

@@ -6,23 +6,29 @@ run these commands in the root directory of searx
6 6
 Add new language
7 7
 ~~~~~~~~~~~~~~~~
8 8
 
9
-``pybabel init -i messages.pot -d searx/translations -l it``
9
+.. code:: shell
10
+
11
+    pybabel init -i messages.pot -d searx/translations -l it
10 12
 
11 13
 Update .po files
12 14
 ~~~~~~~~~~~~~~~~
13 15
 
14
-``./utils/update-translations.sh``
16
+.. code:: shell
17
+
18
+    ./utils/update-translations.sh
15 19
 
16 20
 You may have errors here. In that case, edit the
17 21
 ``update-translations.sh`` script to change ``pybabel`` to
18
-``pybabel-python2``
22
+``pybabel-python2 or pybabel2``
19 23
 
20 24
 After this step, you can modify the .po files.
21 25
 
22 26
 Compile translations
23 27
 ~~~~~~~~~~~~~~~~~~~~
24 28
 
25
-``pybabel compile -d searx/translations``
29
+.. code:: shell
30
+
31
+    pybabel compile -d searx/translations
26 32
 
27 33
 Transifex stuff
28 34
 ~~~~~~~~~~~~~~~
@@ -32,12 +38,14 @@ Init Project
32 38
 
33 39
 .. code:: shell
34 40
 
41
+    tx init # Transifex instance: https://www.transifex.com/asciimoo/searx/
42
+
35 43
     tx set --auto-local -r searx.messagespo 'searx/translations/<lang>/LC_MESSAGES/messages.po' \
36 44
     --source-lang en --type PO --source-file messages.pot --execute
37 45
 
38
-http://docs.transifex.com/developer/client/set
46
+http://docs.transifex.com/client/init/
39 47
 
40
-*TODO: mapping between transifex and searx*
48
+http://docs.transifex.com/client/set/
41 49
 
42 50
 Get translations
43 51
 ^^^^^^^^^^^^^^^^
@@ -46,29 +54,27 @@ Get translations
46 54
 
47 55
     tx pull -a
48 56
 
49
-http://docs.transifex.com/developer/client/pull
57
+http://docs.transifex.com/client/pull
50 58
 
51 59
 Upload source File
52 60
 ^^^^^^^^^^^^^^^^^^
53 61
 
54
-::
62
+.. code:: shell
55 63
 
56 64
     tx push -s
57 65
 
58 66
 Upload all Translation
59 67
 ^^^^^^^^^^^^^^^^^^^^^^
60 68
 
61
-::
69
+.. code:: shell
62 70
 
63 71
     tx push -s -t
64 72
 
65
-upload specifc Translation (only for admins)
66
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73
+upload specifc Translation
74
+~~~~~~~~~~~~~~~~~~~~~~~~~~
67 75
 
68
-::
76
+.. code:: shell
69 77
 
70 78
     tx push -t -l tr
71 79
 
72
-http://docs.transifex.com/developer/client/push
73
-
74
-*TODO: upload empty files? (new translations)*
80
+http://docs.transifex.com/client/push

+ 2
- 0
_static/pygments.css Wyświetl plik

@@ -4,8 +4,10 @@
4 4
 .highlight .err { border: 1px solid #FF0000 } /* Error */
5 5
 .highlight .k { color: #007020; font-weight: bold } /* Keyword */
6 6
 .highlight .o { color: #666666 } /* Operator */
7
+.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
7 8
 .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
8 9
 .highlight .cp { color: #007020 } /* Comment.Preproc */
10
+.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
9 11
 .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
10 12
 .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
11 13
 .highlight .gd { color: #A00000 } /* Generic.Deleted */

+ 37
- 8
_static/searchtools.js Wyświetl plik

@@ -10,6 +10,7 @@
10 10
  */
11 11
 
12 12
 
13
+/* Non-minified version JS is _stemmer.js if file is provided */ 
13 14
 /**
14 15
  * Porter Stemmer
15 16
  */
@@ -373,8 +374,7 @@ var Search = {
373 374
     }
374 375
 
375 376
     // lookup as search terms in fulltext
376
-    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, Scorer.term))
377
-                     .concat(this.performTermsSearch(searchterms, excluded, titleterms, Scorer.title));
377
+    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
378 378
 
379 379
     // let the scorer override scores with a custom scoring function
380 380
     if (Scorer.score) {
@@ -538,23 +538,47 @@ var Search = {
538 538
   /**
539 539
    * search for full-text terms in the index
540 540
    */
541
-  performTermsSearch : function(searchterms, excluded, terms, score) {
541
+  performTermsSearch : function(searchterms, excluded, terms, titleterms) {
542 542
     var filenames = this._index.filenames;
543 543
     var titles = this._index.titles;
544 544
 
545
-    var i, j, file, files;
545
+    var i, j, file;
546 546
     var fileMap = {};
547
+    var scoreMap = {};
547 548
     var results = [];
548 549
 
549 550
     // perform the search on the required terms
550 551
     for (i = 0; i < searchterms.length; i++) {
551 552
       var word = searchterms[i];
553
+      var files = [];
554
+      var _o = [
555
+        {files: terms[word], score: Scorer.term},
556
+        {files: titleterms[word], score: Scorer.title}
557
+      ];
558
+
552 559
       // no match but word was a required one
553
-      if ((files = terms[word]) === undefined)
560
+      if ($u.every(_o, function(o){return o.files === undefined;})) {
554 561
         break;
555
-      if (files.length === undefined) {
556
-        files = [files];
557 562
       }
563
+      // found search word in contents
564
+      $u.each(_o, function(o) {
565
+        var _files = o.files;
566
+        if (_files === undefined)
567
+          return
568
+
569
+        if (_files.length === undefined)
570
+          _files = [_files];
571
+        files = files.concat(_files);
572
+
573
+        // set score for the word in each file to Scorer.term
574
+        for (j = 0; j < _files.length; j++) {
575
+          file = _files[j];
576
+          if (!(file in scoreMap))
577
+            scoreMap[file] = {}
578
+          scoreMap[file][word] = o.score;
579
+        }
580
+      });
581
+
558 582
       // create the mapping
559 583
       for (j = 0; j < files.length; j++) {
560 584
         file = files[j];
@@ -576,7 +600,9 @@ var Search = {
576 600
       // ensure that none of the excluded terms is in the search result
577 601
       for (i = 0; i < excluded.length; i++) {
578 602
         if (terms[excluded[i]] == file ||
579
-          $u.contains(terms[excluded[i]] || [], file)) {
603
+            titleterms[excluded[i]] == file ||
604
+            $u.contains(terms[excluded[i]] || [], file) ||
605
+            $u.contains(titleterms[excluded[i]] || [], file)) {
580 606
           valid = false;
581 607
           break;
582 608
         }
@@ -584,6 +610,9 @@ var Search = {
584 610
 
585 611
       // if we have still a valid result we can add it to the result list
586 612
       if (valid) {
613
+        // select one (max) score for the file.
614
+        // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
615
+        var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
587 616
         results.push([filenames[file], titles[file], '', null, score]);
588 617
       }
589 618
     }

+ 9
- 9
dev/engine_overview.html Wyświetl plik

@@ -190,8 +190,8 @@ overrides are the following:</p>
190 190
 </div>
191 191
 <div class="section" id="example-code">
192 192
 <h3><a class="toc-backref" href="#id7">example code</a><a class="headerlink" href="#example-code" title="Permalink to this headline">¶</a></h3>
193
-<div class="code python highlight-python"><div class="highlight"><pre><span class="c"># engine dependent config</span>
194
-<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;general&#39;</span><span class="p">]</span>
193
+<div class="code python highlight-python"><div class="highlight"><pre><span class="c1"># engine dependent config</span>
194
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">]</span>
195 195
 <span class="n">paging</span> <span class="o">=</span> <span class="bp">True</span>
196 196
 <span class="n">language_support</span> <span class="o">=</span> <span class="bp">True</span>
197 197
 </pre></div>
@@ -313,17 +313,17 @@ used to specify a search request:</p>
313 313
 </div>
314 314
 <div class="section" id="id1">
315 315
 <h3><a class="toc-backref" href="#id11">example code</a><a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3>
316
-<div class="code python highlight-python"><div class="highlight"><pre><span class="c"># search-url</span>
317
-<span class="n">base_url</span> <span class="o">=</span> <span class="s">&#39;https://example.com/&#39;</span>
318
-<span class="n">search_string</span> <span class="o">=</span> <span class="s">&#39;search?{query}&amp;page={page}&#39;</span>
316
+<div class="code python highlight-python"><div class="highlight"><pre><span class="c1"># search-url</span>
317
+<span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://example.com/&#39;</span>
318
+<span class="n">search_string</span> <span class="o">=</span> <span class="s1">&#39;search?{query}&amp;page={page}&#39;</span>
319 319
 
320
-<span class="c"># do search-request</span>
320
+<span class="c1"># do search-request</span>
321 321
 <span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
322 322
     <span class="n">search_path</span> <span class="o">=</span> <span class="n">search_string</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
323
-        <span class="n">query</span><span class="o">=</span><span class="n">urlencode</span><span class="p">({</span><span class="s">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">}),</span>
324
-        <span class="n">page</span><span class="o">=</span><span class="n">params</span><span class="p">[</span><span class="s">&#39;pageno&#39;</span><span class="p">])</span>
323
+        <span class="n">query</span><span class="o">=</span><span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">}),</span>
324
+        <span class="n">page</span><span class="o">=</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">])</span>
325 325
 
326
-    <span class="n">params</span><span class="p">[</span><span class="s">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="n">search_path</span>
326
+    <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="n">search_path</span>
327 327
 
328 328
     <span class="k">return</span> <span class="n">params</span>
329 329
 </pre></div>

+ 9
- 9
dev/plugins.html Wyświetl plik

@@ -45,19 +45,19 @@
45 45
 searx.</p>
46 46
 <div class="section" id="example-plugin-py">
47 47
 <h2>example_plugin.py<a class="headerlink" href="#example-plugin-py" title="Permalink to this headline">¶</a></h2>
48
-<div class="code python highlight-python"><div class="highlight"><pre><span class="n">name</span> <span class="o">=</span> <span class="s">&#39;Example plugin&#39;</span>
49
-<span class="n">description</span> <span class="o">=</span> <span class="s">&#39;This plugin extends the suggestions with the word &quot;example&quot;&#39;</span>
50
-<span class="n">default_on</span> <span class="o">=</span> <span class="bp">False</span>  <span class="c"># disable by default</span>
48
+<div class="code python highlight-python"><div class="highlight"><pre><span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;Example plugin&#39;</span>
49
+<span class="n">description</span> <span class="o">=</span> <span class="s1">&#39;This plugin extends the suggestions with the word &quot;example&quot;&#39;</span>
50
+<span class="n">default_on</span> <span class="o">=</span> <span class="bp">False</span>  <span class="c1"># disable by default</span>
51 51
 
52
-<span class="n">js_dependencies</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">()</span>  <span class="c"># optional, list of static js files</span>
53
-<span class="n">css_dependencies</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">()</span>  <span class="c"># optional, list of static css files</span>
52
+<span class="n">js_dependencies</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">()</span>  <span class="c1"># optional, list of static js files</span>
53
+<span class="n">css_dependencies</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">()</span>  <span class="c1"># optional, list of static css files</span>
54 54
 
55 55
 
56
-<span class="c"># attach callback to the post search hook</span>
57
-<span class="c">#  request: flask request object</span>
58
-<span class="c">#  ctx: the whole local context of the post search hook</span>
56
+<span class="c1"># attach callback to the post search hook</span>
57
+<span class="c1">#  request: flask request object</span>
58
+<span class="c1">#  ctx: the whole local context of the post search hook</span>
59 59
 <span class="k">def</span> <span class="nf">post_search</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
60
-    <span class="n">ctx</span><span class="p">[</span><span class="s">&#39;search&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">suggestions</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;example&#39;</span><span class="p">)</span>
60
+    <span class="n">ctx</span><span class="p">[</span><span class="s1">&#39;search&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">suggestions</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s1">&#39;example&#39;</span><span class="p">)</span>
61 61
     <span class="k">return</span> <span class="bp">True</span>
62 62
 </pre></div>
63 63
 </div>

+ 1
- 1
dev/search_api.html Wyświetl plik

@@ -25,7 +25,7 @@
25 25
     <script type="text/javascript" src="../_static/doctools.js"></script>
26 26
     <link rel="top" title="searx 0.8.0 documentation" href="../index.html" />
27 27
     <link rel="next" title="Plugins" href="plugins.html" />
28
-    <link rel="prev" title="Installation" href="install/installation.html" />
28
+    <link rel="prev" title="Engine overview" href="engine_overview.html" />
29 29
    
30 30
   
31 31
   <link media="only screen and (max-device-width: 480px)" href="../_static/small_flask.css" type= "text/css" rel="stylesheet" />

+ 22
- 15
dev/translation.html Wyświetl plik

@@ -43,58 +43,65 @@
43 43
 <p>run these commands in the root directory of searx</p>
44 44
 <div class="section" id="add-new-language">
45 45
 <h2>Add new language<a class="headerlink" href="#add-new-language" title="Permalink to this headline">¶</a></h2>
46
-<p><code class="docutils literal"><span class="pre">pybabel</span> <span class="pre">init</span> <span class="pre">-i</span> <span class="pre">messages.pot</span> <span class="pre">-d</span> <span class="pre">searx/translations</span> <span class="pre">-l</span> <span class="pre">it</span></code></p>
46
+<div class="code shell highlight-python"><div class="highlight"><pre>pybabel init -i messages.pot -d searx/translations -l it
47
+</pre></div>
48
+</div>
47 49
 </div>
48 50
 <div class="section" id="update-po-files">
49 51
 <h2>Update .po files<a class="headerlink" href="#update-po-files" title="Permalink to this headline">¶</a></h2>
50
-<p><code class="docutils literal"><span class="pre">./utils/update-translations.sh</span></code></p>
52
+<div class="code shell highlight-python"><div class="highlight"><pre>./utils/update-translations.sh
53
+</pre></div>
54
+</div>
51 55
 <p>You may have errors here. In that case, edit the
52 56
 <code class="docutils literal"><span class="pre">update-translations.sh</span></code> script to change <code class="docutils literal"><span class="pre">pybabel</span></code> to
53
-<code class="docutils literal"><span class="pre">pybabel-python2</span></code></p>
57
+<code class="docutils literal"><span class="pre">pybabel-python2</span> <span class="pre">or</span> <span class="pre">pybabel2</span></code></p>
54 58
 <p>After this step, you can modify the .po files.</p>
55 59
 </div>
56 60
 <div class="section" id="compile-translations">
57 61
 <h2>Compile translations<a class="headerlink" href="#compile-translations" title="Permalink to this headline">¶</a></h2>
58
-<p><code class="docutils literal"><span class="pre">pybabel</span> <span class="pre">compile</span> <span class="pre">-d</span> <span class="pre">searx/translations</span></code></p>
62
+<div class="code shell highlight-python"><div class="highlight"><pre>pybabel compile -d searx/translations
63
+</pre></div>
64
+</div>
59 65
 </div>
60 66
 <div class="section" id="transifex-stuff">
61 67
 <h2>Transifex stuff<a class="headerlink" href="#transifex-stuff" title="Permalink to this headline">¶</a></h2>
62 68
 <div class="section" id="init-project">
63 69
 <h3>Init Project<a class="headerlink" href="#init-project" title="Permalink to this headline">¶</a></h3>
64
-<div class="code shell highlight-python"><div class="highlight"><pre>tx set --auto-local -r searx.messagespo &#39;searx/translations/&lt;lang&gt;/LC_MESSAGES/messages.po&#39; \
70
+<div class="code shell highlight-python"><div class="highlight"><pre>tx init # Transifex instance: https://www.transifex.com/asciimoo/searx/
71
+
72
+tx set --auto-local -r searx.messagespo &#39;searx/translations/&lt;lang&gt;/LC_MESSAGES/messages.po&#39; \
65 73
 --source-lang en --type PO --source-file messages.pot --execute
66 74
 </pre></div>
67 75
 </div>
68
-<p><a class="reference external" href="http://docs.transifex.com/developer/client/set">http://docs.transifex.com/developer/client/set</a></p>
69
-<p><em>TODO: mapping between transifex and searx</em></p>
76
+<p><a class="reference external" href="http://docs.transifex.com/client/init/">http://docs.transifex.com/client/init/</a></p>
77
+<p><a class="reference external" href="http://docs.transifex.com/client/set/">http://docs.transifex.com/client/set/</a></p>
70 78
 </div>
71 79
 <div class="section" id="get-translations">
72 80
 <h3>Get translations<a class="headerlink" href="#get-translations" title="Permalink to this headline">¶</a></h3>
73 81
 <div class="code shell highlight-python"><div class="highlight"><pre>tx pull -a
74 82
 </pre></div>
75 83
 </div>
76
-<p><a class="reference external" href="http://docs.transifex.com/developer/client/pull">http://docs.transifex.com/developer/client/pull</a></p>
84
+<p><a class="reference external" href="http://docs.transifex.com/client/pull">http://docs.transifex.com/client/pull</a></p>
77 85
 </div>
78 86
 <div class="section" id="upload-source-file">
79 87
 <h3>Upload source File<a class="headerlink" href="#upload-source-file" title="Permalink to this headline">¶</a></h3>
80
-<div class="highlight-python"><div class="highlight"><pre>tx push -s
88
+<div class="code shell highlight-python"><div class="highlight"><pre>tx push -s
81 89
 </pre></div>
82 90
 </div>
83 91
 </div>
84 92
 <div class="section" id="upload-all-translation">
85 93
 <h3>Upload all Translation<a class="headerlink" href="#upload-all-translation" title="Permalink to this headline">¶</a></h3>
86
-<div class="highlight-python"><div class="highlight"><pre>tx push -s -t
94
+<div class="code shell highlight-python"><div class="highlight"><pre>tx push -s -t
87 95
 </pre></div>
88 96
 </div>
89 97
 </div>
90 98
 </div>
91
-<div class="section" id="upload-specifc-translation-only-for-admins">
92
-<h2>upload specifc Translation (only for admins)<a class="headerlink" href="#upload-specifc-translation-only-for-admins" title="Permalink to this headline">¶</a></h2>
93
-<div class="highlight-python"><div class="highlight"><pre>tx push -t -l tr
99
+<div class="section" id="upload-specifc-translation">
100
+<h2>upload specifc Translation<a class="headerlink" href="#upload-specifc-translation" title="Permalink to this headline">¶</a></h2>
101
+<div class="code shell highlight-python"><div class="highlight"><pre>tx push -t -l tr
94 102
 </pre></div>
95 103
 </div>
96
-<p><a class="reference external" href="http://docs.transifex.com/developer/client/push">http://docs.transifex.com/developer/client/push</a></p>
97
-<p><em>TODO: upload empty files? (new translations)</em></p>
104
+<p><a class="reference external" href="http://docs.transifex.com/client/push">http://docs.transifex.com/client/push</a></p>
98 105
 </div>
99 106
 </div>
100 107
 

+ 21
- 15
docs/dev/translation.rst Wyświetl plik

@@ -6,23 +6,29 @@ run these commands in the root directory of searx
6 6
 Add new language
7 7
 ~~~~~~~~~~~~~~~~
8 8
 
9
-``pybabel init -i messages.pot -d searx/translations -l it``
9
+.. code:: shell
10
+
11
+    pybabel init -i messages.pot -d searx/translations -l it
10 12
 
11 13
 Update .po files
12 14
 ~~~~~~~~~~~~~~~~
13 15
 
14
-``./utils/update-translations.sh``
16
+.. code:: shell
17
+
18
+    ./utils/update-translations.sh
15 19
 
16 20
 You may have errors here. In that case, edit the
17 21
 ``update-translations.sh`` script to change ``pybabel`` to
18
-``pybabel-python2``
22
+``pybabel-python2 or pybabel2``
19 23
 
20 24
 After this step, you can modify the .po files.
21 25
 
22 26
 Compile translations
23 27
 ~~~~~~~~~~~~~~~~~~~~
24 28
 
25
-``pybabel compile -d searx/translations``
29
+.. code:: shell
30
+
31
+    pybabel compile -d searx/translations
26 32
 
27 33
 Transifex stuff
28 34
 ~~~~~~~~~~~~~~~
@@ -32,12 +38,14 @@ Init Project
32 38
 
33 39
 .. code:: shell
34 40
 
41
+    tx init # Transifex instance: https://www.transifex.com/asciimoo/searx/
42
+
35 43
     tx set --auto-local -r searx.messagespo 'searx/translations/<lang>/LC_MESSAGES/messages.po' \
36 44
     --source-lang en --type PO --source-file messages.pot --execute
37 45
 
38
-http://docs.transifex.com/developer/client/set
46
+http://docs.transifex.com/client/init/
39 47
 
40
-*TODO: mapping between transifex and searx*
48
+http://docs.transifex.com/client/set/
41 49
 
42 50
 Get translations
43 51
 ^^^^^^^^^^^^^^^^
@@ -46,29 +54,27 @@ Get translations
46 54
 
47 55
     tx pull -a
48 56
 
49
-http://docs.transifex.com/developer/client/pull
57
+http://docs.transifex.com/client/pull
50 58
 
51 59
 Upload source File
52 60
 ^^^^^^^^^^^^^^^^^^
53 61
 
54
-::
62
+.. code:: shell
55 63
 
56 64
     tx push -s
57 65
 
58 66
 Upload all Translation
59 67
 ^^^^^^^^^^^^^^^^^^^^^^
60 68
 
61
-::
69
+.. code:: shell
62 70
 
63 71
     tx push -s -t
64 72
 
65
-upload specifc Translation (only for admins)
66
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73
+upload specifc Translation
74
+~~~~~~~~~~~~~~~~~~~~~~~~~~
67 75
 
68
-::
76
+.. code:: shell
69 77
 
70 78
     tx push -t -l tr
71 79
 
72
-http://docs.transifex.com/developer/client/push
73
-
74
-*TODO: upload empty files? (new translations)*
80
+http://docs.transifex.com/client/push

+ 1
- 1
searchindex.js
Plik diff jest za duży
Wyświetl plik