Code Monkey home page Code Monkey logo

virtaal's Introduction

Translate Toolkit

Join the chat at https://gitter.im/translate/pootle Build Status Test Coverage Requirements Released version Supported Python versions License

The Translate Toolkit is a set of software and documentation designed to help make the lives of localizers both more productive and less frustrating. The Toolkit is part of the Translate project, hosted at <https://github.com/translate>.

The software includes programs to convert localization formats to the common PO, and emerging XLIFF format. There are also programs to check and manage PO and XLIFF files. Online documentation includes guides on using the tools, running a localization project and how to localize various projects from OpenOffice.org to Mozilla.

At its core the software contains a set of classes for handling various localization storage formats: DTD, properties, OpenOffice.org GSI/SDF, CSV, MO, Qt .ts, TMX, TBX, WordFast txt, Gettext .mo, Windows RC, and of course PO and XLIFF. It also provides scripts to convert between these formats.

Also part of the Toolkit are Python programs to create word counts, merge translations and perform various checks on translation files.

Important Links

Joining the Translate Project

If you would like to join the translate project mailing list then visit: <http://lists.sourceforge.net/lists/listinfo/translate-devel>.

The vision of the Translate Project is to be a meta project for localizers built on the premise that your language deserves to be a project on its own right not a poor cousin of the main project.

Most projects are inattentive to the needs and difficulties experienced by localizers. To that end the aim is to work towards creating tools and documentation that allows localizers to focus on what they do best: translating software.

Requirements

There are several extra requirements which you might to install to get full feature set. This cal be easily specified during pip installation:

# Install with XML support
pip install translate-toolkit[XML]

# Install all optional dependencies
pip install translate-toolkit[all]

Note

