What's Changed
* `assert_locale()` should suggest locales in its error message by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1741
* Upgrade pip dependencies and simplify their version constraints by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1742
* Remove unused `__reduce__()` implementations by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1743
* Use Click for CLI logging by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1744
* Document plugins by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1724
* Document event dispatching by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1746
* Fix incorrectly rendered configuration examples in the documentation by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1747
* Fix bugs where translation coverage percentages and a link were not displayed correctly by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1748
* Add a machine ID API by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1751
* Rename machine IDs to machine names by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1753
* Add a command to create new projects by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1750
* Simplify Click error handling by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1754
* Fix superfluous punctuation by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1756
* Reuse existing assertion chains by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1755
* Add commands to create and update project translations by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1757
* Expand the installation documentation by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1759
* Merge `ProjectConfiguration` base URL and root path into a single URL by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1760
* Introduce a `Localizable` backed by static translations by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1762
* Simplify `Server` and remove its dependency on aiohttp by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1645
* Make the project title and author translatable by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1761
* Fix a bug where project locales would be dumped and loaded in different orders by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1763
* Make `CacheTestBase` reusable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1764
* Make template test utilities reusable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1765
* Make configuration collection test utilities reusable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1766
* Make the cards on the documentation site's front page responsive by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1768
* Add plugin testing utilities that are usable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1767
* Remove the Sphinx link check, so websites being down does not disrupt Betty's builds by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1771
* Do not use abstract classes for tests, because Pytest does not run inherited test methods by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1770
* Fix a typo on the documentation front page by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1772
* Add entity testing utilities that are usable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1769
* Use event type instances instead of types by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1775
* Add `ConfigurationCollectionTestBase.test_load_item()` by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1776
* Make `assert_machine_name()` an assertion factory by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1777
* Add `copy_tree()` to performantly ensure a directory's contents exist at a destination by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1778
* Remove the search shortcut because it conflicted with other, more common shortcuts by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1779
* Add event type testing utilities that are usable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1781
* Add extension testing utilities that are usable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1780
* Add assertion testing utilities that are usable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1783
* Add Command Line Interface testing utilities that are usable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1782
* Add server testing utilities that are usable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1784
* Relicense Betty under the GNU General Public License, Version 3 or later by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1785
* Fix and clarify the plugin documentation by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1788
* Remove remaining imports between test files by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1789
* Document the test utilities by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1790
* Fix invalid module references in documentation by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1791
* Do not explicitly set a documentation version ourselves by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1792
* Fix an unused import by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1794
* Make Pytest fixtures usable by third parties by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1796
* Use f-strings everywhere by bartfeenstra in https://github.com/bartfeenstra/betty/pull/1798
**Full Changelog**: https://github.com/bartfeenstra/betty/compare/0.4.0a4...0.4.0a5