Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
2def9ab
feat: Add crowdin strings for German
darcywong00 Jan 16, 2026
a216b6a
feat: Add German to UI list
darcywong00 Jan 16, 2026
6f5ff51
feat: add script to build contributors.md
kingsuper195 Jan 16, 2026
c721aa0
chore: address review comments and polish
kingsuper195 Jan 18, 2026
1ed35b6
Merge pull request #639 from kingsuper195/feat/contributors
mcdurdin Jan 18, 2026
d03fb6e
feat: automatically refresh contributors.md weekly
mcdurdin Jan 18, 2026
d57ccf8
Merge pull request #637 from keymanapp/feat/crowdin-de
darcywong00 Jan 19, 2026
8dd1af2
chore: update BOOTSTRAP_VERSION to v1.0.9
keyman-server Jan 19, 2026
c88efb5
Merge pull request #641 from keymanapp/auto/update-bootstrap-version-…
keyman-status Jan 19, 2026
c7d9dd6
Merge pull request #640 from keymanapp/feat/autogen-contributors
mcdurdin Jan 20, 2026
f130e05
auto: refresh contributors.md
keyman-server Jan 20, 2026
48e29af
Merge pull request #642 from keymanapp/auto/contributors
keyman-status Jan 20, 2026
1dc25cd
feat: Add Crowdin GHA to update source
darcywong00 Jan 22, 2026
c4444f3
refactor: Consolidate hint strings on keyboard search page
darcywong00 Jan 23, 2026
d7de4f4
chore: Update comment
darcywong00 Jan 23, 2026
ec72da1
Apply suggestions from code review
darcywong00 Jan 23, 2026
b34fc1e
Merge pull request #644 from keymanapp/chore/refactor/search-strings
darcywong00 Jan 23, 2026
8e5c78f
Merge pull request #643 from keymanapp/workflow-crowdin
darcywong00 Jan 23, 2026
5e3fd94
auto: refresh contributors.md
keyman-server Jan 25, 2026
649da2a
Merge pull request #645 from keymanapp/auto/contributors
keyman-status Jan 25, 2026
787e2d8
feat: link contributors in
mcdurdin Jan 26, 2026
8be558d
chore: split minor contributors into separate lines
mcdurdin Jan 26, 2026
2f30cf1
feat: add srl295 to developers
srl295 Jan 27, 2026
5900efd
Merge pull request #647 from keymanapp/srl295/aboutme
mcdurdin Jan 27, 2026
352b09a
Merge branch 'master' into feat/contributors-link
mcdurdin Jan 27, 2026
d719893
Merge pull request #646 from keymanapp/feat/contributors-link
mcdurdin Jan 27, 2026
d1b5e65
feat: polish the contributors page and consolidate
mcdurdin Jan 28, 2026
4cddafd
chore: remove external dependency repos to clarify contributors
mcdurdin Jan 28, 2026
a68825d
feat: add Lorna, David, EberhardS, Markus
mcdurdin Jan 28, 2026
4b171d9
chore: simplify urls for bio links
mcdurdin Jan 28, 2026
8a9ee93
Merge pull request #648 from keymanapp/feat/contributors-polish
mcdurdin Jan 29, 2026
ef3d690
Merge branch 'staging' into auto/A19S21-merge-master-into-staging
keyman-server Jan 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/.htaccess
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Deny from all
37 changes: 37 additions & 0 deletions .github/workflows/crowdin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Upload translation sources to Crowdin https://crowdin.com/project/keymancom

on:
schedule:
# At 06:00 every day (eventually only on Monday). https://crontab.cronhub.io/
- cron: '0 6 * * *'

jobs:
upload-sources-to-crowdin:
if: github.repository == 'keymanapp/keyman.com'
runs-on: ubuntu-latest

steps:

- name: Checkout
uses: actions/checkout@v4

- name: crowdin action
uses: crowdin/github-action@v2.14.0
with:
upload_sources: true

# This is the name of the top-level directory that Crowdin will use for files.
# Note that this is not a "branch" in the git sense, but more like a top-level directory in your Crowdin project.
# This branch does NOT need to be manually created. It will be created automatically by the action.
crowdin_branch_name: master
config: 'crowdin.yml'

# TODO if we want action to auto create PRs
#GITHUB_TOKEN: $

# See https://crowdin.com/project/keymancom/tools/api
project_id: ${{ secrets.KEYMAN_COM_CROWDIN_PROJECT_ID }}

# A personal access token
# See https://crowdin.com/settings#api-key to generate a token
token: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
26 changes: 26 additions & 0 deletions .github/workflows/refresh-contributors.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Refresh contributors
on:
schedule:
# run 12:15am on Sunday
- cron: '15 0 * * 0'
workflow_dispatch:

jobs:
refresh-contributors:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v4.1.5

