English is the neutral and fallback language for the packages. Icelandic resources are included under the neutral is culture, so both is and regional cultures such as is-IS resolve to Icelandic. Other cultures fall back to English.
Provider-neutral DTO properties use System.ComponentModel.DataAnnotations.DisplayAttribute with resources from DevOp.ERP.Localization.ModelDisplayNames. UI frameworks can therefore obtain a localized field label without changing JSON property names or API contracts.
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Reflection;
using DevOp.ERP.Models;
CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo("is-IS");
var property = typeof(Product).GetProperty(nameof(Product.ItemCode))!;
var label = property.GetCustomAttribute<DisplayAttribute>()!.GetName();
// Vörunúmer
Console.WriteLine(label);
Both packages share the one resource class DevOp.ERP.Localization.ModelDisplayNames (English neutral plus Icelandic is). The DK Plus subtypes and nested types (DkPlusCustomer, DkPlusVendor, DkPlusProduct, DkPlusProject, DkPlusEmployee, the sales-document subtypes, WorkRequest, the customer, vendor, product, and project settings objects) declare [Display] attributes against the same resource, so a UI can label DkPlusCustomer.VatExempt ("VAT exempt" / "Undanþegið VSK") or ReceivablesAccount exactly as it labels a portable property. Request types do not all declare labels. Enum members are not localized; JSON and CLI output print the C# member name.
Since 0.4.0 the ObjectDate member (the time DK Plus stored the record, separate from Modified, the dkERP modification time) is labelled "Stored Date" in English and "Vistað dags." in Icelandic on every model that carries it, and the general-ledger create requests added labels such as "Sum reference" / "Samtölutilvísun", "Reverse account" / "Mótlykill", and "Percentage of VAT" / "Hlutfall af VSK". CLI get tables show a "Stored Date" row (an English table label). See Upgrading to 0.4.
Applications should set CultureInfo.CurrentUICulture for the current request, user, or execution scope. Do not mutate process-wide culture concurrently for different tenants. ASP.NET Core applications should use their request-localization configuration.
AsString() is intended for compact selector and display values. It contains record data and is not translated:
var product = new Product
{
ItemCode = "P-1",
Description = "Example product"
};
Console.WriteLine(product.AsString()); // Example product (P-1)
Field labels such as Item code or Vörunúmer are localized separately through DisplayAttribute. This keeps user data unchanged across cultures.
DkPlusClientOptions.AcceptLanguage controls the language requested from the DK Plus API. When it is not supplied, the client follows CultureInfo.CurrentUICulture; invariant culture falls back to English. The HTTP client also adds English as a lower-priority fallback when the preferred language is not English.
The CLI reads DKPLUS_ACCEPT_LANGUAGE first and then the stored language setting before Cocona builds the command application. It applies the selected culture to all four .NET culture entry points:
CultureInfo.CurrentCultureCultureInfo.CurrentUICultureCultureInfo.DefaultThreadCurrentCultureCultureInfo.DefaultThreadCurrentUICultureThe neutral is value is normalized to is-IS, while is-IS is used directly. English regional cultures are also honored. Missing, invalid, or currently unsupported UI cultures fall back safely to English during startup; normal configuration validation still reports a syntactically invalid value when a command loads the effective configuration.
Interactive tables use the selected culture for numbers and dates, and translate boolean values as Yes/No or Já/Nei. JSON output remains culture-independent so scripts receive stable values.
devop-dk config language is-IS
devop-dk config set language icelandic
devop-dk company show
The aliases icelandic, íslenska, and islenska are normalized to is-IS; english is normalized to en. The language change takes effect immediately for the config command and is applied at startup for later invocations. The same normalized value continues to control the API Accept-Language header with English fallback.