# XRPL Dev Portal

The [XRP Ledger Dev Portal](https://xrpl.org) is the authoritative source for XRP Ledger documentation, including the `rippled` server, client libraries, and other open-source XRP Ledger software.

To build the site locally:

1. Install [**Dactyl**](https://github.com/ripple/dactyl) and `lxml`:

        sudo pip3 install dactyl lxml

2. Clone the repo and change into its directory:

        git clone git@github.com:XRPLF/xrpl-dev-portal.git && cd xrpl-dev-portal

3. Build the site to the `out/` directory:

        dactyl_build -t en

If you get an error, try upgrading Dactyl before building:

      sudo pip3 install --upgrade dactyl

For more details, see the [contribution guidelines (EN)](CONTRIBUTING.md) ([日本語](CONTRIBUTING.ja.md)) and the [contributor Code of Conduct (EN)](CODE_OF_CONDUCT.md) ([日本語](CODE_OF_CONDUCT.ja.md)).

## Domain Verification Checker

If you make changes to the [Domain Verification Checker](https://xrpl.org/validator-domain-verifier.html) tool and edit the domain-verifier-checker.js file, you will need to do the following:

1. Install [webpack](https://webpack.js.org/) and required libraries via npm:

        npm install webpack webpack-cli --save-dev
        npm install ripple-binary-codec ripple-address-codec ripple-keypairs

2. From the project root directory (this step may be different depending on how you installed webpack)

        cd assets/js
        webpack-cli domain-verifier-checker.js --optimize-minimize -o domain-verifier-bundle.js

3. Build the site:

        cd ../..
        dactyl_build -t en

## Locale Strings

The templates can contain strings that are intended to be translated. These strings are marked off with `{% trans %}` and `{% endtrans %}` tags. You can't have any Jinja block control structures in these tags, but you can have some HTML markup and some basic Jinja variable-printing logic. See the [Jinja Documentation](https://jinja.palletsprojects.com/en/2.11.x/templates/#i18n-in-templates) for what's possible.

If you make changes to these strings, or want to add or update a translation, you'll need to do some extra steps to manage the locale files. These steps require the [Babel](http://babel.pocoo.org/) (`pybabel`) commandline utility. To install it:

```sh
sudo pip3 install Babel
```

You don't need Babel to build and view the site otherwise.


### Add a language

This repo has English (en) and Japanese (ja) locales set up already. To add a language (do this from the repo top dir):

```sh
$ pybabel init -l ja -i ./locale/messages.pot -o ./locale/ja/LC_MESSAGES/messages.po
```

Instead of `ja` (in two places in the above line!!) use the locale code for the language you plan to add. There's no exhaustive, definitive list, but [this list of locale codes](https://www.science.co.il/language/Locale-codes.php) is a good starting place.

This creates a "PO" file (`./locale/ja/LC_MESSAGES/messages.po`) with empty translations for the strings in the templates, based on the "PO Template" file (`./locale/messages.pot`).

To actually add translations for strings, you need to edit the new PO file for this translation. You can edit the PO file file with a text editor, or use a more advanced tool if you're a pro. Don't change the `msgid` values, _do_ change the `msgstr` values.

When you're done translating, [compile the PO files](#compile-strings).

### Update Strings

If there are new or updated `{% trans %}` tags in the templates, first use this command to extract them:

```sh
$ pybabel extract -F ./locale/babel.cfg -o ./locale/messages.pot ./
```

Then, update _every_ language's `.po` files with the list of strings, as follows:

```sh
$ pybabel update -l ja -d ./locale/ -i ./locale/messages.pot
```

The above example is for Japanese (`-l ja`). **Repeat for each language code.**

Now edit the PO files (for example, `locale/ja/LC_MESSAGES/messages.po`) to add translations for each newly-added string. Again, **repeat for each language.**

If you only want to change an existing translation for a given string that hasn't changed in the original, you can skip straight to editing the PO files without running any `update` or `extract` commands.

After you've edited all the PO files, be sure to [compile them](#compile-strings).

### Compile Strings

Whether you added a language, added new strings, or tweaked an existing translation, you must compile the PO files (text) to MO files (binary) to get Dactyl to use them.

To compile all PO files:

```sh
$ pybabel compile -f -d ./locale/
```

If you added a new language for the first time, you need to make sure its target definition (in the `dactyl-config.yml` file) has the MO file in the `locale_file` field.

After that, next time you build the site using Dactyl it should pull the updated translations!

## Issues, Projects, and Project Boards

Use GitHub Issues under the [`xrpl-dev-portal`](https://github.com/XRPLF/xrpl-dev-portal) repository to report bugs, feature requests, and suggestions for the XRP Ledger Documentation or the `xrpl.org` website. 

For issues related to `rippled` or client libraries (`xrpl.js`, `xrpl-py`, and others), use the respective source repository under [`https://github.com/XRPLF`](https://github.com/XRPLF).

If you are a contributor, use GitHub Projects and Project Boards to plan and track updates to xrpl.org. 

### Project Board `xrpl-docs`

The [`xrpl-docs`](https://github.com/orgs/XRPLF/projects/4) Kanban board is used to plan and track updates to the XRP Ledger Documentation. Contributors must update the status of an issue as it progresses through different stages.

The `xrpl-docs` board has six columns based on the status of issues in this repository:

* **No Status**: New or existing issues that no one has triaged yet.

* **Backlog**: Issues that represent tasks to be done eventually. They should contain actionable and helpful information for a contributor to work on addressing the issue.

* **Planned**: Issues with assignees who plan to address them in the near future, like 2-4 weeks.

* **In Progress**: Issues that a contributor is actively working on.

* **In Review**: Issues with a proposed fix that is currently being reviewed. These should be associated with an open pull request.

* **Done**: Issues that have been completed, whose related content updates have been merged.