Please check requirements/*.txt:

pip install -r requirements/optional.txt

Will install all optional dependencies convering support for many other formats.

The Toolkit requires Python 3.8 or newer.

The package lxml is required. You should install version 4.6.3 or later. <http://lxml.de/> Depending on your platform, the easiest way to install might be through your system's package management. Alternatively you can try

pip install lxml

which should install the newest version from the web.

For Mac OSX, the following pages might be of help: <http://lxml.de/build.html#building-lxml-on-macos-x> <http://lxml.de/installation.html#macos-x>

The package lxml has dependencies on libxml2 and libxslt. Please check the lxml site for the recommended versions of these libraries if you need to install them separately at all. Most packaged versions of lxml will already contain these dependencies.

When the environment variable USECPO is set to 1, the toolkit will attempt to use libgettextpo from the gettext-tools package (it might have a slightly different name on your distribution). This can greatly speed up access to PO files, but has not yet been tested as extensively. Feedback is most welcome.

The package iniparse is necessary for ini2po and po2ini: <https://pypi.org/project/iniparse/>

The python-Levenshtein package will improve performance for fuzzy matching if it is available. This can improve the performance of pot2po, for example. It is optional and no functionality is lost if it is not installed, only speed. <http://sourceforge.net/projects/translate/files/python-Levenshtein/>

Functions in the lang.data module can supply functions to translate language names using the pycountry package. It can even translate names in the format Language (Country) such as English (South Africa) This is used by Pootle and Virtaal. If the package is not installed, the language names will simply appear in English. It is therefore recommended you install the pycountry package.

The package vobject is needed for ical2po and po2ical.

The aeidon package is needed for sub2po and po2sub. Some Unicode encoded files (including most files from <http://dotsub.com/>) require version 0.14 or later.

Trados TXT TM support requires the BeautifulSoup parser <http://www.crummy.com/software/BeautifulSoup/>

Markdown support requires the mistletoe parser <https://github.com/miyuchina/mistletoe>

Program overview

Use --help to find the syntax and options for all programs.

  • Converters:

    oo2po    - convert between OpenOffice.org GSI files and PO
    oo2xliff - convert between OpenOffice.org GSI files and XLIFF
    moz2po   - convert between Mozilla files and PO
    csv2po   - convert PO format to CSV for editing in a spreadsheet program
    php2po   - PHP localisable string arrays converter.
    ts2po    - convert Qt Linguist (.ts) files to PO
    txt2po   - convert simple text files to PO
    html2po  - convert HTML to PO (beta)
    md2po    - convert Markdown to PO
    xliff2po - XLIFF (XML Localisation Interchange File Format) converter
    prop2po  - convert Java .properties files to PO
    po2wordfast - Wordfast Translation Memory converter
    po2tmx   - TMX (Translation Memory Exchange) converter
    pot2po   - PO file initialiser
    csv2tbx  - Create TBX (TermBase eXchange) files from Comma Separated
               Value (CSV) files
    ini2po   - convert .ini files to to PO
    ical2po  - Convert iCalendar files (*.ics) to PO
    sub2po   - Convert many subtitle files to PO
    resx2po  - convert .Net Resource (.resx) files to PO
    
  • Tools (Quality Assurance):

    pofilter - run any of the 40+ checks on your PO files
    pomerge  - merge corrected translations from pofilter back into
               your existing PO files.
    poconflicts - identify conflicting use of terms
    porestructure - restructures po files according to poconflict directives
    pogrep   - find words in PO files
    
  • Tools (Other):

    pocompile - create a Gettext MO files from PO or XLIFF files
    pocount   - count translatable file formats (PO, XLIFF)
    podebug   - Create comment in your PO files' msgstr which can
                then be used to quickly track down mistranslations
                as the comments appear in the application.
    posegment - Break a PO or XLIFF files into sentence segments,
                useful for creating a segmented translation memory.
    poswap    - uses a translation of another language that you
                would rather use than English as source language
    poterminology - analyse PO or POT files to build a list of
                    frequently occurring words and phrases
    

virtaal's People

Contributors

demurgos avatar dupuy avatar dwaynebailey avatar elchevive avatar friedelwolff avatar jleclanche avatar julen avatar kant avatar khaledhosny avatar prescott66 avatar rffontenelle avatar scootergrisen avatar scrool avatar unho avatar yarons avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

virtaal's Issues

Sane behaviour for source text

Source text should be disabled from editing, and should probably not have spell checking. If we have spell checking in the source, it should be English, or preferably a source language value obtained from Globals.

File changed status is not reset when full undo stack is poped

1) virtaal some.po
2) Add a character
3) Title bar indicates file has changed by adding *
4) Ctrl-Z # to undo the last change and return to the unedited state
5) File is still marked as changed and the user will receive warnings if they try to close it.

We should be able to track the undo stack and now when we are back to where we started with the file being edited.

Ability to update from new project template

We should be able to update the current file to a new project template (POT). This should simply be done with pot2po from the toolkit. Specifying an optional TM might or other options (fuzzy matching options) might be useful.

Files without write permission are editable and crash when we try saving

Try this:
1) Create readonly.po
2) chmod -w readonly.po
3) virtaal readonly.po
4) Edit the file
5) Ctrl-S

You will get this error:
Traceback (most recent call last):
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/main_window.py”, line 323, in on_file_save
self.document.store.save()
File “/home/dwayne/dev/lm/trunk/translate/storage/base.py”, line 489, in save
fileobj = fileobj.
_class__(filename, “w”)
IOError: [Errno 13] Permission denied: ‘readonly.po’

We should:
1) Warn people when we open such files
2) Not allow any editing functionality
3) Allow someone to select ‘Save As…’

Activating search with no document open gives traceback

If virtaal is open with no document open yet, F3 results in this traceback:
Traceback (most recent call last):
File “src/virtaal/virtaal/main_window.py”, line 150, in on_search
self.document.mode_selector.select_mode_by_name(‘Search’)
AttributeError: ‘NoneType’ object has no attribute ’mode
selector’

Fail correctly on broken XML files

Do the following:
cat “Not an XLIFF file” > not.xlf
virtaal not.xlf

This will generate this traceback:

Traceback (most recent call last):
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 132, in
main(sys.argv)
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 129, in main
runner(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 116, in default_runner
run_virtaal(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 96, in run_virtaal
prog = VirTaal(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/main_window.py”, line 125, in init
self.load_file(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/main_window.py”, line 214, in load_file
self.document = document.Document(filename, store=store)
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/document.py”, line 100, in init
self.store = factory.getobject(filename)
File “/home/dwayne/dev/lm/trunk/translate/storage/factory.py”, line 182, in getobject
store = storeclass.parsefile(storefile)
File “/home/dwayne/dev/lm/trunk/translate/storage/base.py”, line 504, in parsefile
newstore = cls.parsestring(storestring)
File “/home/dwayne/dev/lm/trunk/translate/storage/xliff.py”, line 485, in parsestring
xliff = super(xlifffile, cls).parsestring(storestring)
File “/home/dwayne/dev/lm/trunk/translate/storage/base.py”, line 459, in parsestring
newstore.parse(storestring)
File “/home/dwayne/dev/lm/trunk/translate/storage/lisa.py”, line 321, in parse
self.document = etree.fromstring(xml).getroottree()
File “lxml.etree.pyx”, line 2385, in lxml.etree.fromstring (src/lxml/lxml.etree.c:21626)
File “parser.pxi”, line 1359, in lxml.etree.parseMemoryDocument (src/lxml/lxml.etree.c:54696)
File “parser.pxi”, line 1246, in lxml.etree.parseDoc (src/lxml/lxml.etree.c:53668)
File “parser.pxi”, line 798, in lxml.etree.BaseParser.parseDoc (src/lxml/lxml.etree.c:50996)
File “parser.pxi”, line 452, in lxml.etree.
ParserContext.
handleParseResultDoc (src/lxml/lxml.etree.c:48120)
File “parser.pxi”, line 536, in lxml.etree.
handleParseResult (src/lxml/lxml.etree.c:48966)
File “parser.pxi”, line 478, in lxml.etree.
raiseParseError (src/lxml/lxml.etree.c:48384)
lxml.etree.XMLSyntaxError: Start tag expected, ‘<’ not found, line 1, column 1

While this is a really a toolkit problem I’m placing it here so that we are aware of it for a VirTaal release. Once someone is working on it we can push it to the correct product.

Opening bad .po files causes a traceback and hang

If you open a .po that has nothing to do with po. try renaming a .sh to .po and opening it. Then we get this traceback:

Traceback (most recent call last):
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/main_window.py”, line 168, in on_file_open
if self.open_file(filename, chooser):
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/main_window.py”, line 208, in open_file
return self.load_file(filename, dialog=dialog)
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/main_window.py”, line 239, in load_file
self.unit_grid = unit_grid.UnitGrid(self)
File "/home/dwayne/dev/lm/trunk/virtaal/virtaal/unit
grid.py", line 67, in init
raise ValueError(_(“The file did not contain anything to translate.”))
ValueError: The file did not contain anything to translate.

Ideally we should be giving some dialogue box or at least reporting the traceback. We should be able to get back to translating in the application and not hang on the tracback.

My ideal solution. Simply open in a giant text widget and warn that this file seems not to be a PO file.

Fail gracefully for files we don't know how to handle

This problem is inherited from Translate Toolkit which throws an unkown filetype error like such:

Traceback (most recent call last):
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 132, in
main(sys.argv)
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 129, in main
runner(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 116, in default_runner
run_virtaal(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 96, in run_virtaal
prog = VirTaal(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/main_window.py”, line 125, in init
self.load_file(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/main_window.py”, line 214, in load_file
self.document = document.Document(filename, store=store)
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/document.py”, line 100, in init
self.store = factory.getobject(filename)
File “/home/dwayne/dev/lm/trunk/translate/storage/factory.py”, line 176, in getobject
storeclass = getclass(storefile, ignore)
File “/home/dwayne/dev/lm/trunk/translate/storage/factory.py”, line 157, in getclass
raise ValueError(“Unknown filetype (%s)” % storefilename)
ValueError: Unknown filetype (phpeg.php)

We should fail gracefully in this situation. By graceful failure I would mean:
1) Start VirTaal
2) Show a non-model warning that we could not open the file

Fail gracefully on old QM files

An old QM file will produce this error. This probably means that we should have a way to capture nice errors from the toolkit. And also that we think about which messages we are likely to get and how to handle each.

[dwayne@localhost storage]$ virtaal /usr/share/sqliteman/sqliteman_cs.qm
Traceback (most recent call last):
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 132, in
main(sys.argv)
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 129, in main
runner(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 116, in default_runner
run_virtaal(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/bin/virtaal”, line 96, in run_virtaal
prog = VirTaal(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/main_window.py”, line 125, in init
self.load_file(startup_file)
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/main_window.py”, line 214, in load_file
self.document = document.Document(filename, store=store)
File “/home/dwayne/dev/lm/trunk/virtaal/virtaal/document.py”, line 100, in init
self.store = factory.getobject(filename)
File “/home/dwayne/dev/lm/trunk/translate/storage/factory.py”, line 182, in getobject
store = storeclass.parsefile(storefile)
File “/home/dwayne/dev/lm/trunk/translate/storage/base.py”, line 504, in parsefile
newstore = cls.parsestring(storestring)
File “/home/dwayne/dev/lm/trunk/translate/storage/base.py”, line 459, in parsestring
newstore.parse(storestring)
File “/home/dwayne/dev/lm/trunk/translate/storage/qm.py”, line 126, in parse
raise ValueError(“Old .qm format with no source defined”)
ValueError: Old .qm format with no source defined

Empty strings going to unicode normalization

This is in the toolkit but exposed through editing a very large XLIFF file generated with odf2xliff.

The first is that within lang.data::normalize we seem to be sending None values to be normalized.

Once sorted that exposed the None strings further within the pogrep searching functions.

With both fixes applied we get no further tracebacks. I’m not sure my patches are fixing the problem at the right level.

Entities in PO comments cause GTK to throw styling warnings

If you open a PO file with comments that contains entities e.g.

  1. . “
  2. : $lang[‘doublequoteopening’]

msgid ““”
msgstr ““”

Then you will get the following errors as you move between units:

~/dev/lm/trunk/virtaal/virtaal/main_window.py:369: GtkWarning: Failed to set text from markup due to error parsing markup: Error on line 1: Entity name ‘ldquo’ is not known
gtk.main()

Quotes handled incorrectly in Virtaal

When translating a PO file in Virtaal that has smart quotes in it, Virtaal displays it as straight quotes. If the user types ordinary straight quotes, the resultant PO file contains escaped straight quotes, not smart quotes. If the user copies the quotes from the source box, the resultant PO file does contain smart quotes correctly.

However, since the user cannot see in VirTaal which quotes are opening quotes and which ones are closing quotes, he might accidently copy an opening quote to the position of a closing quote, and this shows up in the resultant PO file.

Attached:
- original myfile.po (the original file)
- from virtaal 1 myfile.po (from VirTaal, when typed straight quotes)
- from virtaal 1 myfile.po (from VirTaal, when copied from source box)
- quotething.jpg (screenshot of original myfile.po in VirTaal)

Provide a simple way of working in modes

Modes could be defined as changes in several aspects of the user interface, but for a start, it should define a list of relevant units within the current store which are considered active/relevant whereas the others are only displayed for context.

Initial types to implement (will be expanded later):
- normal translation mode (all translatable units are included)
- quick translation mode (all translatable units are included which are untranslated or fuzzy)

Think about the implications if an edit to a unit could/should remove it from the current list it is part of (translating an untranslated unit, removing the search term from a search hit)

Drop .locamotion directory

We need to drop the .locamotion directory that we are using for Virtaal.

Ideally we need a directory that can be used by all tools. Or simply name after the tool itself.

.translate-toolkit
.virtaal
.pootle
etc

Error getting plural information

When opening a PO file without any headers and without the “nplurals” and “plural” fields in ~/.locamotion/virtaal.ini, the open fails with the following message: “Error opening file: ‘nplurals’”.

The problem has been isolated to the compute_nplurals() function in document.py. For some reason the ask_for_language_details() sub-function is not called.

Dwayne suggests that defaults be used in stead of asking the user, because a new user would not know what to answer.

Navigation via Ctrl+Up Arrow/Down Arrow fails on opening second file

Ctrl+Up Arrow and Ctrl+Down Arrow work correctly on opening the first file. But on opening subsequent files it fails.

To reproduce:
run_virtaal.py
File→Open→Select some file
Ctrl+UP and Ctrl+DOWN – work correctly
File→Open→Select another file
Ctrl+UP and Ctrl+DOWN now fail to work correctly

Review proper handling of escapes

Check that we handle escapes properly:
\
\n
\t
(\r?)

Check that the files correspond to what we expect, and can also do things like \n, etc.

Plurals handled incorrectly

When Virtaal encounters plurals in the PO file, it displays the singular in source and the plural in target, in the edit box. See screenshot. I’m using Windows XP Pro. I also attach the PO file with which this happened.

Remove fuzzy attribute for files that are not PO: build custom attribute list as needed

We shouldn’t have fuzzy displayed for stores that have no ‘fuzzy’ attribute.

There are various solution/stages to solving this problem and we might want to raise separate bugs for each:

1) Don’t display it if there is no equivalent: e.g. mo has no concept of this, while XLF could be interpreted as having one especially if it is PO XLIFF variant. Wordfast also doesn’t have this concept and neither does TMX or TBX.

2) Push attributes to the storage classes and build the attribute list depending on the format being displayed. Some attributes exclude a unit from even being displayed e.g. obsolsete units in .ts and .po

Opening of PO file without plural information causes generated headers to be displayed as the first unit

When opening a PO file without plural information in its headers, the plural information is read from ~/.locamotion/virtaal.ini. The information found here is then added to the PO store (store.updateheaderplural(nplurals, pluralequation), document.py:88, revision 8481). This causes the header to be displayed as the first unit and the last unit to disappear.

Although not confirmed, I believe that this is because of the fact that the store is never reloaded after the headers are added (via the updateheaderplural() call above).

This bug is related to bug #523.

Show helpfull items in the help menu

Depends on:
- [x] #380 Ability to update from new project template
- [x] #645 Prompt user with ‘Save As…’ for POT files

Ideas for the help menu:
Help Menu
- Web documentation – http://translate.sourceforge.net/wiki/virtaal/index
- Localisation guide – http://translate.sourceforge.net/wiki/guide/index
- Tutorial – (copy of) local POT file
- Report a bug in VirTaal – Wiki page explaining procedure (search, information, etc.) or http://bugs.locamotion.org/enter_bug.cgi?product=VirTaal
- About

The translation box should grow as the text grows

When editing an empty strings, the text box is of one line hight but it doesn’t grow when the text becomes several lines long i.e. the box is one line only and one needs to move the scroll bar up and down to see other lines. The text box should grow at least of 4 or 5 lines max. before having a scroll bar, as the current behavior makes translating long strings painful experience.

Virtaal should use (and package) fonts designed for optimal readibility

Depends on:
- [x] #477 Quotes handled incorrectly in Virtaal

Some characters are deceptively similar at small font sizes, and we should help users to distinguish between them while translating. We could solve this by packaging a useful font and using it for the source (and optionally the target) language. Eventually fonts might be configurable by the user, but we need to make good default choices.

Some candidates for better than default font use include:
- smart quotes vs normal quotes (bug #477)
- I vs l vs 1 vs |
- double spaces (perhaps using fancy ligatures to indicate them properly)
- start and end spaces

There are probably several more issues to consider, we might want to make them block this bug.

Launch mailer for Msgid-Bugs

Allow the translator to launch a URI set in the Report-Msgid-Bugs-To entry so that they can report bugs.

I would err on the easiest option which would do nothing but launch the app. It might be worth thinking about how to launch it for a specific unit. Or to allow errors to be collected and documented and then sent as a batch in an email.

By doing unit level reporting we could then str the unit and add the comments allow clear demarcation. It could present some problems in that a user might want to report each item separately to aid discussion.

Modes selector is set to 'lablel' when no file is open

If you start VirTaal with no file open then the mode selector at the bottom has an undefined label of ‘label’. I think this should be hidden if no file is open or at least should be set to the last mode that the user was using.

Search functionality

1. Case sensitivity
2. Light up translation units that match the search
3. Replacement functionality

VirTaal will trash .qm files since we can't write them

Try this:
1) virtaal some.qm
2) Make a change
3) ls -l some.qm

Files size is zero.

We can read .qm files but we can’t write them.

VirTaal should be able to get info about whether we can write a given file format from the Translate Toolkit. If we are unable to write it then we should:
1) Show that the file is read only
2) Disable any editing functionality

Implement initial navigation features

Some basic features for navigation is needed. The idea is to make it easy and natural to navigate both in the editing area, as well as in the bigger “document”. Ideally it should be consistent, with for example Ctrl being used for intra-unit navigation (probably with the exception of Backspace and Delete).

For the editing area:
Normal editing shortcuts should remain. Things like the arrows, backspace, Ctrl+Backspace, Ctrl+Delete should all work as expected.

For intra-unit navigation
Ctrl+Up/Down – one unit up/down in the current mode
Ctrl+PgUp/PgDn – many units / a page of units up/down in the current mode
Alternatively PgUp/PgDn could just scroll visually without actually changing the cell currently edited.

Implement proper cross-platform URL handlers

Virtaal currently uses xdg-open and xdg-email, but this does not work on Windows and Mac OSX. Check the URL of ways of doing this better. Check specific cases, like using Firefox as default browser in KDE should not open Konqueror, etc.

Toggling fuzzy does not make file savable

To reproduce:
- Open a file
- Mark any number of non-fuzzy units as fuzzy and/or vice versa

Current behaviour:
- The file is not savable, even though it was changed.

Expected behaviour:
- The file should be savable via Ctrl+S or the “File” menu.

Autocomplete incorrectly completes on enter

If the last word of a translation has a candidate completion with autocomplete, pressing enter will accept the suggested completion and submit the translation.

Scenario:
Translate this program
Vertaal hierdie program
If Virtaal suggests “programme”, the suggestion is accepted, even though it wasn’t accepted with the tab key, and Virtaal already advanced onto the next unit.

Fix undo

Plumbing changes broke the undo functionality.

Missing files in Virtaal package

The following files/dirs are missing from the Virtaal tarball:
- LICENSE
- po/
- maketranslations – builds the translated mimetypes and desktop file

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.