Language lookup
The static Languages facade covers the common lookup paths.
<?php
use Alto\Language\Languages;
$php = Languages::get('php');
$rust = Languages::fromExtension('rs');
$python = Languages::fromAlias('py');
$make = Languages::fromFilename('/project/Makefile');Extensions accept an optional leading dot and are normalized to lowercase.
Aliases are case-insensitive. Exact filenames retain their registered case.
Every lookup returns null when no definition matches.
Resolve an unknown identifier
<?php
$language = Languages::resolve($identifier);resolve() tries, in order:
- Exact slug.
- Alias.
- Extension.
- Exact filename or filename extension.
Use a specific method whenever the identifier type is already known. It makes the fallback behavior explicit and avoids an accidental alias match.
Use an injectable registry
<?php
use Alto\Language\LanguageRegistry;
$registry = new LanguageRegistry();
$language = $registry->fromFilename('example.ts');LanguageRegistry exposes the same lookup, catalog, and relationship methods
without global state. Prefer it in services that use dependency injection.
Check the lookup boundary
This standalone example shows case and suffix behavior without reading any file:
<?php
require __DIR__.'/vendor/autoload.php';
use Alto\Language\Languages;
foreach (['Dockerfile', 'dockerfile', 'home.html.twig', 'settings.unknown'] as $filename) {
printf("%s => %s\n", $filename, Languages::fromFilename($filename)?->slug ?? 'unknown');
}
printf("alias JS => %s\n", Languages::fromAlias('JS')?->slug);
printf("extension .PHP => %s\n", Languages::fromExtension('.PHP')?->slug);Output:
Dockerfile => dockerfile
dockerfile => unknown
home.html.twig => twig
settings.unknown => unknown
alias JS => javascript
extension .PHP => php
If a lookup returns null, choose an application fallback or register metadata
for that language. Language does not examine content or calculate detection
confidence; use content detection in a separate component if the filename is not
enough.