You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为默认土耳其语的多语言站点单个Action设置不同名称?

嘿,这个需求太常见啦!不用搞两个重复的Action,核心就是利用路由本地化来让同一个接口/页面响应不同语言的URL。我分几种主流框架给你具体说怎么实现:

针对ASP.NET Core的解决方案

如果你用的是ASP.NET Core,这两种方式都能完美解决问题:

方式1:多路由属性+自动切换文化

直接给同一个Action添加两个路由属性,然后在Action里根据访问的路径自动设置对应语言:

public class CertificateController : Controller
{
    // 土耳其语默认路径
    [Route("/Sertifika")]
    // 英语路径(优先级稍高,避免冲突)
    [Route("/Certificate", Order = 1)]
    public IActionResult Index()
    {
        // 根据访问路径自动切换语言,用Cookie保存偏好
        var targetCulture = Request.Path.Value.Equals("/Certificate", StringComparison.OrdinalIgnoreCase) 
            ? "en-US" 
            : "tr-TR";
        
        var cookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(targetCulture));
        Response.Cookies.Append(CookieRequestCultureProvider.DefaultCookieName, cookieValue);

        // 你的业务逻辑写在这里,完全复用
        return View();
    }
}

方式2:优雅的本地化路由配置

如果想更规范,用ASP.NET Core的官方本地化中间件,结合资源文件管理路由:

第一步:配置本地化服务

在Program.cs(.NET 6+)里添加本地化配置:

var builder = WebApplication.CreateBuilder(args);

// 添加本地化服务,指定资源文件路径
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

// 配置支持的语言
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("tr-TR"),
        new CultureInfo("en-US")
    };
    options.DefaultRequestCulture = new RequestCulture("tr-TR");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;
});

var app = builder.Build();

// 启用本地化中间件
app.UseRequestLocalization();

第二步:创建路由资源文件

在项目根目录新建Resources文件夹,添加两个资源文件:

  • CertificateController.tr.resx:添加键RoutePath,值为/Sertifika
  • CertificateController.en.resx:添加键RoutePath,值为/Certificate

第三步:绑定本地化路由

在Controller里注入IStringLocalizer,统一处理路由:

public class CertificateController : Controller
{
    private readonly IStringLocalizer<CertificateController> _localizer;

    public CertificateController(IStringLocalizer<CertificateController> localizer)
    {
        _localizer = localizer;
    }

    // 匹配两个语言路径,统一指向同一个Action
    [Route("{*path}", Constraints = new { path = @"^(Sertifika|Certificate)$" })]
    public IActionResult Index()
    {
        // 根据当前文化渲染对应内容
        ViewBag.PageTitle = _localizer["CertificatePageTitle"];
        return View();
    }
}
针对Laravel(PHP)的解决方案

如果是Laravel项目,用官方的本地化路由就能轻松实现:

第一步:配置支持的语言

修改config/app.php:

'locale' => 'tr',
'fallback_locale' => 'en',
'supported_locales' => ['tr', 'en'],

第二步:创建路由语言文件

在resources/lang/tr/下新建routes.php:

return [
    'certificate' => '/Sertifika',
];

在resources/lang/en/下新建routes.php:

return [
    'certificate' => '/Certificate',
];

第三步:绑定同一个控制器方法

在routes/web.php里添加:

// 土耳其语路由
Route::get(__('routes.certificate'), [CertificateController::class, 'index'])->name('certificate.tr');

// 英语路由
Route::get(__('routes.certificate'), [CertificateController::class, 'index'])->name('certificate.en');

然后可以加个中间件,访问不同路径时自动切换语言:

// 自定义中间件示例
public function handle(Request $request, Closure $next)
{
    if ($request->is('Certificate')) {
        App::setLocale('en');
    } elseif ($request->is('Sertifika')) {
        App::setLocale('tr');
    }
    return $next($request);
}
通用核心思路

不管用什么框架,本质都是这两点:

  • 给同一个业务方法绑定多个语言对应的URL路由
  • 确保访问不同URL时自动切换到对应的语言环境(用Cookie、会话或路由参数都可以)

这样既不用重复写Action,又能实现不同语言下的友好URL。

内容的提问来源于stack exchange,提问作者Arif YILMAZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:08:55