- name: Refresh contributors.md with new contributors
id: refresh-contributors
shell: bash
env:
GITHUB_TOKEN: ${{secrets.KEYMAN_SERVER_REPO_ACCESS_PAT}}
CROWDIN_TOKEN: ${{secrets.CROWDIN_CONTRIBUTORS_TOKEN}}
run: |
cd _scripts/contributors
./run.sh
3 changes: 3 additions & 0 deletions _includes/2020/templates/Menu.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ private static function render_globe_dropdown($number = 0): void {
<ul>
<!-- Just use autonyms -->
<li><a href="<?= Menu::change_ui_language('en'); ?>">English</a></li>
<li><a href="<?= Menu::change_ui_language('de'); ?>">Deutsch</a></li>
<li><a href="<?= Menu::change_ui_language('es'); ?>">Español</a></li>
<li><a href="<?= Menu::change_ui_language('fr'); ?>">Français</a></li>
<li><a href="<?= Menu::change_ui_language('km'); ?>">ខ្មែរ</a></li>
Expand Down Expand Up @@ -132,6 +133,7 @@ private static function render_phone_menu(object $fields): void {
<h3>About</h3>
<ul>
<li><a href="/about/">About Keyman</a></li>
<li><a href="/about/team">The team</a></li>
<li><a href="/about/get-involved">Get Involved</a></li>
<li><a href="/training">Training Events</a></li>
<li><a href="/free/">Free on all Platforms</a></li>
Expand Down Expand Up @@ -255,6 +257,7 @@ private static function render_top_menu(object $fields): void {
<div class="menu-dropdown-inner">
<ul>
<li><a href="/about/">About Keyman</a></li>
<li><a href="/about/team">The team</a></li>
<li><a href="/about/get-involved">Get Involved</a></li>
<li><a href="/training">Training Events</a></li>
<li><a href="/free/">Free on all Platforms</a></li>
Expand Down
55 changes: 55 additions & 0 deletions _includes/locale/strings/keyboards/de.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

/*
* Keyman is copyright (C) SIL Global. MIT License.
*
* German strings for keyboards/index.php
*/

declare(strict_types=1);

return [
# Page Title
"page_title" => "Tastatursuche",

# Page Description
"page_description" => "Suche nach Keyman Tastaturen",

# Keyboard search bar
"keyboard_search" => "Tastatursuche:",

# Search bar placeholder
"enter_language" => "Sprache oder Tastatur eingeben",

# Search Button Value
"search" => "Suchen",

# Link to start a new keyboard search
"new_search" => "Neue Suche",

# Search box instruction (Popular keyboards | All keyboards)
"enter_name" => "Geben Sie den Namen einer Tastatur oder Sprache ein, nach der gesucht werden soll",

# Search box link for popular keyboards
"popular_keyboards" => "Beliebte Tastaturen",

# Search box link for all Keyman keyboards
"all_keyboards" => "Alle Tastaturen",

# Search box hint: List header
"hints" => "Hinweise",

# Search box hint: Description
"searchbox_description" =>
"Die Suche gibt immer eine Liste von Tastaturen zurück und sucht nach Tastaturnamen und Details, Sprachnamen, Ländernamen und Skriptnamen.",

# Search box hint (line 2):
"searchbox_hint_2" =>
"Sie können Präfixe anwenden %1\$s (Tastaturen), %2\$s (Sprachen), %3\$s (Skripte, Schreibsysteme) oder
%4\$s (Länder), um Ihre Suchergebnisse zu filtern. Zum Beispiel sucht %5\$s nach Tastaturen für Sprachen in Thailand.",

# Search box hint (line 3):
"searchbox_hint_3" =>
"Präfix %1\$s verwenden, um nach einem BCP 47 Sprachtag zu suchen. Zum Beispiel sucht %2\$s nach Tigrigna (Äthiopien)."

];
155 changes: 155 additions & 0 deletions _includes/locale/strings/keyboards/details/de.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
<?php

/*
* Keyman is copyright (C) SIL Global. MIT License.
*
* Default English strings for keyboards/keyboard-details.php
* When exporting strings from crowdin, convert \\$s to \$s
*/

declare(strict_types=1);

return [
# Placeholder for new keyboard search
"new_keyboard_search" => "Neue Tastatursuche",

# Search Button Value
"search" => "Suchen",

# Keyman Developer clone keyboard box

# Fill in New Project Details box below and click OK to clone {filename}
"new_project_details" =>
"Füllen Sie das Feld Neue Projektdetails aus und klicken Sie auf OK, um %1\$s zu klonen.",

# "Install keyboard" button text
"install_keyboard" => "Tastatur installieren",

# "Install keyboard" button description
"install_keyboard_button_description" =>
"Installiert %1\$s für %2\$s auf diesem Gerät",

# keyboard download is not supported on this device
"keyboard_not_supported" =>
"Diese Tastatur wird auf diesem Gerät nicht unterstützt. Möglicherweise finden Sie unten weitere Optionen.",

# Try this keyboard heading
"try_this_keyboard" => "Diese Tastatur testen",

# "Use keyboard online" button text
"use_keyboard_online" => "Tastatur online verwenden",

# "Full online editor" button text
"full_online_editor" => "Vollständiger Online-Editor",

# "Use keyboard online" button description
"use_keyboard_button_description" =>
"Verwenden Sie %1\$s in Ihrem Webbrowser. Sie müssen nichts installieren.",

# Scan this QR code
"scan_qr_code" =>
"Scannen Sie diesen Code, um diese Tastatur auf einem anderen Gerät zu laden",

# Headers in Keyboard Details section

"keyboard_details" => "Details der Tastatur",

"keyboard_ID" => "Tastatur ID",

"supported_platforms" => "Unterstützte Plattformen",

"author" => "Autor",

"license" => "Lizenz",

"documentation" => "Dokumentation",

"keyboard_help" => "Hilfe zur Tastatur",

"help_not_available" => "Keine Hilfe verfügbar.",

"source" => "Quelle",

"source_not_available" => "Quelle nicht verfügbar.",

"keyboard_version" => "Tastaturversion",

"last_updated" => "Zuletzt aktualisiert",

"package_download" => "Paket herunterladen",

"monthly_downloads" => "Monatliche Downloads",

"total_downloads" => "Gesamtzahl der Downloads",

# Total Downloads title - Downloads since {date}
"downloads_since" => "Downloads seit %1\$s",

# Date to start counting downloads
"date_counting" => "Oktober 2019",

"encoding" => "Encodierung",

# Encoding list
"encoding_list" => "Unicode, Legacy (ANSI)",

# Unicode encoding
"unicode" => "Unicode",

# Legacy (ANSI) encoding
"legacy_ansi" => "Legacy (ANSI)",

# Minimum Keyman Version
"minimum_version" => "Minimale %1\$s Version",

"related_keyboards" => "Ähnliche Tastaturen",

# This keyboard is not available on keyman.com
"keyboard_not_available" => "Diese Tastatur ist nicht verfügbar auf %1\$s",

"deprecated" => "(veraltet)",

"new_version" => "(neue Version)",

"supported_languages" => "Unterstützte Sprachen",

# Expand {count} more >>
"expand_more" => "Erweitern Sie %1\$s mehr >>",

# << Collapse
"collapse" => "<< Einklappen",

"permanent_link_to_this_keyboard" => "Permanenter Link zu dieser Tastatur:",

## Obsolete keyboard notes

"important_note" => "Wichtiger Hinweis:",

"obsolete_version" =>
"Dies ist eine veraltete Version dieser Tastatur, die Sie nicht ohne guten Grund verwenden sollten. Sonst klicken Sie hier, um die neue Version zu installieren, genannt",

"instead" => ", stattdessen.",

"view_obsolete_details" => "Zeige stattdessen Details für veraltete Version",

"new_search" => "Neue Suche",

## TODO: Previous/Next pagination handled in search.js


## Errors

# Failed to load keyboard package [ID]
"failed_to_load_keyboard_package" => "Fehler beim Laden des Tastaturpakets %1\$s",

# Error returned from api.keyman.com: {error string}
"error_returned_from_api" => "Fehler von %1\$s: %2\$s",

# Keyboard package [ID] not found)'Failed to load keyboard package ' .
"package_not_found" => "Tastaturpaket %1\$s nicht gefunden.",

# Sorry, this keyboard requires Keyman {minimum version} or higher.
"requires_keyman_minimum_version" =>
"Diese Tastatur benötigt Keyman %1\$s oder höher."

];
41 changes: 10 additions & 31 deletions _includes/locale/strings/keyboards/en.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Keyman is copyright (C) SIL Global. MIT License.
*
* Default English strings for keyboards/index.php
* Don't escape $s when uploading source to crowdin because exports will escape \$s to \\$s
* When exporting strings from crowdin, convert \\$s to \$s
*/

declare(strict_types=1);
Expand Down Expand Up @@ -43,35 +43,14 @@
# Search box hint: Description
"searchbox_description" =>
"The search always returns a list of keyboards. It searches for keyboard names and details, language names, country names and script names.",

# Search box hint: available prefixes to use in the search
"searchbox_hint" => "You can apply prefixes",

# (keyboards)
"keyboards" => "(keyboards)",

# (languages)
"languages" => "(languages)",

# (scripts, writing systems) or...
"scripts_ws" => "(scripts, writing systems) or",

# (countries) to filter your search results...
"countries_to_filter" =>
"(countries) to filter your search results. For example",

# Search box hint: example of country search
"thailand_searches" =>
"searches for keyboards for languages used in Thailand.",

# Search box hint: BCP 47 prefix
"use_prefix" => "Use prefix",

# Search box hint: BCP 47 language example
"to search for a BCP 47 language tag, for example" =>
"to search for a BCP 47 language tag, for example",

# Search box hint: BCP 47 language example
"searches_tigrigna" => "searches for Tigrigna (Ethiopia)."

# Search box hint (line 2):
"searchbox_hint_2" =>
"You can apply prefixes %1\$s (keyboards) %2\$s (languages) %3\$s (scripts, writing systems) or
%4\$s (countries) to filter your search results. For example %5\$s searches for keyboards for languages used in Thailand.",

# Search box hint (line 3):
"searchbox_hint_3" =>
"Use prefix %1\$s to search for a BCP 47 language tag, for example %2\$s searches for Tigrigna (Ethiopia).",

];
Loading