feat(projects): rewrite project texts with verified facts
Old copy was generic and did not match the code. Texts now describe the real features: PlayStation sync, file imports, tests, security. Add per-game itch.io links, new chips, and a test that checks every About project key exists in en and de.
This commit is contained in:
1 parent
106d39453d
commit
8681508cb6
5 files changed
+250
-185
No files matched your search
@@ -5,6 +5,8 @@ import { MatIconRegistry } from '@angular/material/icon';
|
||||
import { provideRouter } from '@angular/router';
|
||||
import { provideTranslateService } from '@ngx-translate/core';
|
||||
import { AboutComponent } from './about.component';
|
||||
import en from '../../../assets/i18n/en.json';
|
||||
import de from '../../../assets/i18n/de.json';
|
||||
|
||||
/**
|
||||
* No translations are loaded, so the translate pipe echoes the key back. That is
|
||||
@@ -151,6 +153,26 @@ describe('AboutComponent', () => {
|
||||
});
|
||||
|
||||
describe('projects', () => {
|
||||
it('every project key exists in en and de', () => {
|
||||
const keys = fixture.componentInstance.projectKeys.flatMap(project => [
|
||||
`${project.key}.TITLE`,
|
||||
`${project.key}.DESCRIPTION`,
|
||||
`${project.key}.LINK_INTERNAL`,
|
||||
`${project.key}.HIGHLIGHTS.P1`,
|
||||
`${project.key}.HIGHLIGHTS.P2`,
|
||||
`${project.key}.HIGHLIGHTS.P3`,
|
||||
...(project.externalLink ? [`${project.key}.LINK_EXTERNAL`] : []),
|
||||
]);
|
||||
|
||||
const missing = Object.entries({ en, de }).flatMap(([language, translations]) =>
|
||||
keys
|
||||
.filter(key => typeof resolve(translations, key) !== 'string')
|
||||
.map(key => `${language}: ${key}`)
|
||||
);
|
||||
|
||||
expect(missing).toEqual([]);
|
||||
});
|
||||
|
||||
it('lists To Be Played and links to its project dialog', () => {
|
||||
expect(textOf('mat-card strong')).toContain('ABOUT.PROJECT.TBP.TITLE');
|
||||
|
||||
@@ -191,4 +213,10 @@ describe('AboutComponent', () => {
|
||||
expect(fixture.debugElement.query(By.css('[data-testid="contact-mail"]'))).toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
||||
function resolve(translations: unknown, key: string): unknown {
|
||||
return key
|
||||
.split('.')
|
||||
.reduce<unknown>((node, part) => (node as Record<string, unknown> | undefined)?.[part], translations);
|
||||
}
|
||||
});
|
||||
@@ -74,11 +74,13 @@ export class ProjectsComponent implements OnInit, OnDestroy {
|
||||
'PROJECTS.TBP.BULLET_2',
|
||||
'PROJECTS.TBP.BULLET_3',
|
||||
'PROJECTS.TBP.BULLET_4',
|
||||
'PROJECTS.TBP.BULLET_5',
|
||||
],
|
||||
challenges: [
|
||||
'PROJECTS.TBP.CHALLENGE_1',
|
||||
'PROJECTS.TBP.CHALLENGE_2',
|
||||
'PROJECTS.TBP.CHALLENGE_3',
|
||||
'PROJECTS.TBP.CHALLENGE_4',
|
||||
],
|
||||
learnings: [
|
||||
'PROJECTS.TBP.LEARNING_1',
|
||||
@@ -129,6 +131,7 @@ export class ProjectsComponent implements OnInit, OnDestroy {
|
||||
'PROJECTS.PLAYGROUND.BULLET_2',
|
||||
'PROJECTS.PLAYGROUND.BULLET_3',
|
||||
'PROJECTS.PLAYGROUND.BULLET_4',
|
||||
'PROJECTS.PLAYGROUND.BULLET_5',
|
||||
],
|
||||
challenges: [
|
||||
'PROJECTS.PLAYGROUND.CHALLENGE_1',
|
||||
@@ -139,7 +142,7 @@ export class ProjectsComponent implements OnInit, OnDestroy {
|
||||
'PROJECTS.PLAYGROUND.LEARNING_2',
|
||||
],
|
||||
isFeatured: false,
|
||||
technologies: ['Angular', 'TypeScript', 'SCSS', 'HTML', 'Gitea Actions', 'Docker']
|
||||
technologies: ['Angular', 'TypeScript', 'Tailwind CSS', 'WebGPU', 'GLSL', 'Babylon.js', 'Gitea Actions', 'Docker']
|
||||
},
|
||||
{
|
||||
identifier: "elmucho",
|
||||
@@ -159,13 +162,14 @@ export class ProjectsComponent implements OnInit, OnDestroy {
|
||||
challenges: [
|
||||
'PROJECTS.EL_MUCHO.CHALLENGE_1',
|
||||
'PROJECTS.EL_MUCHO.CHALLENGE_2',
|
||||
'PROJECTS.EL_MUCHO.CHALLENGE_3',
|
||||
],
|
||||
learnings: [
|
||||
'PROJECTS.EL_MUCHO.LEARNING_1',
|
||||
'PROJECTS.EL_MUCHO.LEARNING_2',
|
||||
],
|
||||
isFeatured: false,
|
||||
technologies: ['Unity', 'C#', 'Steamworks', 'Git']
|
||||
technologies: ['Unity', 'C#', 'Steamworks']
|
||||
},
|
||||
{
|
||||
identifier: "gamejams",
|
||||
@@ -175,7 +179,12 @@ export class ProjectsComponent implements OnInit, OnDestroy {
|
||||
images: AssetsConstants.GAME_JAMS_IMAGES.map(url => ({ url, source: '' })),
|
||||
icon: 'videogame_asset',
|
||||
assets: '',
|
||||
links: [{ name: 'PROJECTS.LINK_TO_PROJECT', url: 'https://itch.io/c/6628860/lobos-collection' }],
|
||||
links: [
|
||||
{ name: 'Peter Blue and the carnival of death', url: 'https://lobothedark.itch.io/beansjam' },
|
||||
{ name: 'Arkonauts', url: 'https://lobothedark.itch.io/arkonauts' },
|
||||
{ name: 'Sloth Bros', url: 'https://lobothedark.itch.io/sloth-bros' },
|
||||
{ name: 'PROJECTS.GAME_JAMS.LINK_COLLECTION', url: 'https://itch.io/c/6628860/lobos-collection' }
|
||||
],
|
||||
bulletPoints: [
|
||||
'PROJECTS.GAME_JAMS.BULLET_1',
|
||||
'PROJECTS.GAME_JAMS.BULLET_2',
|
||||
@@ -191,7 +200,7 @@ export class ProjectsComponent implements OnInit, OnDestroy {
|
||||
'PROJECTS.GAME_JAMS.LEARNING_2',
|
||||
],
|
||||
isFeatured: false,
|
||||
technologies: ['Unity', 'C#', 'Git']
|
||||
technologies: ['Unity', 'C#']
|
||||
},
|
||||
{
|
||||
identifier: "diploma",
|
||||
@@ -207,17 +216,19 @@ export class ProjectsComponent implements OnInit, OnDestroy {
|
||||
'PROJECTS.DIPLOMA.BULLET_2',
|
||||
'PROJECTS.DIPLOMA.BULLET_3',
|
||||
'PROJECTS.DIPLOMA.BULLET_4',
|
||||
'PROJECTS.DIPLOMA.BULLET_5',
|
||||
],
|
||||
challenges: [
|
||||
'PROJECTS.DIPLOMA.CHALLENGE_1',
|
||||
'PROJECTS.DIPLOMA.CHALLENGE_2',
|
||||
'PROJECTS.DIPLOMA.CHALLENGE_3',
|
||||
],
|
||||
learnings: [
|
||||
'PROJECTS.DIPLOMA.LEARNING_1',
|
||||
'PROJECTS.DIPLOMA.LEARNING_2',
|
||||
],
|
||||
isFeatured: false,
|
||||
technologies: ['Java', 'Performance', 'Algorithm', 'Simulation']
|
||||
technologies: ['Java', 'BVH / k-DOP', 'Collision detection', 'Cloth simulation']
|
||||
},
|
||||
{
|
||||
identifier: "tribble-the-homeserver",
|
||||
@@ -241,13 +252,15 @@ export class ProjectsComponent implements OnInit, OnDestroy {
|
||||
{ name: 'Jellyfin', url: 'https://jellyfin.org/' },
|
||||
{ name: 'AdGuard Home', url: 'https://adguard.com/en/adguard-home/overview.html' },
|
||||
{ name: 'Paperless-ngx', url: 'https://paperless-ngx.com/' },
|
||||
{ name: 'Tailscale', url: 'https://tailscale.com/' }
|
||||
{ name: 'Tailscale', url: 'https://tailscale.com/' },
|
||||
{ name: 'Watchtower', url: 'https://containrrr.dev/watchtower/' }
|
||||
],
|
||||
bulletPoints: [
|
||||
'PROJECTS.TRIBBLE.BULLET_1',
|
||||
'PROJECTS.TRIBBLE.BULLET_2',
|
||||
'PROJECTS.TRIBBLE.BULLET_3',
|
||||
'PROJECTS.TRIBBLE.BULLET_4',
|
||||
'PROJECTS.TRIBBLE.BULLET_5',
|
||||
],
|
||||
challenges: [
|
||||
'PROJECTS.TRIBBLE.CHALLENGE_1',
|
||||
@@ -258,7 +271,7 @@ export class ProjectsComponent implements OnInit, OnDestroy {
|
||||
'PROJECTS.TRIBBLE.LEARNING_2',
|
||||
],
|
||||
isFeatured: false,
|
||||
technologies: ['Ubuntu Server', 'Docker', 'Portainer', 'Traefik', 'Gitea', 'Jellyfin', 'AdGuard Home', 'Paperless-ngx', 'Tailscale']
|
||||
technologies: ['Ubuntu Server', 'Docker', 'Portainer', 'Traefik', 'Gitea', 'Jellyfin', 'AdGuard Home', 'Paperless-ngx', 'Tailscale', 'Watchtower']
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
Reference in new issue
Block a user