# How the Market Modes System Works for Localized Evaluation (DACH, French, Japanese, Turkish) in Career‑Ops

> Discover how Career-Ops market modes enable localized evaluation for DACH, French, Japanese, and Turkish markets. Learn about output language decoupling and market-specific vocabulary.

- Repository: [Santiago Fernández de Valderrama/career-ops](https://github.com/santifer/career-ops)
- Tags: deep-dive
- Published: 2026-08-20

---

**The Career‑Ops market modes system decouples output language from market‑specific vocabulary using a `language.modes_dir` directory convention, allowing localized evaluation for DACH, French, Japanese, and Turkish markets through translated mode files and persistent profile configuration.**

Career‑Ops, an open‑source career operations toolkit by santifer, implements a **two‑layer localization architecture** that separates *how results are displayed* from *what market concepts are evaluated*. This design lets users generate English reports while analyzing German salary structures, or produce French output when assessing Japanese employment contracts.

## The Core Separation: Output Language vs. Market Vocabulary

The system's flexibility stems from treating two concerns independently:

- **`language.output`** — controls the human‑facing language of generated reports (defaults to English)
- **`language.modes_dir`** — determines which market‑specific vocabulary and evaluation rules are loaded

This separation lives in [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml), where users persist their preferences:

```yaml
language:
  output: en          # Report language remains English

  modes_dir: modes/de  # But load DACH‑specific terminology

```

When `modes_dir` points to a subdirectory like `modes/de/` or `modes/fr/`, the agent reads translated mode files from that location instead of the base `modes/` folder.

## Supported Market Locales and Directory Structure

The repository ships with base English modes under `modes/` (including [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md), [`modes/apply.md`](https://github.com/santifer/career-ops/blob/main/modes/apply.md), and [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md)). For localized evaluation, each target market receives its own subdirectory:

| Market | Directory | Status | Key Terminology |
|--------|-----------|--------|---------------|
| **DACH** (Germany, Austria, Switzerland) | `modes/de/` | Active | 13. Monatsgehalt, Tarifvertrag, Urlaubsgeld |
| **French** | `modes/fr/` | Active | 13e mois, convention collective, primes |
| **Japanese** | `modes/ja/` | Placeholder | Ready for localization |
| **Turkish** | `modes/tr/` | Placeholder | Ready for localization |

Each locale directory contains translated versions of high‑impact evaluation modes plus a market‑specific [`_shared.md`](https://github.com/santifer/career-ops/blob/main/_shared.md) that overrides the base shared context.

## Two‑Step Activation: Session Prompt vs. Permanent Profile

The German [`README.md`](https://github.com/santifer/career-ops/blob/main/README.md) in [`modes/de/README.md`](https://github.com/santifer/career-ops/blob/main/modes/de/README.md) documents a **two‑step activation model**:

1. **Per‑session prompt** — Explicitly instruct the agent: *"Use the German modes under `modes/de/`"*

2. **Permanent profile configuration** — Set `language.modes_dir` in [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) for automatic loading on every start

The permanent approach ensures consistent evaluation without repeated prompting, while session‑level switching enables ad‑hoc multilingual analysis.

## What Changes When a Market Mode Activates?

Switching `modes_dir` triggers three specific overrides documented in the source:

- **Shared context replacement** — `modes/<locale>/_shared.md` supersedes [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md), injecting market‑specific legal and cultural concepts
- **Core mode translation** — Evaluation modes like [`oferta.md`](https://github.com/santifer/career-ops/blob/main/oferta.md), [`apply.md`](https://github.com/santifer/career-ops/blob/main/apply.md), and [`pipeline.md`](https://github.com/santifer/career-ops/blob/main/pipeline.md) are replaced with locale equivalents (e.g., [`angebot.md`](https://github.com/santifer/career-ops/blob/main/angebot.md), [`postuler.md`](https://github.com/santifer/career-ops/blob/main/postuler.md), [`pipeline.md`](https://github.com/santifer/career-ops/blob/main/pipeline.md))
- **Preserved output formatting** — Reports still respect `language.output`, so DACH concepts can appear in English text, or French concepts in Japanese output

## Extending to Japanese and Turkish Markets

The placeholder directories `modes/ja/` and `modes/tr/` follow the same extension pattern established by the DACH and French implementations:

1. Create [`modes/xx/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/xx/_shared.md) with culturally specific clauses
2. Translate the four high‑impact modes: `oferta`, `apply`, `pipeline`, plus market equivalents
3. Add a [`README.md`](https://github.com/santifer/career-ops/blob/main/README.md) explaining activation and vocabulary, mirroring [`modes/de/README.md`](https://github.com/santifer/career-ops/blob/main/modes/de/README.md)

No code changes are required—the `language.modes_dir` pointer handles the integration automatically.

## Programmatic Access to Mode Configuration

Custom scripts can respect the profile setting by loading [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) directly:

```javascript
import yaml from 'js-yaml';
import fs from 'fs';

const profile = yaml.load(fs.readFileSync('config/profile.yml', 'utf8'));
const modesDir = profile.language?.modes_dir ?? 'modes';

// Load the appropriate shared context for the active market
const shared = fs.readFileSync(`${modesDir}/_shared.md`, 'utf8');

```

This pattern enables tooling that automatically adapts to the user's configured market without hardcoded paths.

## Key Configuration and Documentation Files

| File | Purpose |
|------|---------|
| [`config/profile.example.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.example.yml) | Demonstrates `language.modes_dir` configuration |
| [`modes/de/README.md`](https://github.com/santifer/career-ops/blob/main/modes/de/README.md) | German market activation guide and vocabulary list |
| [`modes/fr/README.md`](https://github.com/santifer/career-ops/blob/main/modes/fr/README.md) | French market activation guide and vocabulary list |
| [`AGENTS.md`](https://github.com/santifer/career-ops/blob/main/AGENTS.md) | Master table of supported market directories |
| [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md) | Base shared context overridden by locale versions |

## Summary

- Career‑Ops uses **`language.modes_dir`** to isolate market‑specific vocabulary from output language
- Active locales (DACH, French) and placeholders (Japanese, Turkish) live under `modes/<locale>/`
- **Per‑session prompts** or **permanent profile settings** activate localized evaluation
- Each locale overrides [`_shared.md`](https://github.com/santifer/career-ops/blob/main/_shared.md) and core evaluation modes while preserving `language.output`
- New markets extend the system by adding translated files—no architectural changes needed

## Frequently Asked Questions

### How do I switch between market modes in Career‑Ops?

You have two options: add `language.modes_dir: modes/de` (or `modes/fr`, `modes/ja`, `modes/tr`) to [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) for automatic loading, or explicitly tell the agent during a session to use a specific modes directory. The profile approach persists across restarts.

### Can I write reports in English while using German market terminology?

Yes. The `language.output` field controls display language independently from `language.modes_dir`. Set `output: en` and `modes_dir: modes/de` to generate English reports that correctly reference DACH concepts like "13. Monatsgehalt" and "Tarifvertrag."

### What files must be translated to add Japanese or Turkish support?

Create a `modes/ja/` or `modes/tr/` directory with: (1) a market‑specific [`_shared.md`](https://github.com/santifer/career-ops/blob/main/_shared.md) for cultural context, (2) translated versions of the four high‑impact modes (`oferta`, `apply`, `pipeline`), and (3) a [`README.md`](https://github.com/santifer/career-ops/blob/main/README.md) documenting activation and vocabulary. The existing [`modes/de/README.md`](https://github.com/santifer/career-ops/blob/main/modes/de/README.md) serves as the reference template.

### Where is the complete list of supported market modes documented?

The [`AGENTS.md`](https://github.com/santifer/career-ops/blob/main/AGENTS.md) file in the repository root contains a market‑mode table listing all supported directories and their associated terminology, as referenced in the source analysis.